Accélérer l'exécution d'une Macro
Bonjour à tous,
Je sollicite votre aide aujourd'hui car dans le but d'optimiser la facturation dans mon entreprise, j'ai intégrer une macro pour collecter les informations dans un onglet facture pour les copier/coller dans un onglet Récapitulatif Facture.
La macro fonctionne correctement mais le délais est assez long. J'ai vu qu'il existait des solutions pour accélérer son exécution mais je ne sait comment le mettre en place dans mon script.
Vous trouverez une copie du fichier par le biais de ce lien : https://docs.google.com/spreadsheets/d/1tzWxEVT8A3kRr0zsg_9SfJ0hDZNAYNDYNrPfneKi7JI/edit?usp=sharing
Ainsi que le script de de la macro en question :
function VALIDERNEW() {
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.getRange('B18:C18').activate();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('2023'), true);
spreadsheet.getRange('5:5').activate();
spreadsheet.getActiveSheet().insertRowsBefore(spreadsheet.getActiveRange().getRow(), 1);
spreadsheet.getActiveRange().offset(0, 0, 1, spreadsheet.getActiveRange().getNumColumns()).activate();
spreadsheet.getRange('A5').activate();
spreadsheet.getRange('\'Facture Type\'!B18:C18').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
spreadsheet.getRange('B5').activate();
spreadsheet.getRange('\'Facture Type\'!B18:C18').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Facture Type'), true);
spreadsheet.getRange('N19:O19').activate();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('2023'), true);
spreadsheet.getRange('C5').activate();
spreadsheet.getRange('\'Facture Type\'!N19:O19').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Facture Type'), true);
spreadsheet.getRange('D18').activate();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('2023'), true);
spreadsheet.getRange('D5').activate();
spreadsheet.getRange('\'Facture Type\'!D18').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Facture Type'), true);
spreadsheet.getRange('I8').activate();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('2023'), true);
spreadsheet.getRange('E5').activate();
spreadsheet.getRange('\'Facture Type\'!I8').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Facture Type'), true);
spreadsheet.getRange('N13').activate();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('2023'), true);
spreadsheet.getRange('F5').activate();
spreadsheet.getRange('\'Facture Type\'!N13').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Facture Type'), true);
spreadsheet.getRange('N16').activate();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('2023'), true);
spreadsheet.getRange('G5').activate();
spreadsheet.getRange('\'Facture Type\'!N16').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Facture Type'), true);
spreadsheet.getRange('O13').activate();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('2023'), true);
spreadsheet.getRange('H5').activate();
spreadsheet.getRange('\'Facture Type\'!O13').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Facture Type'), true);
spreadsheet.getRange('O16').activate();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('2023'), true);
spreadsheet.getRange('L5').activate();
spreadsheet.getRange('\'Facture Type\'!O16').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Facture Type'), true);
spreadsheet.getRange('D20').activate();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('2023'), true);
spreadsheet.getRange('M5').activate();
spreadsheet.getRange('\'Facture Type\'!D20').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Facture Type'), true);
spreadsheet.getRange('K38').activate();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('2023'), true);
spreadsheet.getRange('R5').activate();
spreadsheet.getRange('\'Facture Type\'!K38').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Facture Type'), true);
spreadsheet.getRange('K43').activate();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('2023'), true);
spreadsheet.getRange('S5').activate();
spreadsheet.getRange('\'Facture Type\'!K43').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
spreadsheet.getRange('P5').activate();
spreadsheet.getCurrentCell().setFormula('=R5*T4');
spreadsheet.getRange('Q5').activate();
spreadsheet.getCurrentCell().setFormula('=S5*T4');
spreadsheet.getRange('Q6').activate();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Facture Type'), true);
spreadsheet.duplicateActiveSheet();
};
PS : la dernière étape de cette macro va dupliquer mon onglet "Facture Type" mais je n'ai pas trouvé la solution dans ma macro pour renommer ce nouvel onglet par le teste contenu dans la cellule D18 si jamais vous avez une solution je suis preneur !
Je reste à dispo si besoin au 0622066429
Bonne journée,
Bonjour,
De ce que je vois, il semble possible de faire une boucle, car il y a des récurrences :
spreadsheet.getRange('A5').activate();
spreadsheet.getRange('B5').activate();
spreadsheet.getRange('C5').activate();
Il faudrait faire votre script pour une facture, voir les points récurrents, l'intervalle entre ceux-ci.
Ensuite, vous créez une variable qui est le début de vos données, une qui est la fin de celle-ci.
Puis, vous faites une boucle qui débute au début, ajoute l'intervalle et qui se termine à la fin.
Bonjour Monsieur Lepiney,
Je vous remercie pour ce rapide retour, malheureusement étant novice en Macro Google Sheet je n'ai pas exactement compris votre réponse...
Bien cordialement,
Hadrien
En effet, Google App script est dérivé sur JavaScript et nécessite donc un apprentissage.
Pouvez-vous faire une macro sur une seule de vos lignes de facture ? je testerais ensuite de faire une boucle à partir de cette fonction.
Concernant le nom de l'onglet, c'est ce bout de code qui le gère :
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Facture Type'), true);
spreadsheet.duplicateActiveSheet();Je crois qu'ajoute .setname() permet d'attribuer un nom, en récupérant le N° de facture dans une variable il est possible de régler ça.