167 votes

Comment déboguer Google Apps script (aka where does Logger.log log log to ?)

Dans Google Sheets, il est possible d'ajouter des fonctionnalités de script. J'ajoute quelque chose pour le onEdit mais je n'arrive pas à savoir si cela fonctionne. Pour autant que je sache, il n'est pas possible de déboguer un événement en direct à partir de Google Sheets, il faut donc le faire à partir du débogueur, ce qui est inutile puisque l'argument de l'événement transmis à mon fichier onEdit() sera toujours indéfinie si je l'exécute à partir de la fonction Script Editor .

J'ai donc essayé d'utiliser la fonction Logger.log pour enregistrer des données chaque fois que la méthode onEdit est appelée, mais il semble que cette fonction ne fonctionne que lorsqu'elle est exécutée à partir de l'application Script Editor . Lorsque je l'exécute à partir du Script Editor Je peux consulter les journaux en allant à l'adresse suivante View->Logs...

J'espérais pouvoir voir les journaux à partir du moment où l'événement est exécuté, mais je n'y arrive pas.

Comment déboguer ce genre de choses ?

94voto

Markus Orreilly Points 555

UPDATE :

Comme écrit dans cette répondre,


Logger.log vous enverra un email (éventuellement) des erreurs qui se sont produites dans vos scripts, ou, si vous exécutez les choses à partir de l'application Script Editor Vous pouvez consulter le journal de la dernière exécution de la fonction en vous rendant à l'adresse suivante View->Logs (toujours dans l'éditeur script). Encore une fois, cela ne vous montrera que ce qui a été enregistré à partir de la dernière fonction que vous avez exécutée de l'intérieur Script Editor .

Le script que j'essayais de faire fonctionner avait un rapport avec les feuilles de calcul - j'ai créé une feuille de calcul de type todo-checklist qui trie les éléments par priorité et ainsi de suite.

Les seuls déclencheurs que j'ai installés pour ce script sont les déclencheurs onOpen et onEdit. Le débogage du déclencheur onEdit a été le plus difficile à comprendre, car je pensais que si je mettais un point d'arrêt dans ma fonction onEdit, que j'ouvrais la feuille de calcul, que je modifiais une cellule, mon point d'arrêt serait déclenché. Ce n'est pas le cas.

Pour simuler l'édition d'une cellule, je a fait Cependant, je finirai par devoir faire quelque chose dans la feuille de calcul proprement dite. Tout ce que j'ai fait, c'est de m'assurer que la cellule que je voulais qu'il traite comme "éditée" était sélectionnée, puis dans Script Editor Je me rendrais à Run->onEdit . Mon point d'arrêt serait alors atteint.

Cependant, j'ai dû arrêter d'utiliser l'argument de l'événement qui est passé dans la fonction onEdit - vous ne pouvez pas simuler cela en faisant Run->onEdit . Toutes les informations dont j'avais besoin à partir de la feuille de calcul, comme la cellule sélectionnée, etc.

Quoi qu'il en soit, la réponse est longue, mais j'ai fini par comprendre.


EDIT :

Si vous souhaitez consulter la liste de contrôle que j'ai établie, vous pouvez le faire en cliquant sur le lien suivant à vérifier ici

(oui, je sais que tout le monde peut le modifier - c'est l'intérêt de le partager !)

J'espérais que cela vous permettrait de voir le script également. Puisque vous ne pouvez pas le voir, le voici :

function onOpen() {
  setCheckboxes();
};

function setCheckboxes() {
  var checklist = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("checklist");
  var checklist_data_range = checklist.getDataRange();
  var checklist_num_rows = checklist_data_range.getNumRows();
  Logger.log("checklist num rows: " + checklist_num_rows);

  var coredata = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("core_data");
  var coredata_data_range = coredata.getDataRange();

  for(var i = 0 ; i < checklist_num_rows-1; i++) {
    var split = checklist_data_range.getCell(i+2, 3).getValue().split(" || ");
    var item_id = split[split.length - 1];
    if(item_id != "") {
      item_id = parseInt(item_id);
      Logger.log("setting value at ("+(i+2)+",2) to " + coredata_data_range.getCell(item_id+1, 3).getValue());
      checklist_data_range.getCell(i+2,2).setValue(coredata_data_range.getCell(item_id+1, 3).getValue());
    }
  }
}

function onEdit() {
  Logger.log("TESTING TESTING ON EDIT");
  var active_sheet = SpreadsheetApp.getActiveSheet();
  if(active_sheet.getName() == "checklist") {
    var active_range = SpreadsheetApp.getActiveSheet().getActiveRange();
    Logger.log("active_range: " + active_range);
    Logger.log("active range col: " + active_range.getColumn() + "active range row: " + active_range.getRow());
    Logger.log("active_range.value: " + active_range.getCell(1, 1).getValue());
    Logger.log("active_range. colidx: " + active_range.getColumnIndex());
    if(active_range.getCell(1,1).getValue() == "?" || active_range.getCell(1,1).getValue() == "?") {
      Logger.log("made it!");
      var next_cell = active_sheet.getRange(active_range.getRow(), active_range.getColumn()+1, 1, 1).getCell(1,1);
      var val = next_cell.getValue();
      Logger.log("val: " + val);
      var splits = val.split(" || ");
      var item_id = splits[splits.length-1];
      Logger.log("item_id: " + item_id);

      var core_data = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("core_data");
      var sheet_data_range = core_data.getDataRange();
      var num_rows = sheet_data_range.getNumRows();
      var sheet_values = sheet_data_range.getValues();
      Logger.log("num_rows: " + num_rows);

      for(var i = 0; i < num_rows; i++) {
        Logger.log("sheet_values[" + (i) + "][" + (8) + "] = " + sheet_values[i][8]);
        if(sheet_values[i][8] == item_id) {
          Logger.log("found it! tyring to set it...");
          sheet_data_range.getCell(i+1, 2+1).setValue(active_range.getCell(1,1).getValue());
        }
      }

    }
  }

  setCheckboxes();
};

34voto

Mogsdad Points 11078

Pour autant que je sache, on ne peut pas déboguer un événement en direct à partir de google docs, il faut donc le faire à partir du débogueur, ce qui est inutile puisque l'argument de l'événement passé à ma fonction onEdit() sera toujours indéfini si je l'exécute à partir de l'éditeur script.

Vrai - définissez donc vous-même l'argument de l'événement pour le débogage. Voir Comment puis-je tester une fonction de déclenchement dans GAS ?

J'ai essayé d'utiliser la méthode Logger.log pour enregistrer des données à chaque fois que la fonction onEdit est appelée, mais il semble que cela ne fonctionne que lorsque l'éditeur script est utilisé. Lorsque je l'exécute depuis l'éditeur script, je peux voir les logs en allant dans View->Logs...

C'est vrai, mais il y a de l'aide. Peter Hermann's Bibliothèque BetterLog redirige tous les journaux vers une feuille de calcul, ce qui permet d'enregistrer même le code qui n'est pas attaché à une instance de l'éditeur / débogueur.

Si vous codez dans un script contenu dans un tableur, par exemple, vous pouvez ajouter cette seule ligne au début de votre fichier script, et tous les journaux iront dans une feuille "Logs" dans le tableur. Aucun autre code n'est nécessaire, il suffit d'utiliser Logger.log() comme vous le feriez habituellement :

Logger = BetterLog.useSpreadsheet();

28voto

random-parts Points 1621

Mise à jour 2017 : Enregistrement Stackdriver est désormais disponible pour Google Apps script. Dans la barre de menu de l'éditeur script, allez à : View > Stackdriver Logging pour afficher ou diffuser les journaux.

console.log() écrira DEBUG messages de niveau

Exemple onEdit() l'exploitation forestière :

function onEdit (e) {
  var debug_e = {
    authMode:  e.authMode,  
    range:  e.range.getA1Notation(),    
    source:  e.source.getId(),
    user:  e.user,   
    value:  e.value,
    oldValue: e. oldValue
  }

  console.log({message: 'onEdit() Event Object', eventObject: debug_e});
}

Vérifiez ensuite les journaux dans le L'interface utilisateur de Stackdriver étiqueté onEdit() Event Object pour voir le résultat

25voto

Benjamin Points 798

J'ai parcouru ces messages et j'ai fini par trouver une réponse simple, que je publie ici à l'intention de ceux qui souhaitent des solutions courtes et précises :

  1. Utilisation console.log("Hello World") dans votre script.
  2. Aller à https://script.google.com/home/my et sélectionnez votre module complémentaire.
  3. Cliquez sur le menu ellipse dans Détails du projet, sélectionnez Exécutions.

enter image description here

  1. Cliquez sur l'en-tête de la dernière exécution et lisez le journal.

enter image description here

5voto

Karl_S Points 2305

Si vous avez l'éditeur script ouvert, vous verrez les logs sous View->Logs. Si votre script a un déclencheur onedit, apportez une modification à la feuille de calcul qui devrait déclencher la fonction avec l'éditeur script ouvert dans un second onglet. Allez ensuite dans l'onglet de l'éditeur script et ouvrez le journal. Vous verrez ce que votre fonction transmet au logger.

En fait, tant que l'éditeur script est ouvert, l'événement écrira dans le journal et l'affichera pour vous. Il ne s'affichera pas si quelqu'un d'autre se trouve dans le fichier ailleurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X