it-swarm.com.de

Debuggen von Google Apps Script (Wo wird Logger.log protokolliert?)

In Google Sheets können Sie einige Skriptfunktionen hinzufügen. Ich füge etwas für das onEdit-Ereignis hinzu, aber ich kann nicht sagen, ob es funktioniert. Soweit ich das beurteilen kann, können Sie ein Live-Ereignis nicht von Google Sheets aus debuggen. Sie müssen es also vom Debugger aus tun, was sinnlos ist, da das Ereignisargument, das an meine onEdit()-Funktion übergeben wird, immer undefiniert ist, wenn ich es ausführe das Script Editor.

Also habe ich versucht, die Logger.log-Methode zu verwenden, um einige Daten zu protokollieren, wenn die onEdit-Funktion aufgerufen wird. Dies scheint jedoch nur zu funktionieren, wenn sie von Script Editor ausgeführt wird. Wenn ich es von Script Editor aus laufe, kann ich die Protokolle einsehen, indem ich zu View->Logs... gehe.

Ich hatte gehofft, dass ich die Protokolle ab dem Zeitpunkt der Ausführung des Ereignisses sehen kann, aber ich kann es nicht verstehen.

Wie debugge ich das Zeug?

91
Markus Orreilly

UPDATE:

Wie in this answer geschrieben,


Logger.log Sendet Ihnen entweder (eventuell) eine E-Mail mit Fehlern, die in Ihren Skripten aufgetreten sind, oder Sie können das Protokoll der zuletzt ausgeführten Funktion anzeigen, wenn Sie Dinge aus Script Editor Ausführen indem Sie zu View->Logs gehen (immer noch im Skripteditor). Auch hier wird nur alles angezeigt, was von der zuletzt ausgeführten Funktion innerhalb von Script Editor protokolliert wurde.

Das Skript, mit dem ich arbeiten wollte, hatte mit Tabellenkalkulationen zu tun - ich habe eine Tabellenkalkulation erstellt, um Elemente nach Prioritäten und dergleichen zu sortieren.

Die einzigen Trigger, die ich für dieses Skript installiert habe, waren die Trigger onOpen und onEdit. Das Debuggen des onEdit-Triggers war am schwierigsten, da ich immer wieder daran dachte, dass mein Haltepunkt ausgelöst wird, wenn ich in meiner onEdit-Funktion einen Haltepunkt setze, die Tabelle öffne und eine Zelle bearbeite. Das ist nicht der Fall.

Um zu simulieren, dass ich eine Zelle bearbeitet habe, muss ich did allerdings etwas in der eigentlichen Tabelle tun. Alles, was ich getan habe, war sicherzustellen, dass die Zelle, die ich als "bearbeitet" behandeln wollte, ausgewählt wurde. Dann ging ich in Script Editor Zu Run->onEdit. Dann wäre mein Haltepunkt erreicht.

Ich musste jedoch aufhören, das Ereignisargument zu verwenden, das an die onEdit-Funktion übergeben wird - Sie können dies nicht simulieren, indem Sie Run->onEdit Ausführen. Alle Informationen, die ich aus der Tabelle benötigte, z. B. welche Zelle ausgewählt wurde usw., musste ich manuell herausfinden.

Wie auch immer, lange Antwort, aber ich habe es schließlich herausgefunden.


[~ # ~] edit [~ # ~] :

Wenn Sie die von mir erstellte ToDo-Checkliste sehen möchten, können Sie hier nachlesen

(Ja, ich weiß, jeder kann es bearbeiten - das ist der Grund, warum man es teilt!)

Ich hatte gehofft, dass Sie damit auch das Drehbuch sehen können. Da Sie es dort nicht sehen können, ist es hier:

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();
};
74
Markus Orreilly

Soweit ich das beurteilen kann, können Sie ein Live-Ereignis nicht von Google-Dokumenten debuggen. Sie müssen es also vom Debugger aus tun, was sinnlos ist, da das an meine Funktion onEdit () übergebene Ereignisargument beim Ausführen immer undefiniert ist es aus dem Skript-Editor.

True - Definieren Sie das Ereignisargument selbst für das Debugging. Siehe Wie kann ich eine Triggerfunktion in GAS testen?

Ich habe versucht, die Logger.log-Methode zu verwenden, um einige Daten zu protokollieren, wenn die onEdit-Funktion aufgerufen wird. Dies scheint jedoch nur zu funktionieren, wenn sie vom Skript-Editor aus ausgeführt wird. Wenn ich es aus dem Skript-Editor heraus ausführe, kann ich die Protokolle anzeigen, indem Sie auf Ansicht-> Protokolle gehen.

Wieder richtig, aber es gibt Hilfe. Peter Hermanns BetterLog-Bibliothek leitet alle Protokolle in eine Kalkulationstabelle um und ermöglicht die Protokollierung auch von Code, der nicht an eine Instanz des Editors/Debuggers angehängt ist. 

Wenn Sie beispielsweise in einem in einer Kalkulationstabelle enthaltenen Skript codieren, können Sie nur diese eine Zeile oben in Ihre Skriptdatei einfügen. Alle Protokolle werden in der Tabelle "Protokolle" in der Tabelle "Protokolle" angezeigt. Es ist kein anderer Code erforderlich, verwenden Sie einfach Logger.log() wie gewöhnlich:

Logger = BetterLog.useSpreadsheet();
29
Mogsdad

2017-Update:Stackdriver-Protokollierung ist jetzt für Google Apps Script verfügbar. Gehen Sie in der Menüleiste des Skript-Editors zu: View > Stackdriver Logging, um die Protokolle anzuzeigen oder zu streamen.

console.log () schreibt Meldungen auf DEBUG-Ebene

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

Überprüfen Sie dann die Protokolle in der Stackdriver-Benutzeroberfläche mit der Bezeichnung onEdit() Event Object, um die Ausgabe zu sehen

11
random-parts

Wenn Sie den Skript-Editor geöffnet haben, werden die Protokolle unter Ansicht-> Protokolle angezeigt. Wenn Ihr Skript einen onedit-Trigger hat, nehmen Sie eine Änderung an der Tabelle vor, die die Funktion auslösen soll, wobei der Skripteditor auf einer zweiten Registerkarte geöffnet wird. Gehen Sie dann zum Skripteditor und öffnen Sie das Protokoll. Sie sehen, was immer Ihre Funktion an den Logger weitergibt.

Solange der Skripteditor geöffnet ist, schreibt das Ereignis in das Protokoll und zeigt es für Sie an. Es wird nicht angezeigt, wenn sich jemand anders in der Datei befindet.

5
Karl_S

Ein bisschen hackig, aber ich habe ein Array mit dem Namen "console" erstellt, und ich wollte jedes Mal, wenn ich es auf die Konsole ausgeben wollte, auf das Array schieben. Wann immer ich die tatsächliche Ausgabe sehen wollte, habe ich nur console zurückgegeben, anstatt was ich zuvor zurückgegeben hatte.

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

Ich habe das gleiche Problem, ich habe das irgendwo im Web gefunden ....

Event-Handler in Docs sind jedoch etwas knifflig. Da Dokumente mehrere gleichzeitige Bearbeitungen durch mehrere Benutzer verarbeiten können, werden die Ereignishandler serverseitig behandelt. Das Hauptproblem bei dieser Struktur ist, dass ein Ereignisauslöserskript auf dem Server fehlschlägt. Wenn Sie die Debug-Informationen anzeigen möchten, müssen Sie im Trigger-Menü einen expliziten Auslöser einrichten, der Ihnen die Debug-Informationen per E-Mail sendet, wenn das Ereignis fehlschlägt.

3
Angus Keenan

Es ist alles andere als elegant, aber während des Debuggens logge ich mich oft in den Logger ein und benutze dann getLog () , um dessen Inhalt abzurufen. Dann habe ich entweder:

  • speichern Sie die Ergebnisse in einer Variablen (die im Google Scripts-Debugger eingesehen werden kann). Dies funktioniert in Fällen, in denen ich keinen Haltepunkt in einem Code festlegen kann, aber ich kann einen in einem Code festlegen kann wird später ausgeführt)
  • schreiben Sie es in ein temporäres DOM-Element
  • zeige es in einem alert an

Im Grunde wird es nur ein JavaScript-Ausgabe Problem.

Es fehlen die Funktionen moderner console.log() -Implementierungen, aber der Logger hilft trotzdem beim Debuggen von Google Scripts.

1
Michael Scheper

Derzeit sind Sie auf die Container-gebundene Natur der Verwendung von Skripts in Docs beschränkt. Wenn Sie ein neues Skript außerhalb von docs erstellen, können Sie Informationen in eine Google-Tabelle exportieren und wie ein Protokollierungswerkzeug verwenden.

Zum Beispiel in Ihrem ersten Codeblock

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

Wenn ich mit GAS arbeite, habe ich zwei Monitore (Sie können zwei Fenster verwenden), wobei einer mit der GAS-Umgebung und der andere mit der SS eingerichtet ist, damit ich Informationen schreiben und protokollieren kann.

0
JForgie

Nur als Hinweis. Ich habe eine Testfunktion für meine Tabelle erstellt. Ich verwende die Variable google throws in der onEdit (e) -Funktion (ich nannte es e). Dann habe ich eine Testfunktion wie folgt gemacht:

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

Wenn Sie diese Testfunktion aufrufen, wird der gesamte Code ausgeführt, als hätten Sie ein Ereignis in der Kalkulationstabelle. Ich habe gerade den Besitz der Zelle eingefügt, die ich editiert habe, was mir ein unerwartetes Ergebnis brachte und den Wert als den Wert festlegte, den ich in die Zelle stelle. OBS! für weitere Variablen gibt googles die Funktion hier: https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events

0

Die Entwicklerkonsole protokolliert Fehler, die vom App-Skript ausgegeben werden. Sie können also einfach eine Fehlermeldung ausgeben, um sie als normales console.log protokollieren zu lassen. Die Ausführung wird angehalten, kann jedoch für das schrittweise Debuggen nützlich sein.

throw Error('hello world!');

wird in der Konsole ähnlich wie console.log('hello world') angezeigt

0
qwerty

debuggen Sie Ihren Tabellencode einfach so:

...
throw whatAmI;
...

zeigt so:

 enter image description here

0
Toskan