it-swarm.com.de

Debuggen einer benutzerdefinierten Funktion in Google Apps Script

Ich versuche, meine erste benutzerdefinierte Funktion für eine Google-Tabelle in Apps Script zu erstellen, und es fällt mir schwer, den Debugger zu verwenden.

Ich arbeite an dem Demo-Code custom function aus der Google-Dokumentation und habe in der benutzerdefinierten Funktion drivingDistance(Origin, destination) einen Haltepunkt gesetzt, der in einer Zelle meiner Tabelle verwendet wird. Das Problem, das ich habe, ist, dass der Debugger die an die Funktion übergebenen Parameter als undefined anzeigt. Der Inhalt aller anderen Variablen, die während der Ausführung erstellt werden, wird jedoch korrekt angezeigt (sofern sie nicht von den Eingabeparametern abhängen).

Das Lustige daran ist, dass die Eingabeparameter zwar als undefiniert angezeigt werden, die Berechnungen der Funktion jedoch erfolgreich sind. Dies scheint also ein Debugger-Problem zu sein. Leider verhindert dieses Problem, dass ich erfolgreich lernen kann, eigenen Code zu erstellen und zu debuggen (da ich mit komplexen Eingabeparametern arbeiten muss). 

Ich habe das Gefühl, dass das Problem mit der serverseitigen Ausführung von Apps Script zusammenhängt, also habe ich versucht, die Eingabeparameter mit der Klasse Logger zu protokollieren, und ich habe auch versucht, diese Variablen in neue lokale Variablen zu kopieren. Aber alles, was ich fand, war undefined.

Ein weiterer merkwürdiger Hinweis ist, dass typeof der Parameter String zurückgibt. Wenn Sie jedoch die Länge von ihnen ermitteln, wird ein Fehler ausgegeben, und wenn Sie versuchen, sie mit einer anderen Zeichenfolge zu verketten, wird die Zeichenfolge "undefined" zurückgegeben (siehe mein Bildschirmauszug).

enter image description here

Ich suche nach Erkenntnissen darüber, was hier vor sich geht.

29
Jpsy

Der Debugger lügt Sie wahrscheinlich nicht an - wenn Sie diese Funktion im Debugger starten, werden keine Parameter an ihn übergeben. Keine Sorge, Sie müssen nur sicherstellen, dass Sie Werte zum Debuggen verwenden. Werfen Sie einen Blick auf Wie kann ich eine Triggerfunktion in GAS testen? , das Techniken demonstriert, die für benutzerdefinierte Funktionen verwendet werden können.

Anstatt ein Ereignis zu definieren, das an die Funktion übergeben werden soll, müssen Sie Werte für die Parameter angeben (oder aus Ihrer Tabelle abrufen).

function test_drivingDistance() {
  // Define a set of test values
  var testSet = [[ 'Washington, DC', 'Seattle, WA' ],
                 [ 'Ottawa, ON', 'Orlando, FL'],
                 [ 'Paris, France', 'Dakar, Senegal']];

  // Run multiple tests
  for (var test in testSet) {
    Logger.log('Test ' + test + ' = ' + drivingDistance(testSet[test][0],testSet[test][1]));
  }

  // Get parameters from sheet
  var TestFromSheet = drivingDistance(ss.getRange('A1').getValue(),ss.getRange('A2').getValue());
}

Du hast die Idee. Sie können weiterhin Haltepunkte in Ihrer Funktion festlegen oder debugger verwenden, um die Ausführung anzuhalten.


Bearbeiten - Argumente untersuchen

Welche Argumente empfängt die benutzerdefinierte Funktion, wenn sie aus einer Kalkulationstabelle aufgerufen wird?

Sie haben nur eine begrenzte Anzahl von Möglichkeiten, um dieses Problem zu beheben, da der Debugger nicht verwendet werden kann, um Ihre benutzerdefinierte Funktion zu überprüfen, wenn er von Sheets aus aufgerufen wird. Sicherheitsbeschränkungen für benutzerdefinierte Funktionen blockieren die Protokollierung. Es reicht vielleicht aus, um die Argumente im allgemeinen zu verstehen. Während für JavaScript-Funktionen Parameter benannt werden können, werden alle Argumente als Array-ähnliche Objekte mit dem Namen arguments übergeben. Diese benutzerdefinierte Funktion gibt ein Array zurück, das die empfangenen Argumente meldet. Beim Aufruf aus einer Tabelle erscheint jedes Argument in einer eigenen Zelle, beginnend bei der Zelle, in die Sie die Funktion eingeben:

function testArguments(  ) {
  var argArray = [];
  for (var arg in arguments) {
    argArray.Push("arguments[" + arg + "] = " + JSON.stringify(arguments[arg]))
  }

  return argArray;
}

Screenshot

In Javascript gibt es nicht wirklich Typen wie int oder float - nur Number. Diese Parameter werden ohne Anführungszeichen angezeigt und sehen aus wie Zahlen. Datumsangaben kommen als Datumsobjekte an, werden jedoch auf diese Weise als Date-y-Zeichenfolgen angezeigt. Strings haben Anführungszeichen.

Eine benutzerdefinierte Funktion erhält niemals einen Bereich als Argument. Wenn Sie einen Bereichsparameter in der Kalkulationstabelle angeben, wird dessen Inhalt in einem ein- oder zweidimensionalen Array erfasst, und das Array ist das Argument.

34
Mogsdad

Mit diesem Hack können Sie die Struktur der Argumente anzeigen, die an die benutzerdefinierte Funktion gesendet werden:

function TEST(input) {
  return (JSON.stringify(input));
}

Die Ergebnisse werden in Ihrem Arbeitsblatt folgendermaßen angezeigt:

 enter image description here

0
Joseph Combs