web-dev-qa-db-ja.com

Google Appsスクリプトでのカスタム関数のデバッグ

Apps ScriptでGoogleスプレッドシートの最初のカスタム関数を作成しようとしていますが、デバッガーを使用するのに苦労しています。

私はGoogleドキュメントの カスタム関数デモコード に取り組んでおり、スプレッドシートのセルで使用されるカスタム関数drivingDistance(Origin, destination)にブレークポイントを設定しました。私が抱えている問題は、デバッガーが関数に渡されるパラメーターをundefinedとして表示することです。ただし、実行中に作成される他の変数の内容は正しく表示されます(それらが入力パラメーターに依存しない限り)。

面白いことに、入力パラメーターは未定義として表示されますが、関数の計算は成功するため、これはデバッガーの問題のようです。残念ながら、この問題により、独自のコードを作成およびデバッグする方法を習得できません(複雑な入力パラメーターを使用する必要があるため)。

問題はAppsスクリプトのサーバー側の実行に関連していると感じているので、Loggerクラスを使用して入力パラメーターをログに記録し、これらの変数を新しいローカル変数にコピーしようとしました。しかし、私が思いついたのはundefinedだけでした。

別の奇妙なヒントは、パラメーターのtypeofStringを返すことです。しかし、それらの長さを取得するとエラーがスローされ、それらを別の文字列と連結しようとすると、文字列「undefined」が返されます(私のスクリーンダンプを参照)。

enter image description here

ここで何が起こっているのかについての洞察を探しています。

35
Jpsy

デバッガはおそらくあなたに嘘をついていません-デバッガでその関数を起動した場合、それに渡されるパラメータはありません。ただし、心配する必要はありません。デバッグに使用する値を取得していることを確認するだけです。カスタム関数に適用できる手法を示す GASでトリガー関数をテストするにはどうすればよいですか? を見てください。

関数に渡すイベントを定義する代わりに、パラメーターの値を提供(またはスプレッドシートから取得)する必要があります。

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

あなたはアイデアを得ます。関数内にブレークポイントを設定することも、debuggerを使用して実行を一時停止することもできます。


編集-引数の調査

スプレッドシートから呼び出されたときにカスタム関数が受け取る引数は何ですか?

デバッガーを使用してスプレッドシートから呼び出されたときにカスタム関数を調べることができず、カスタム関数のセキュリティ制限によりLoggingがブロックされるため、これをデバッグする方法に制限があります。引数の受け渡しの概要を理解するにはこれで十分かもしれません。 JavaScript関数には名前付きパラメーターがある場合がありますが、すべての引数はargumentsと呼ばれる配列のようなオブジェクトとして渡されます。このカスタム関数は、受け取った引数を報告する配列を返します。スプレッドシートから呼び出されると、各引数は独自のセルに表示され、関数を入力したセルから開始されます。

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

  return argArray;
}

Screenshot

JavaScriptでは、実際にはintやfloatのような型はなく、Numberのみです。これらのパラメーターは引用符なしで表示され、数字のように見えます。日付はDateオブジェクトとして到着しますが、この方法で印刷すると、Date-y文字列として表示されます。文字列には引用符があります。

カスタム関数は範囲を引数として受け取りません。スプレッドシートで範囲パラメーターを指定すると、その内容が1次元または2次元配列に収集され、配列が引数になります。

41
Mogsdad

このハックを使用して、カスタム関数に送信される引数の構造を確認できます。

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

結果は次のようにシートに表示されます。

enter image description here

4
Joseph Combs