Drucken auf der Konsole in Google Apps Script?


87

Ich bin sehr neu in der Programmierung (habe einige der JS-Kurse über Codecademy besucht). Ich versuche ein einfaches Skript zu erstellen, um zu bestimmen, wer wen bezahlen soll, wenn eine Tabelle mit Ergebnissen aus einem Pokerspiel vorliegt. Ich habe Google Apps Script geöffnet und Folgendes geschrieben, um loszulegen:

function addplayerstoArray(numplayers) {

  var playerArray = [];

  for (i=0; i<numplayers; i++) {
    playerArray.push(i);
  }
}  

addplayerstoArray(7);

console.log(playerArray[3])

Die Idee ist, ein Array mit der Gesamtzahl der Spieler darin zu erstellen. Beim Ausführen des Codes dachte ich, es würde "3" auf der Konsole drucken. Aber nichts ist passiert. Es sagte

"ReferenceError:" console "ist nicht definiert."

A) Was verstehe ich nicht über die Funktionsweise der Google Apps Script-Konsole beim Drucken, damit ich sehen kann, ob mein Code das erreicht, was ich möchte?

B) Ist es ein Problem mit dem Code?

Antworten:


139

Die Konsole ist nicht verfügbar, da der Code in der Cloud und nicht in Ihrem Browser ausgeführt wird. Verwenden Sie stattdessen die von GAS bereitgestellte Logger- Klasse:

Logger.log(playerArray[3])

und zeigen Sie dann die Ergebnisse in der IDE unter Ansicht> Protokolle ... an.

Hier finden Sie einige Dokumentationen zur Protokollierung mit GAS .

Bearbeiten: 2017-07-20 Apps-Skript bietet jetzt auch Stackdriver-Protokollierung . Zeigen Sie diese Protokolle im Skripteditor unter Ansicht - Konsolenprotokolle an.


27
Wie wird dies beim Schreiben von Funktionen für Tabellenkalkulationen gemacht? Ich kann anscheinend nicht finden, wohin die Protokollierungsausgabe geht.
TechplexEngineer

4
Super hilfreich. Vielen Dank! Wenn nur das Protokoll live aktualisiert und an einem abgelegenen Ort für schnelle Tests wäre.
Kevincoleman

1
Was ist mit einer HTML-Vorlage?
Trevor

1
In Tabellenkalkulationen können Sie die Ausgabe in ein Popup mit MsgBox oder in eine Seitenleiste mit Seitenleiste einfügen. Sie können es auch an einer abgelegenen Stelle in das Blatt legen.
Vinnief

Für Tabellenkalkulationen passt die Protokollierung hier zur BetterLog-Bibliothek
Igor Savinkin

17

Um auf der oben genannten Hacky-Lösung von Vinnief aufzubauen, verwende ich MsgBox wie folgt:

Browser.msgBox('BorderoToMatriz', Browser.Buttons.OK_CANCEL);

und es verhält sich irgendwie wie ein Haltepunkt, stoppt das Skript und gibt die benötigte Zeichenfolge an ein Popup-Fenster aus. Ich finde vor allem in Sheets, wo ich Probleme mit Logger.log habe, meistens eine angemessene Problemumgehung.


12

Obwohl dies Logger.log()technisch die richtige Art ist, etwas an die Konsole auszugeben, hat es einige Probleme:

  1. Die Ausgabe kann unstrukturiert und schwer zu verdauen sein.
  2. Sie müssen zuerst das Skript ausführen und dann auf Anzeigen / Protokolle klicken. Dies sind zwei zusätzliche Klicks (einer, wenn Sie sich an die Tastenkombination Strg + Eingabetaste erinnern).
  3. Sie müssen einfügen Logger.log(playerArray), und nach dem Debuggen möchten Sie wahrscheinlich entfernen Logger.log(playerArray), daher weitere 1-2 weitere Schritte.
  4. Sie müssen auf OK klicken, um die Überlagerung zu schließen (ein weiterer zusätzlicher Klick).

Wenn ich etwas debuggen möchte, füge ich stattdessen Haltepunkte hinzu (klicken Sie auf die Zeilennummer) und drücke auf die Schaltfläche Debuggen (Fehlersymbol). Haltepunkte funktionieren gut, wenn Sie einer Variablen etwas zuweisen, aber nicht so gut, wenn Sie eine Variable initiieren und zu einem späteren Zeitpunkt einen Blick hinein werfen möchten, ähnlich wie bei der Operation. In diesem Fall würde ich eine Unterbrechungsbedingung erzwingen, indem ich "x" eingebe (x markiert den Punkt!), Um einen Laufzeitfehler auszulösen:

Geben Sie hier die Bildbeschreibung ein

Vergleichen Sie mit dem Anzeigen von Protokollen:

Geben Sie hier die Bildbeschreibung ein

Die Debug-Konsole enthält mehr Informationen und ist viel einfacher zu lesen als das Logs-Overlay. Ein kleiner Vorteil dieser Methode ist, dass Sie sich nie darum kümmern müssen, Ihren Code mit einer Reihe von Protokollierungsbefehlen zu verschmutzen, wenn Sie sauberen Code behalten möchten. Selbst wenn Sie "x" eingeben, müssen Sie daran denken, es im Rahmen des Debugging-Vorgangs zu entfernen, da sonst Ihr Code nicht ausgeführt wird (integrierte Bereinigungsmaßnahme, yay).


1
Hinzufügen xwäre die gleiche Funktionalität wie Hinzufügendebugger;
JSDBroughton

Stimme voll und ganz zu. Logger.log ist im Vergleich zu Debug nicht nützlich.
Steve Gon

10

Beantwortung der OP-Fragen

A) Was verstehe ich nicht über die Funktionsweise der Google Apps Script-Konsole beim Drucken, damit ich sehen kann, ob mein Code das erreicht, was ich möchte?

Der Code in .gs-Dateien eines Google Apps Script-Projekts wird auf dem Server und nicht im Webbrowser ausgeführt. Zum Protokollieren von Nachrichten wurde der Klassenlogger verwendet .

B) Ist es ein Problem mit dem Code?

Wie in der Fehlermeldung angegeben, war das Problem, dass consolees nicht definiert wurde, aber heutzutage wird derselbe Code einen anderen Fehler auslösen:

ReferenceError: "playerArray" ist nicht definiert. (Zeile 12, Datei "Code")

Dies liegt daran, dass das playerArray als lokale Variable definiert ist. Wenn Sie die Zeile aus der Funktion verschieben, wird dies behoben.

var playerArray = [];

function addplayerstoArray(numplayers) {
  for (i=0; i<numplayers; i++) {
    playerArray.push(i);
  }
}  

addplayerstoArray(7);

console.log(playerArray[3])

Jetzt, da der Code ohne Fehler ausgeführt wird, sollten wir uns stattdessen die Stackdriver-Protokollierung ansehen, um die Browserkonsole zu betrachten. Klicken Sie in der Benutzeroberfläche des Google Apps Script-Editors auf Ansicht> Stackdriver-Protokollierung .

Nachtrag

Im Jahr 2017 hat Google für alle Skripte die Stackdriver-Protokollierung veröffentlicht und die Klassenkonsole hinzugefügt. Wenn Sie also so etwas wie " console.log('Hello world!')Stackdriver Logging Service" einfügen, wird das Protokoll nicht auf der Browserkonsole, sondern auf dem Stackdriver-Protokollierungsdienst der Google Cloud Platform angezeigt.

Aus den Versionshinweisen 2017 zu Google Apps Script

23. Juni 2017

Die Stackdriver-Protokollierung wurde aus dem Early Access entfernt. Alle Skripte haben jetzt Zugriff auf die Stackdriver-Protokollierung.

Über Protokollierung> Stackdriver-Protokollierung

Das folgende Beispiel zeigt, wie Sie mit dem Konsolendienst Informationen in Stackdriver protokollieren.

function measuringExecutionTime() {
  // A simple INFO log message, using sprintf() formatting.
  console.info('Timing the %s function (%d arguments)', 'myFunction', 1);

  // Log a JSON object at a DEBUG level. The log is labeled
  // with the message string in the log viewer, and the JSON content
  // is displayed in the expanded log structure under "structPayload".
  var parameters = {
      isValid: true,
      content: 'some string',
      timestamp: new Date()
  };
  console.log({message: 'Function Input', initialData: parameters});

  var label = 'myFunction() time';  // Labels the timing log entry.
  console.time(label);              // Starts the timer.
  try {
    myFunction(parameters);         // Function to time.
  } catch (e) {
    // Logs an ERROR message.
    console.error('myFunction() yielded an error: ' + e);
  }
  console.timeEnd(label);      // Stops the timer, logs execution duration.
}

6

In einem Google Script-Projekt können Sie HTML-Dateien (Beispiel: index.html) oder gs-Dateien (Beispiel: code.gs) erstellen. Die .gs-Dateien werden auf dem Server ausgeführt und Sie können Logger.log verwenden, wie @Peter Herrman beschreibt. Wenn die Funktion jedoch in einer HTML-Datei erstellt wird, wird sie im Browser des Benutzers ausgeführt und Sie können console.log verwenden. Die Chrome-Browserkonsole kann mit Ctrl Shift J unter Windows / Linux oder Cmd Opt J unter Mac angezeigt werden

Wenn Sie Logger.log für eine HTML-Datei verwenden möchten , können Sie mithilfe eines Scriptlets die Funktion Logger.log aus der HTML-Datei aufrufen. Dazu würden Sie < einfügen ? Logger.log (etwas)?> Ersetzen Sie etwas durch das, was Sie protokollieren möchten. Standard-Scriptlets, die die Syntax <? ...?> Code ausführen, ohne explizit Inhalt auf der Seite auszugeben.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.