Récupération du temps d'exécution d'un script
Bonsoir le forum,
J'ai écrit un script pour créer des fiches produits au format pdf, ayant plus de 500 fiches à 12/13 secondes d'exécution par fiche, j'explose bien gentiment les 30mn auxquels j'ai droit.
J'aimerais récupérer le temps d'exécution du script que donne le rapport d'exécution et ainsi le mettre dans une petite macro qui se chargera de relancer la macro de création via un petit trigger si le temps d'exécution est de 30mn (avec évidement la vérification que tout mes documents ne sont pas terminer, pour la relance).
Sachant que j'ai essayant en récupérant l'heure de début de lancement et la fin de création de fiche ainsi par différence j'obtiens un temps mais qui n'est pas de 30mn et qui en plus n'est pas constant.
Donc ma condition de 30mn n'est pas atteinte.
Je sais que ça doit être tout bête et je pressents qu'une fois la solution exposée je vais m'énerver de pas avoir trouver.
Merci de votre précieuse aide
Bonjour,
let hDebut = new Date().getTime();
... votre script ...
let hFin = new Date().getTime();
Logger.log(hFin-hDebut)
Merci pour vos retours.
J'ai vue l'article il me faut m'abonner, ce faire payer une extension super pratique pour tout le monde c'est niet alors l'abonnement pour moi tout seul ^^
Je vais donc essayer la première solution proposée, qui en effet mise sur le début et la fin sont plus logique que basé sur la création de mon dernier document qui intervient avant la fin des 30 mn mais qui ne se termine pas justement à cause de l'arrêt forcé du script et le temps récupéré ne correspond donc pas.
Je teste et je reviens.
C'est une seule exécution qui dure 30 min ? Ou vous avez 30 min pour réaliser tous vos scripts ?
Il est sans doute possible d'optimiser votre script.
> remplacez un maximum de variable par des constantes.
> limitez les boucles for, while si vous devez en faire, tentez de faire un filtre (avec un if par ex) afin de ne pas boucler sur des données inutiles. + au lieu de traiter ligne par ligne, cellule par cellule, mettez vos données dans une liste.
Alors en fait c'est un seul script qui traite bien (à ce jour 548 lignes de 28 colonnes).
pour faire simple j'ouvre un template GDoc, je copie dedans mes données, je convertis en pdf, je recommence.
Je crois (sans affirmer) que mon code est déjà optimisé.
Chaque boucle dure entre 13 et 16 secondes et je n'y coupe pas. S'il y a moyen d'optimiser au moins cette pertie je suis preneur même si ce n'est pas ma question initiale.
function Creationinitiale(){
//Définir les variables fixes
var Qualif = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Qualifications");
var Config = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Configuration");
Config.getRange("E8").setValue(new Date());
var Template = DriveApp.getFileById(Config.getRange('B2').getValue());
//var Dligne = Config.getRange('B3').getValue();
var DlignePDF = Config.getRange('B4').getValue();
var Trash = DriveApp.getFolderById(Config.getRange('B6').getValue());
var date = Config.getRange('B7').getValue();
var Donnees = Qualif.getDataRange().getValues();
var IDPDF = Qualif.getRange("AK1:AK");
//Edité tous les nouveaux pdf à la date du jour
for (i = DlignePDF-1 ; i <= Donnees.length ; i++){
Config.getRange("E9").setValue(new Date());
var Titre = "Synthèse "+Donnees[i][6]+" au "+date;
var Folder = DriveApp.getFolderById(Donnees[i][37]);
//GDoc
var TemplateId = Template.makeCopy(Titre,Trash).getId();
var TemplateDoc = DocumentApp.openById(TemplateId);
var TemplateBody = TemplateDoc.getBody();
TemplateBody.replaceText("{{Domaine}}" , Donnees[i][1]);
TemplateBody.replaceText("{{Champ}}" , Donnees[i][2]);
TemplateBody.replaceText("{{Code Qualification}}" , Donnees[i][6]);
TemplateBody.replaceText("{{Libele}}" , Donnees[i][8]);
TemplateBody.replaceText("{{Prerequi}}" , Donnees[i][10]);
TemplateBody.replaceText("{{Formation1}}" , Donnees[i][11]);
TemplateBody.replaceText("{{Formation2}}" , Donnees[i][12]);
TemplateBody.replaceText("{{Formation3}}" , Donnees[i][13]);
TemplateBody.replaceText("{{Formation4}}" , Donnees[i][14]);
TemplateBody.replaceText("{{Formation5}}" , Donnees[i][15]);
TemplateBody.replaceText("{{FormationCampuS}}" , Donnees[i][16]);
TemplateBody.replaceText("{{ParcoursS}}" , Donnees[i][17]);
TemplateBody.replaceText("{{ParcoursA}}" ,Donnees[i][18]);
TemplateBody.replaceText("{{Certification}}" , Donnees[i][19]);
TemplateBody.replaceText("{{Habilitation1}}" , Donnees[i][20]);
TemplateBody.replaceText("{{Habilitation2}}" , Donnees[i][21]);
TemplateBody.replaceText("{{Habilitation3}}" , Donnees[i][22]);
TemplateBody.replaceText("{{Habilitation4}}" , Donnees[i][23]);
TemplateBody.replaceText("{{Habilitation5}}" , Donnees[i][24]);
TemplateBody.replaceText("{{Habilitation6}}" , Donnees[i][25]);
TemplateBody.replaceText("{{FormationN}}" , Donnees[i][26]);
TemplateBody.replaceText("{{ParcoursSSup}}" , Donnees[i][27]);
TemplateBody.replaceText("{{ParcoursASup}}" , Donnees[i][28]);
TemplateBody.replaceText("{{Vision}}" , Donnees[i][29]);
TemplateBody.replaceText("{{Critere}}" , Donnees[i][30]);
TemplateBody.replaceText("{{Relecture}}" , Donnees[i][31]);
TemplateBody.replaceText("{{Supervision}}" , Donnees[i][32]);
TemplateBody.replaceText("{{Periodicite}}" , Donnees[i][33]);
TemplateDoc.saveAndClose();
//PDF
//IDPDF.getCell(i+2, 1).setValue(TemplateDoc); //file
var Blob =TemplateDoc.getBlob();
var PDF = Folder.createFile(Blob).getId();
IDPDF.getCell(i+1, 1).setValue(PDF); //file
Config.getRange("E9").setValue(new Date());
SpreadsheetApp.flush()
}
}j'ai aussi une bout de création de lien hypertexte mais il y a une restriction sur le forum.
Bonjour,
Vous pouvez remplacer certaines variables par des consentes : var > const
Il y a beaucoup de ligne replaceText, peut être qu'une liste peut vous faire gagner du temps :
const champsTxt = [
"{{Domaine}}",
"{{Champ}}",
"{{Code Qualification}}",
"{{Libele}}",
"{{Prerequi}}",
"{{Formation1}}",
"{{Formation2}}",
"{{Formation3}}",
"{{Formation4}}",
"{{Formation5}}",
"{{FormationCampuS}}",
"{{ParcoursS}}",
"{{ParcoursA}}",
"{{Certification}}",
"{{Habilitation1}}",
"{{Habilitation2}}",
"{{Habilitation3}}",
"{{Habilitation4}}",
"{{Habilitation5}}",
"{{Habilitation6}}",
"{{FormationN}}",
"{{ParcoursSSup}}",
"{{ParcoursASup}}",
"{{Vision}}",
"{{Critere}}",
"{{Relecture}}",
"{{Supervision}}",
"{{Periodicite}}"
];
let TemplateId = Template.makeCopy(Titre, Trash).getId();
let TemplateDoc = DocumentApp.openById(TemplateId);
let TemplateBody = TemplateDoc.getBody();
let rowData = Donnees[i];
for (var j = 0; j < champsTxt.length; j++) {
TemplateBody.replaceText(champsTxt[j], rowData[j + 1]);
}
TemplateDoc.saveAndClose();Concernant votre problématique, si vous devez faire 500 pages, à voir si l'utilisation d'un template sous G-Sheet ne serait pas plus rapide ? Si vous avez la template sur le même fichier que votre script je pense que vous pouvez gagner du temps.
Bonjour,
Merci pour votre retour, je vais tester/appliquer cette solution pour un autre projet du même genre mais appliquer à un seul doc, le script actuel tourne bien et je le lance en fin de journée, quand personne ne travaille dessus.
J'ai contourné le problème, avec 3 captures d'heure, un décompte de pdf et une formule si() qui me sort "En cours", "Relance" et "Stop".
J'ai un trigger toutes les 5 minutes, qui lance un bout de script qui vérifie le statut "En cours", "Relance" et "Stop".
Quand c'est sur stop il ne lance pas la production de pdf, quand c'est en cours, c'est que le script et déjà en cours de production donc il ne relance pas le script et quand il est sur relance, ça veut dire que le code ne tourne plus mais que la production n'est pas fini donc de relancer le script.
Le script tourne ainsi presque 2 heures sans intervention de ma part.
Si ma solution intéresse des gens, je peux la mettre ici.