15
votes

"Journaux" très lents avec Google Apps Script V8 vs Rhino?

Avec Rhino, la boîte de dialogue Journaux ("commande + Entrée" ou Journaux depuis le menu Affichage) affiche instantanément les journaux. Cependant, avec les projets de test utilisant le moteur V8, il faut 10 à 20 secondes pour charger même les journaux les plus simples, avec un message "En attente de journaux, veuillez patienter ..."

Les deux, "Logger.log" ou "console.log" sont lents à charger les journaux. Quelqu'un d'autre connaît-il le même type de lenteur? Est-ce prévu avec le nouveau moteur?

Merci d'avance!

Voici une fonction de base que j'ai utilisée pour tester:

function logTest() {
 Logger.log("log test");
}


0 commentaires

5 Réponses :


6
votes

J'ai remarqué la même chose et il y a déjà un problème à ce sujet.

J'ai utilisé le script ci-dessous. Ce n'est probablement pas à l'épreuve des balles, mais pour moi, c'est mieux que d'attendre le journal. Je remarque également que si vous rencontrez une erreur et que vous accédez à Afficher les exécutions, les journaux semblent sortir maintenant avant même que nous les obtenions dans l'éditeur de script.

Lien du problème: https://issuetracker.google.com/issues/149519063

function MyLogger(s,d=true,w=800,h=400,t=5) {
  const cs=CacheService.getScriptCache();
  const cached=cs.get("Logger");
  const ts=Utilities.formatDate(new Date(), SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "MM|dd|HH:mm:ss")
  if(cached) {
    var v=Utilities.formatString('%s<br />[%s] - %s',cached,ts,s);   
  }else{
    var v=Utilities.formatString('[%s] - %s',ts,s);
  }
  cs.put("Logger",v,t);
  //allows logging without displaying.
  if(d) {
    const a='<br /><input type="button" value="Exit" onClick="google.script.host.close();" />';
    const b='<br /><input type="button" value="Exit" onClick="google.script.host.close();" /><br />';
    SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput(b+v+a).setWidth(w).setHeight(h), 'My Logger');
  }
}

Une autre version de MyLogger ():

function MyLogger(s,t=5) {
  const cs=CacheService.getScriptCache();
  const cached=cs.get("Logger");
  const ts=Utilities.formatDate(new Date(), SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "yy/MM/dd HH:mm:ss")
  if(cached) {
    var v=Utilities.formatString('%s<br />[%s] - %s',cached,ts,s);   
  }else{
    var v=Utilities.formatString('[%s] - %s',ts,s);
  }
  cs.put("Logger",v,t);
  SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput(v), 'My Logger');
}


3 commentaires

Pour ajouter à cela, j'ai trouvé plus rapide de recevoir des lignes de journal par e-mail que d'attendre les journaux. Je ne pense pas non plus qu'ils régleront jamais le problème.


C'est un outil important pour que google google le néglige depuis si longtemps ... Que se passe-t-il? Est-ce que cela a à voir avec les rumeurs sur la sortie d'un nouvel IDE de script d'application?


@Cooper Je ne sais pas comment utiliser votre enregistreur personnalisé. Cela pourrait être une alternative viable pour le moment.



4
votes

une autre approche simple pour un enregistreur personnalisé (pour les feuilles) est de définir cette fonction pour écrire dans une feuille 'journal'

log(1,0,2,"a","b", "etc")

et étant donné une feuille appelée journal, il ajoutera des arguments dans les cellules d'une nouvelle ligne, lorsqu'il sera appelé comme

const log=(...items)=>{
  SpreadsheetApp.getActive().getSheetByName("log").appendRow(items)
}

a également l'avantage de créer un journal lorsqu'il est appelé via l'exécution d'une application Web (qui ne semblait pas invoquer Logger de manière récupérable, pour autant que je sache).


0 commentaires

2
votes

J'ai fait quelques modifications au code @blueSkys

Edit 1: Ajout d'une disposition pour obtenir également des tableaux

 const log=(...data)=>{
 for (i=0; i< data.length;i++){
  if(typeof data[i] === 'object'){
  data[i] = data[i].join("//");
};
};
data.unshift(new Date());
  SpreadsheetApp.openById('1E9s2vI21eRlcnoqaVAF4wCUm4Ojn2Lpv62TM6Xw17Z4').getSheetByName('log').appendRow(data);
}

Vidéo également créée pour un guide détaillé

https://youtu.be/JQpbB5lR4eY

Merci


0 commentaires

0
votes

Merci pour la perspicacité, le code ci-dessous fonctionne bien dans GAS:

/**
 * @description Class: Logger helper, writes log information to tab sheet 'log' for the active spreadsheet 
 * @tutorial https://stackoverflow.com/questions/24342748/why-does-console-log-say-undefined-and-then-the-correct-value
 * @param N/A
 * @return {Object}
 */
class ConsoleX {
  constructor(){
    this.setSS('**** Log Initialized ****');
    this.timeStart = 0;
    this.timerBase = {};
  };
  
  log(...data){
    let dataY = '';
    data.forEach(c => {
      dataY += c;
    })
    this.setSS(`${[dataY]}`);
    Logger.log(`${[dataY]}`);
  };
  
  setSS(data){
    data = [data];
    data.unshift(new Date());
    SpreadsheetApp.getActive().getSheetByName(logFileName).appendRow(data);
  };
  
  getLogs(dataX){
    this.setSS(`${[dataX]}\n${Logger.getLog()}`);
  }

  time(data = 'base1'){
    let dateX = new Date();
    this.timerBase[data] = dateX.getTime();
  };
  
  timeEnd(data = 'base1'){
    let dateX = new Date();
   this.log(`${data}: ${(dateX.getTime() - this.timerBase[data])/1000}(ms)`);
  
  };
  
  clear() {
  SpreadsheetApp.getActive().getSheetByName(logFileName).clear({contentsOnly: true});
}
  
};// END ConsoleX


/**
 * @description Function: Test logging methods 
 * @tutorial https://stackoverflow.com/questions/24342748/why-does-console-log-say-undefined-and-then-the-correct-value
 * @param AS PER METHOD
 * @return {undefine}
 */
function testLog(){
  let testdata = {name:'hello', value:'world'};
  Logger.log('From Logger: ', testdata);
  test = new ConsoleX();
  test.time('**** Time')
  test.log('**** Standard Log: HELLO WORLD');
  test.log('**** Templating Log: THIS IS GOOD: ', 10*10, ` and ${100/2}`);
  test.getLogs('**** Logger Historical Data: Looking Good :)');
  test.getLogs();
  test.timeEnd('**** Time')
};

function testClear(){
  test = new ConsoleX();
  test.clear();

};

entrez la description de l'image ici


0 commentaires

0
votes

La fonction suivante a fait l'affaire pour moi ... rapide et sale:

    function logOut(message){
      var ui = SpreadsheetApp.getUi();
      var html  = HtmlService.createHtmlOutput('<h1>'+message+'</h1>');
      ui.showModalDialog(html,'Logs');
    }

Il crée une fenêtre contextuelle montrant ce qui serait autrement affiché via Logger.log (message)


0 commentaires