web-dev-qa-db-fra.com

Comment déboguer un script Google Apps (alias Où se connecte Logger.log?)

Dans Google Sheets, vous pouvez ajouter des fonctionnalités de script. J'ajoute quelque chose pour l'événement onEdit, mais je ne peux pas dire si cela fonctionne. Autant que je sache, vous ne pouvez pas déboguer un événement en direct à partir de Google Sheets. Vous devez donc le faire à partir du débogueur, ce qui est inutile, car l'argument d'événement transmis à ma fonction onEdit() sera toujours indéfini si je l'exécute. le Script Editor.

J'essayais donc d'utiliser la méthode Logger.log pour consigner des données chaque fois que la fonction onEdit est appelée, mais cela semble aussi fonctionner uniquement à l'exécution du Script Editor. Lorsque je l'exécute à partir de Script Editor, je peux afficher les journaux en allant à View->Logs...

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

Comment déboguer ce produit?

91
Markus Orreilly

METTRE À JOUR: 

Comme écrit dans this answer, 


Logger.log vous enverra un courrier électronique (éventuellement) des erreurs survenues dans vos scripts ou, si vous exécutez des opérations à partir du Script Editor, vous pouvez afficher le journal de la dernière fonction exécutée en allant à View->Logs (toujours dans l'éditeur de script). . Encore une fois, cela ne vous montrera que tout ce qui a été enregistré depuis la dernière fonction que vous avez exécutée depuis Script Editor.

Le scénario que j'essayais de faire concernait les feuilles de calcul: j'ai créé une feuille de calcul contenant des éléments de liste de contrôle qui triait les éléments par priorité, etc.

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

Pour simuler la modification d'une cellule, je (ai} _ finis par devoir faire quelque chose dans le tableur. Tout ce que je faisais était de m'assurer que la cellule que je voulais traiter comme "modifiée" était sélectionnée, puis dans Script Editor, je passerais à Run->onEdit. Ensuite, mon point d'arrêt serait touché.

Cependant, j'ai dû cesser d'utiliser l'argument d'événement transmis à la fonction onEdit - vous ne pouvez pas simuler cela en faisant Run->onEdit. Toutes les informations dont j'avais besoin dans la feuille de calcul, telle que la cellule sélectionnée, etc., devaient être résolues manuellement.

Quoi qu'il en soit, réponse longue, mais j'ai finalement compris.


MODIFIER:

Si vous voulez voir la liste de contrôle que j'ai faite, vous pouvez consultez-la ici

(oui, je sais que tout le monde peut le modifier - c'est le point de le partager!)

J'espérais que cela vous permettrait également de voir le script. Puisque vous ne pouvez pas le voir là-bas, 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();
};
67
Markus Orreilly

Autant que je sache, vous ne pouvez pas déboguer un événement en direct à partir de Google Docs. Vous devez donc le faire à partir du débogueur, ce qui est inutile car l'argument d'événement transmis à ma fonction onEdit () sera toujours indéfini si j'exécute il de l'éditeur de script.

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

J'essayais d'utiliser la méthode Logger.log pour consigner des données chaque fois que la fonction onEdit est appelée, mais cela semble aussi ne fonctionner que si elle est exécutée à partir de l'éditeur de script. Quand je le lance à partir de l'éditeur de script, je peux voir les journaux en allant dans View-> Logs ...

C'est encore vrai, mais il y a de l'aide. La bibliothèque BetterLog de Peter Hermann redirige tous les journaux vers une feuille de calcul, ce qui permet la journalisation même à partir de code qui n'est pas attaché à une instance de l'éditeur/du débogueur. 

Si vous codez dans un script contenant une feuille de calcul, par exemple, vous ne pouvez ajouter que cette ligne en haut de votre fichier de script, et tous les journaux seront placés dans une feuille "Journaux" dans la feuille de calcul. Aucun autre code nécessaire, utilisez simplement Logger.log() comme vous le feriez habituellement:

Logger = BetterLog.useSpreadsheet();
29
Mogsdad

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

console.log () écrira des messages de niveau DEBUG

Exemple de journalisation onEdit():

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});
}

Puis vérifiez les journaux dans Stackdriver UI étiquetés onEdit() Event Object pour voir le résultat.

11
random-parts

Si l'éditeur de script est ouvert, vous verrez les journaux sous View-> Logs. Si votre script a un déclencheur onedit, modifiez la feuille de calcul afin de déclencher la fonction avec l'éditeur de script ouvert dans un deuxième onglet. Ensuite, allez dans l’éditeur de script et ouvrez le journal. Vous verrez quelle que soit votre fonction passe à l'enregistreur.

Fondamentalement, tant que l'éditeur de script est ouvert, l'événement écrit dans le journal et l'affiche à votre place. Cela ne montrera pas si quelqu'un d'autre est dans le fichier ailleurs.

5
Karl_S

Un petit hacky, mais j'ai créé un tableau appelé "console", et chaque fois que je voulais sortir sur console, je poussais vers le tableau. Ensuite, chaque fois que je voulais voir la sortie réelle, je retournais juste console au lieu de ce que je retournais auparavant.

    //return 'console' //uncomment to output console
    return "actual output";
}
5
woojoo666

J'ai le même problème, j'ai trouvé le dessous sur le web quelque part ....

Les gestionnaires d’événements dans Docs sont toutefois un peu difficiles. Étant donné que docs peut gérer plusieurs modifications simultanées effectuées par plusieurs utilisateurs, les gestionnaires d'événements sont gérés côté serveur. Le problème majeur de cette structure est que lorsqu'un script de déclenchement d'événement échoue, il échoue sur le serveur. Si vous souhaitez voir les informations de débogage, vous devez configurer un déclencheur explicite dans le menu des déclencheurs qui vous envoie par courrier électronique les informations de débogage lorsque l'événement échoue, sinon il échouera en silence.

3
Angus Keenan

C'est loin d'être élégant, mais lors du débogage, je me connecte souvent au consignateur, puis j'utilise getLog () pour en extraire le contenu. Ensuite, j'ai soit:

  • enregistrer les résultats dans une variable (qui peut être inspectée dans le débogueur Google Scripts; cela évite les cas où je ne peux pas définir de point d'arrêt dans un code mais que je peux en définir un dans un code exécuté ultérieurement)
  • l'écrire dans un élément temporaire du DOM
  • l'afficher dans une alerte alerte

Essentiellement, il s'agit simplement d'un sortie JavaScript problème.

Il manque cruellement aux fonctionnalités des implémentations console.log() modernes, mais le Logger permet toujours de déboguer Google Scripts.

1
Michael Scheper

Actuellement, vous êtes limité à la nature liée au conteneur de l'utilisation de scripts dans docs. Si vous créez un nouveau script dans un environnement autre que docs, vous pourrez exporter les informations vers un tableur Google et les utiliser comme un outil de journalisation.

Par exemple dans votre premier bloc de code

function setCheckboxes() {

    // Add your spreadsheet data
    var errorSheet = SpreadsheetApp.openById('EnterSpreadSheetIDHere').getSheetByName('EnterSheetNameHere');
    var cell = errorSheet.getRange('A1').offset(errorSheet.getLastRow(),0);

    // existing code
    var checklist = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("checklist");
    var checklist_data_range = checklist.getDataRange();
    var checklist_num_rows = checklist_data_range.getNumRows();

    // existing logger
    Logger.log("checklist num rows: " + checklist_num_rows);

   //We can pass the information to the sheet using cell.setValue()
    cell.setValue(new Date() + "Checklist num rows: " + checklist_num_rows);

Lorsque je travaille avec GAS, j'ai deux moniteurs (vous pouvez utiliser deux fenêtres) configurés avec l'un contenant l'environnement GAS et l'autre contenant le SS afin que je puisse écrire des informations et me connecter.

0
JForgie

Juste comme un avis. J'ai créé une fonction de test pour ma feuille de calcul. J'utilise la variable google jette dans la fonction onEdit (e) (je l'ai appelée e). Puis j'ai créé une fonction de test comme ceci:

function test(){
var testRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(GetItemInfoSheetName).getRange(2,7)
var testObject = {
    range:testRange,
    value:"someValue"
}
onEdit(testObject)
SpreadsheetApp.getActiveSpreadsheet().getSheetByName(GetItemInfoSheetName).getRange(2,6).setValue(Logger.getLog())
}

L'appel de cette fonction de test permet d'exécuter tout le code comme si vous aviez un événement dans la feuille de calcul. Je viens de mettre dans la composition de la cellule que j'ai édité qui m'a donné un résultat inattendu, en définissant la valeur comme la valeur que j'ai mis dans la cellule. OBS! pour plus de variables googles donne à la fonction allez ici: https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events

0

La console dev enregistre les erreurs générées par le script d'application. Vous pouvez donc simplement générer une erreur pour le consigner en tant que fichier console.log normal. Cela arrêtera l'exécution, mais cela peut toujours être utile pour un débogage étape par étape.

throw Error('hello world!');

s'affichera dans la console de la même manière que console.log('hello world')

0
qwerty

il suffit de déboguer votre code de feuille de calcul comme ceci:

...
throw whatAmI;
...

montre comme ça:

 enter image description here

0
Toskan