Comment déboguer le Script Googleapps (alias where does Logger.journal le journal?)

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 ça marche. Pour autant que je sache, vous ne pouvez pas déboguer un événement en direct à partir de Google Sheets, donc vous devez le faire à partir du débogueur, ce qui est inutile puisque l'argument d'événement passé à ma fonction onEdit() ne sera toujours pas défini si je l'exécute à partir du Script Editor .

donc, j'ai essayé d'utiliser la méthode Logger.log pour les données à chaque fois que la fonction onEdit est appelée, mais cela aussi semble comme si cela ne fonctionne que lorsqu'il est exécuté à partir du Script Editor . Quand je l'exécute à partir du Script Editor , je peux voir les logs en allant à View->Logs...

j'espérais que je pourrais voir les logs de quand l'événement est réellement exécuté, mais je ne peux pas le comprendre.

Comment puis-je déboguer ce truc?

83
demandé sur Kos 2012-07-18 14:35:42

10 réponses

Logger.log va soit vous envoyer un e-mail (éventuellement) des erreurs qui se sont produites dans vos scripts, ou, si vous exécutez des choses à partir du Script Editor , vous pouvez voir le journal de la dernière fonction d'exécution 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 lancée depuis Script Editor .

le script que j'essayais de faire marcher avait à voir avec feuilles de calcul - j'ai fait une feuille de calcul à faire-chose de type liste de contrôle qui a trié les éléments par priorités et tels.

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 a été le plus difficile à comprendre, parce que je n'arrêtais pas de penser que si je mettais un point de rupture dans ma fonction onEdit, que j'ouvrais le tableur, que je modifiais une cellule, que mon point de rupture serait déclenché. Ce n'est pas le cas.

pour simuler ayant édité une cellule, je a fait finir par avoir à faire quelque chose dans la feuille de calcul réelle cependant. Tout ce que j'ai fait était de m'assurer que la cellule que je voulais qu'il traite comme "édité" a été sélectionné, puis dans Script Editor , je voudrais passer à Run->onEdit . Alors mon point de rupture serait touché.

cependant, j'ai dû arrêter d'utiliser l'argument d'é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 de la tableur, comme quelle cellule a été sélectionnée, etc, j'ai dû comprendre manuellement.

de toute façon, longue réponse, mais je l'ai finalement compris.


modifier :

si vous voulez voir la liste de contrôle todo que j'ai fait, vous pouvez vérifier ici

(Oui, je sais que n'importe qui peut l'éditer - c'est le but de le partager!)

j'espérais que ça te permettrait de voir le script aussi. Puisque vous ne pouvez pas le voir là, 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();
};
58
répondu Markus Orreilly 2015-06-05 11:18:35

autant que je puisse dire, vous ne pouvez pas déboguer un événement en direct depuis google docs, donc vous devez le faire depuis le débogueur, ce qui est inutile puisque l'argument d'événement passé à ma fonction onEdit() sera toujours non défini si je l'exécute depuis l'éditeur de Script.

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

j'étais essayez d'utiliser l'Enregistreur.méthode de journalisation pour enregistrer certaines données à chaque fois que la fonction onEdit est appelée, mais il semble que cela ne fonctionne que lorsqu'il est exécuté à partir de L'éditeur de Script. Quand je l'exécute à partir de L'éditeur de Script, je peux voir les logs en allant sur View->Logs...

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

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

Logger = BetterLog.useSpreadsheet();
29
répondu Mogsdad 2017-05-23 12:18:21

2017 Mise à jour: Stackdriver Logging est maintenant disponible pour Googleapps Script. De la barre de menu dans l'éditeur de script, goto: View > Stackdriver Logging pour visualiser ou diffuser les logs.

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

exemple onEdit() logging:

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 L'interface utilisateur de Stackdriver étiqueté onEdit() Event Object pour voir la sortie

6
répondu random-parts 2017-10-21 21:25:21

si vous avez l'éditeur de script ouvert, vous verrez les logs sous View->Logs. Si votre script a un déclencheur onedit, faites une modification au tableur qui devrait déclencher la fonction avec l'éditeur de script ouvert dans un second onglet. Puis allez à l'onglet script editor et ouvrez le journal. Vous verrez ce que votre fonction passe à l'enregistreur.

essentiellement aussi longtemps que l'éditeur de script est ouvert, l'événement écrira dans le journal et le montrera pour vous. Il ne sera pas montrer si quelqu'un d'autre est dans le fichier ailleurs.

5
répondu Karl_S 2016-09-28 12:51:30

un peu hacky, mais j'ai créé un tableau appelé" console", et chaque fois que je voulais sortir pour la console j'ai poussé sur le tableau. Puis chaque fois que je voulais voir la sortie réelle, j'ai juste retourné console au lieu de ce que je retournais avant.

    //return 'console' //uncomment to output console
    return "actual output";
}
4
répondu woojoo666 2014-05-24 09:11:52

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

les gestionnaires D'événements en Docs sont un peu difficiles cependant. Parce que docs peut gérer plusieurs éditions simultanées par plusieurs utilisateurs, les gestionnaires d'événements sont gérés côté serveur. Le problème majeur avec cette structure est que lorsqu'un script de déclenchement d'événement échoue, il échoue sur le serveur. Si vous voulez voir les informations de débogage, vous aurez besoin de configurer un déclencheur explicite sous le menu des déclencheurs qui vous envoie un e-mail. l'information de débogage quand l'événement échoue ou sinon il échouera silencieusement.

3
répondu Angus Keenan 2012-08-07 13:06:29

c'est loin d'être élégant, mais pendant le débogage, je me connecte souvent à L'enregistreur, puis j'utilise getLog () pour récupérer son contenu. Puis, je soit:

  • sauvegardez les résultats dans une variable (qui peut être inspectée dans le débogueur de Scripts Google-cela fonctionne autour des cas où je ne peux pas définir un point de rupture dans un code, mais je can définir un code qui est exécuté plus tard)
  • Ecrivez-le à un temporaire Élément DOM
  • l'afficher dans un alerte

essentiellement, il devient un sortie JavaScript question.

il manque grossièrement la fonctionnalité de la moderne console.log() mises en œuvre, mais L'enregistreur ne aide toujours pas debug Scripts Google.

1
répondu Michael Scheper 2015-08-18 15:36:18

Actuellement, vous êtes confiné à la nature liée au conteneur de l'utilisation de scripts dans docs. Si vous créez un nouveau script en dehors de docs, vous pourrez exporter des informations vers une feuille de calcul 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);

quand je travaille avec du gaz, j'ai deux moniteurs (vous pouvez utiliser deux fenêtres ) installés avec l'un contenant l'environnement du gaz et l'autre contenant le SS pour que je puisse écrire des informations et me connecter.

0
répondu JForgie 2014-11-25 16:45:41

comme un avertissement. J'ai fait une fonction de test pour ma feuille de calcul. J'utilise la variable google lance dans la fonction onEdit(e) (je l'ai appelée e). Puis j'ai fait 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())
}

appeler cette fonction de test fait courir tout le code comme vous aviez un événement dans le tableur. Je viens de mettre dans la possession de la cellule que j'ai édité whitch m'a donné un résultat inattendu, mettant la valeur comme la valeur que j'ai mis dans la cellule. OBS! pour plus de variables googles donne à la fonction va ici: https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events

0
répondu Meltinglava Outland 2016-03-26 11:40:46

la console dev va enregistrer les erreurs lancées par le script de l'application, donc vous pouvez juste lancer une erreur pour l'enregistrer comme une console normale.journal. Cela arrêtera l'exécution, mais cela pourrait être utile pour déboguer étape par étape.

throw Error('hello world!');

apparaîtra dans la console de la même manière que console.log('hello world')

0
répondu qwerty 2018-01-15 13:54:20