Macro google sheet

Bonjour,

J'ai commencé à réaliser une macro sur sheet (enregistrement auto), je souhaiterai automatiser la création d'un nouveau projet sur une même feuille.

Ma macro fonctionne mais je souhaiterai qu'elle commence à partir de la ligne 3 sur la dernière colonne vide.

Pourriez-vous m'aider?

function NPP4() {

var spreadsheet = SpreadsheetApp.getActive(); spreadsheet.setActiveSheet(spreadsheet.getSheetByName('PROJET'), true);

spreadsheet.getCurrentCell().offset(0, -6, 18, 6).copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_FORMAT, false); spreadsheet.getCurrentCell().offset(0, -6, 18, 6).copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_DATA_VALIDATION, false); spreadsheet.getCurrentCell().offset(0, -6, 18, 6).copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_CONDITIONAL_FORMATTING, false);

spreadsheet.getCurrentCell().offset(0, 0, 1, 6).activate() .setFormulaR1C1('=YEAR(TODAY())&"-"&TEXT(MID(R[0]C[-6];6;1)+1;"0")'); spreadsheet.getCurrentCell().offset(0, 0, 1, 6).activate() .mergeAcross(); spreadsheet.getActiveRangeList().setHorizontalAlignment('center') .setBorder(true, null, null, null, null, null, '#000000', SpreadsheetApp.BorderStyle.SOLID_THICK) .setFontFamily(null);

Bonjour,

peux-tu mettre un lien vers une copie de ton fichier ? https://www.sheets-pratique.com/fr/cours/partage

merci

Bonjour,

Voici: https://docs.google.com/spreadsheets/d/1JUma59tmK2JPl_zI209vaElVBC2niJ1HQkcdlWXi9EQ/copy

La macro est effectué sur la feuille projet.

J'ai un peu allégé l'écriture !

function NPP4() {
  var doc = SpreadsheetApp.getActive();
  doc.setActiveSheet(doc.getSheetByName('PROJET'), true);

  var f=doc.getSheetByName('PROJET')
  f.setActiveSelection(f.getRange(3,f.getLastColumn()+6,1,1))

  doc.getCurrentCell().offset(0, -6, 18, 6).copyTo(doc.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_FORMAT, false);
  doc.getCurrentCell().offset(0, -6, 18, 6).copyTo(doc.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_DATA_VALIDATION, false);
  doc.getCurrentCell().offset(0, -6, 18, 6).copyTo(doc.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_CONDITIONAL_FORMATTING, false);

  doc.getCurrentCell().offset(0, 0, 1, 6).setFormulaR1C1('=YEAR(TODAY())&"-"&TEXT(MID(R[0]C[-6];6;1)+1;"0")');
  doc.getCurrentCell().offset(0, 0, 1, 6).mergeAcross();
  doc.getActiveRangeList()
    .setHorizontalAlignment('center')
    .setBorder(true, null, null, null, null, null, '#000000', SpreadsheetApp.BorderStyle.SOLID_THICK)
    .setFontFamily(null);

};

mais, avec les cellules fusionnées, je ne suis pas sûr du résultat une fois les colonnes renseignées, donc à tester

le problème est que cette fonction donne-t-elle le début de la cellule fusionnée ou celle qui serait remplie plus bas ?? je n'ai pas fait l'essai

f.getLastColumn()

Merci pour ton aide!

Malheureusement ca ne fonctionne pas voici ce que j'obtiens

sans titre

Je souhaiterai quand utilisant un bouton pour lancer la macro celle-ci aille directement à la dernière colonne vide de la ligne 3, en l'occurrence pour cette exemple faire le copier coller du tableau en I3 pour le projet 2021-2 puis de nouveau relancer la macro avec le bouton directement en o3 pour le 2021-3 et ainsi de suite

L'essai fait fonctionnait, mais comme j'avais dit, le fait de travailler avec des cellules fusionnées fait que la recherche de la dernière colonne est sujette à mise au point. Dans ton cas tu devais avoir des valeurs alors que le fichier reçu était vide.

Je vais reprendre avec un calcul de modulo pour à tous les coups tomber sur a bonne cellule

j'ai ajouté une correction sur le calcul de la dernière colonne

col=Math.floor((col+3)/6)*6+3
function NPP4() {
  var doc = SpreadsheetApp.getActive();
  doc.setActiveSheet(doc.getSheetByName('PROJET'), true);

  var f=doc.getSheetByName('PROJET')
  var col = f.getLastColumn()
  col=Math.floor((col+3)/6)*6+3
  f.setActiveSelection(f.getRange(3,col,1,1))

  doc.getCurrentCell().offset(0, -6, 18, 6).copyTo(doc.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_FORMAT, false);
  doc.getCurrentCell().offset(0, -6, 18, 6).copyTo(doc.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_DATA_VALIDATION, false);
  doc.getCurrentCell().offset(0, -6, 18, 6).copyTo(doc.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_CONDITIONAL_FORMATTING, false);

  doc.getCurrentCell().offset(0, 0, 1, 6).setFormulaR1C1('=YEAR(TODAY())&"-"&TEXT(MID(R[0]C[-6];6;1)+1;"0")');
  doc.getCurrentCell().offset(0, 0, 1, 6).mergeAcross();
  doc.getActiveRangeList()
    .setHorizontalAlignment('center')
    .setBorder(true, null, null, null, null, null, '#000000', SpreadsheetApp.BorderStyle.SOLID_THICK)
    .setFontFamily(null);

};

C'est parfait ca fonctionne très bien!!! Merci beaucoup!

Puis-je te demander un dernier conseil il me reste une macro à réaliser:

En cliquant sur un bouton "nouveaux devis" la macro m'ajoute le nouveau numéro de devis sur la première ligne vide de la colonne A Feuille "DEVIS/FACTURE", je n'arrive pas à faire la macro même avec l'enregistrement, cela ne me donne pas le bon résultat.

https://docs.google.com/spreadsheets/d/1JUma59tmK2JPl_zI209vaElVBC2niJ1HQkcdlWXi9EQ/copy

function nouveauDevis(){
  var classeur = SpreadsheetApp.getActiveSpreadsheet();
  var feuille = classeur.getSheetByName('DEVIS/FACTURE');
  var ligne = getLastDataRow(feuille)
  var devis = feuille.getRange('A'+ligne).getValue()
  var regExp = new RegExp("([0-9]+)", "g");
  var nouveau = regExp.exec(devis)[0]*1 + 1
  feuille.getRange('A'+(ligne+1)).setValue('D'+nouveau)
}

function getLastDataRow(sheet) {
  var lastRow = sheet.getLastRow();
  var range = sheet.getRange("A" + lastRow);
  if (range.getValue() !== "") {
    return lastRow;
  } else {
    return range.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
  }              
}

Tout fonctionne merci pour votre aide!

Parfait !

N'oublie pas de clore ce fil de discussion en cliquant sur

Rechercher des sujets similaires à "macro google sheet"