So debuggen Sie Google Apps Script (auch bekannt als, wo meldet sich Logger.log an?)

128

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

Also habe ich versucht, die Logger.logMethode zu verwenden, um einige Daten zu protokollieren, wenn die onEditFunktion aufgerufen wird, aber auch dies scheint nur zu funktionieren, wenn es von der ausgeführt wird Script Editor. Wenn ich es von der aus Script Editorstarte, kann ich die Protokolle anzeigen, indem ich zu geheView->Logs...

Ich hatte gehofft, dass ich die Protokolle sehen kann, wenn das Ereignis tatsächlich ausgeführt wird, aber ich kann es nicht herausfinden.

Wie debugge ich dieses Zeug?

d0c_s4vage
quelle
3
Gleiches Problem hier - akzeptierte Antwort beantwortet es nicht, gibt aber viele einfach falsche Informationen.
Hippyjim
Es scheint, als hätten sie das jetzt behoben. Solange Sie den Skript-Editor in Ihrer Tabelle öffnen, lassen Sie diese Registerkarte geöffnet, wenn Sie das Material in Ihrem Blatt ausführen. Kehren Sie dann zur Registerkarte "Skript" zurück, in der die Protokollierungsinformationen enthalten sind.
Phreakhead
2
tldr; Kopieren, Einfügen und AusführenLogger.log('firstLog');MailApp.sendEmail({to:'[email protected]',subject: "subject here ^_^",body: Logger.getLog()});
Coty Embry
Vielleicht sollten Sie die akzeptierte Antwort ändern oder einen Hinweis hinzufügen, dass die Stackdriver-Protokollierung verfügbar ist.
Botenvouwer

Antworten:

83

AKTUALISIEREN:

Wie in dieser Antwort geschrieben,


Logger.logSie erhalten entweder (eventuell) eine E-Mail mit Fehlern, die in Ihren Skripten aufgetreten sind, oder Script EditorSie können das Protokoll der letzten Ausführungsfunktion anzeigen, indem Sie auf View->Logs(noch im Skripteditor) gehen. Auch dies zeigt Ihnen nur alles an, was von der letzten Funktion protokolliert wurde, die Sie von innen ausgeführt habenScript Editor .

Das Skript, mit dem ich arbeiten wollte, hatte mit Tabellenkalkulationen zu tun. Ich habe eine Tabellenkalkulations-Checkliste erstellt, in der Elemente nach Prioritäten und dergleichen sortiert wurden.

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 herauszufinden, da ich immer wieder dachte, wenn ich in meiner onEdit-Funktion einen Haltepunkt setze, die Tabelle öffne und eine Zelle bearbeite, würde mein Haltepunkt ausgelöst. Das ist nicht der Fall.

Um zu simulieren, dass ich eine Zelle bearbeitet habe, musste ich 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 war, und dann Script Editorging ich zu Run->onEdit. Dann würde mein Haltepunkt getroffen werden.

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

Wie auch immer, lange Antwort, aber ich habe es irgendwann herausgefunden.


EDIT :

Wenn Sie die von mir erstellte ToDo-Checkliste sehen möchten, können Sie sie hier überprüfen

(Ja, ich weiß, dass jeder es bearbeiten kann - das ist der Grund, es zu teilen!)

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();
};
d0c_s4vage
quelle
Pff, Protokollierung wird nur in Mail sichtbar sein? Das macht all diese Debugging- und Protokollierungsfunktionen nutzlos, da wir effektiv keine realen Daten aus der Tabelle verwenden können.
MrFox
Nein. Wie der Autor sagte, ist die Protokollierung im Protokoll verfügbar (Skript-Editor, Ansicht, Protokoll oder Strg-Eingabe)
rainabba
9
@rainabba Ja, die Protokollierung ist im Skript-Editor verfügbar. Wenn ein Skript jedoch vom Ereignisargument abhängt und das Ereignisargument im Skripteditor nicht verfügbar ist, bedeutet dies effektiv, dass die Entwickler dieser Skripttypen keine Echtzeitmethode für den Zugriff auf die Protokolle haben.
Jeff
1
Ich konnte vorher keinen Kommentar abgeben, daher habe ich unten eine Antwort gegeben, aber: Wenn Sie den Skripteditor geöffnet haben und SIE ein Ereignis in der geöffneten Tabelle auslösen, können Sie zur Browserinstanz des Skripteditors zurückkehren und die Informationen in den Protokollen anzeigen . Es funktioniert gut, solange Sie nichts unter einem Benutzer testen müssen, der das Skript nicht öffnen kann oder unter dem Sie sich nicht anmelden können.
Karl_S
1
Diese Antwort ist veraltet und sollte nicht als akzeptierte Antwort angesehen werden. Stackdriver Logging ist verfügbar und funktioniert wie ein Zauber. Schauen Sie sich die Antwort auf zufällige Teile an!
Botenvouwer
34

Soweit ich das beurteilen kann, können Sie ein Live-Ereignis nicht über Google Docs debuggen. Sie müssen dies daher über den Debugger tun. Dies ist sinnlos, da das an meine Funktion onEdit () übergebene Ereignisargument bei der Ausführung immer undefiniert ist es aus dem Skript-Editor.

True - Definieren Sie das Ereignisargument für das Debuggen selbst. 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, aber auch dies scheint nur zu funktionieren, wenn sie über den Skript-Editor ausgeführt wird. Wenn ich es über den Skript-Editor ausführe, kann ich die Protokolle anzeigen, indem ich auf Ansicht-> Protokolle gehe ...

Wieder wahr, aber es gibt Hilfe. Die BetterLog-Bibliothek von Peter Hermann leitet alle Protokolle in eine Tabelle 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 Tabelle enthaltenen Skript codieren, können Sie nur diese eine Zeile oben in Ihre Skriptdatei einfügen, und alle Protokolle werden in eine Tabelle "Protokolle" in der Tabelle eingefügt. Kein anderer Code erforderlich, verwenden Logger.log()Sie ihn wie gewohnt:

Logger = BetterLog.useSpreadsheet();
Mogsdad
quelle
1
Veraltet. console.log()sollte jetzt die beste Antwort sein
TheMaster
22

Update 2017: Die Stackdriver-Protokollierung ist jetzt für Google Apps Script verfügbar. Gehen Sie in der Menüleiste des Skript-Editors zu: View > Stackdriver LoggingZum Anzeigen oder Streamen der Protokolle.

console.log () schreibt DEBUGLevel-Nachrichten

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

Dann überprüfen Sie die Protokolle in den Stackdriver UI markierte onEdit() Event Objectdie Ausgabe zu sehen

zufällige Teile
quelle
Die ursprüngliche Frage fragt speziell nach Logger.log. Wie unterscheidet sich das von dem, console.logwas Sie verwenden? Ich bin sehr neu in den Tools und versuche nur herauszufinden, was alles ist.
AnnanFay
5

Ein bisschen hacky, aber ich habe ein Array namens "console" erstellt, und wann immer ich auf die Konsole ausgeben wollte, habe ich auf das Array verschoben. Wann immer ich dann die tatsächliche Ausgabe sehen wollte, kehrte ich einfach zurück, consoleanstatt zu dem, was ich zuvor zurückgegeben hatte.

    //return 'console' //uncomment to output console
    return "actual output";
}
woojoo666
quelle
in js console.log('smth')funktioniert perfekt, aber wie wäre es mit GAS?
Igor Savinkin
1
console.log funktioniert nicht einfach, weil GAS keine Skripte sind, die auf derselben Webseite wie Ihre Tabelle ausgeführt werden. Es handelt sich um Skripte, die von der Google App Engine verarbeitet werden. Sie müssen also dem unhandlichen Logger.log-Debugger folgen oder einen Hack wie meinen verwenden
woojoo666
Wie wäre es mit Ihrer Array-Konsole? Wann I just returned consolewie geben Sie es aus?
Igor Savinkin
2
Entschuldigung, ich habe es nicht sehr gut erklärt, aber im Wesentlichen geben Tabellenkalkulationsfunktionen den Wert an die Zelle zurück. Wenn Sie also Ihre "Konsole" zurückgeben, sehen Sie alles, was Sie in Ihrer Tabellenkalkulationszelle protokolliert haben
woojoo666
5

Wenn Sie den Skripteditor geöffnet haben, sehen Sie die Protokolle unter Ansicht-> Protokolle. Wenn Ihr Skript über einen Onedit-Trigger verfügt, nehmen Sie eine Änderung an der Tabelle vor, die die Funktion mit dem in einer zweiten Registerkarte geöffneten Skripteditor auslösen soll. Gehen Sie dann zur Registerkarte Skripteditor und öffnen Sie das Protokoll. Sie sehen, was auch immer Ihre Funktion an den Logger übergibt.

Grundsätzlich schreibt das Ereignis, solange der Skripteditor geöffnet ist, in das Protokoll und zeigt es für Sie an. Es wird nicht angezeigt, ob sich jemand anderes in der Datei befindet.

Karl_S
quelle
5

Ich habe diese Beiträge durchgesehen und irgendwie eine einfache Antwort gefunden, die ich hier für diejenigen poste, die kurze und süße Lösungen wollen:

  1. Verwenden Sie console.log("Hello World")in Ihrem Skript.
  2. Gehen Sie zu https://script.google.com/home/my und wählen Sie Ihr Add-On aus.
  3. Klicken Sie in den Projektdetails auf das Auslassungsmenü und wählen Sie Ausführungen.

Geben Sie hier die Bildbeschreibung ein

  1. Klicken Sie auf die Kopfzeile der letzten Ausführung und lesen Sie das Protokoll.

Geben Sie hier die Bildbeschreibung ein

Benjamin
quelle
Dies ist die grundlegende "Stackdriver-Protokollierung" für Google Apps-Skripte, die nach April 2019 erstellt wurde (als der Zugriff auf das Google Cloud-Projekt für "automatische" Projekte hinter Apps-Skripten unmöglich wurde). Wenn Sie den GCP für ein Apps Script-Projekt ändern, gelten die regulären Stackdriver-Protokollierungsantworten.
Der
1
Ich sehe hier nur direkte Ausführungen (dh solche, für die ich im Skripteditor auf "Ausführen" geklickt habe), aber ich sehe keine Ausführungen, die durch eine Änderung der Daten im Blatt verursacht wurden. Wie debugge ich diese?
Cris70
Ich habe das leider nicht ausprobiert. Ich würde mir vorstellen, dass wenn eine Änderung im Blatt eine Funktion auslöst und die Funktion ein Protokoll hat, das Protokoll mit angezeigt wird. Änderungen wären immer benutzerinduziert, oder?
Benjamin
1
Ja, das hätte ich mir auch vorgestellt. Leider passiert das nicht :-( Änderungen an Daten lösen meine Funktion aus, aber die Meldungen console.log () werden nicht im Stackdriver-Protokoll angezeigt. Ich habe versucht, einen Aktivator für Änderungen hinzuzufügen, aber das ruft meine Funktion ohne Parameter auf: - (
Cris70
4

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

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

Angus Keenan
quelle
Hmm, ja, ich bin darauf gestoßen - es hat mir am nächsten Morgen eine ganze Reihe von Fehlern aus meinen Skripten per E-Mail geschickt.
Am
1

Es ist alles andere als elegant, aber beim Debuggen logge ich mich oft beim Logger ein und verwende dann getLog () , um dessen Inhalt abzurufen. Dann habe ich entweder:

  • Speichern Sie die Ergebnisse in einer Variablen (die im Google Scripts-Debugger überprüft werden kann. Dies funktioniert in Fällen, in denen ich in einem Code keinen Haltepunkt festlegen kann , in Code jedoch einen, der später ausgeführt wird.)
  • Schreiben Sie es in ein temporäres DOM-Element
  • Zeigen Sie es in einer Warnung an

Im Wesentlichen wird es nur zu einem JavaScript-Ausgabeproblem .

Es fehlt grob die Funktionalität moderner console.log()Implementierungen, aber der Logger hilft immer noch beim Debuggen von Google Scripts.

Michael Scheper
quelle
1

Nur als Hinweis. Ich habe eine Testfunktion für meine Tabelle erstellt. Ich benutze die Variable Google Throws in der Funktion onEdit (e) (ich habe es e genannt). Dann habe ich eine Testfunktion wie folgt erstellt:

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 so ausgeführt, wie Sie ein Ereignis in der Tabelle hatten. Ich habe gerade die Möglichkeit der Zelle eingegeben, die ich bearbeitet habe, was mir ein unerwartetes Ergebnis gebracht hat. Ich habe den Wert als den Wert festgelegt, den ich in die Zelle eingegeben habe. OBS! Weitere Variablen, die Google der Funktion gibt, finden Sie hier: https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events

Meltinglava
quelle
0

Derzeit sind Sie auf die containergebundene Art der Verwendung von Skripten in Dokumenten beschränkt. Wenn Sie ein neues Skript außerhalb von Dokumenten 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, sind zwei Monitore (Sie können zwei Fenster verwenden) eingerichtet, von denen einer die GAS-Umgebung und der andere die SS enthält, damit ich Informationen schreiben und protokollieren kann.

JForgie
quelle
0

Die Entwicklungskonsole protokolliert vom App-Skript ausgelöste Fehler. Sie können also einfach einen Fehler auslösen, um ihn als normales console.log zu protokollieren. Die Ausführung wird gestoppt, es kann jedoch für das schrittweise Debuggen nützlich sein.

throw Error('hello world!');

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

QWERTY
quelle
0

Debuggen Sie einfach Ihren Tabellenkalkulationscode wie folgt:

...
throw whatAmI;
...

Shows wie diese:

Geben Sie hier die Bildbeschreibung ein

Toskan
quelle
Ich denke, Sie sollten erwähnen, dass das Bild zeigt, wie eine benutzerdefinierte Funktion einen Fehler anzeigt, aber das OP erwähnt, dass er einen einfachen Trigger verwendet ( onEdit)
Rubén