42

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

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

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

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

もう 1 つの奇妙なヒントは、typeofパラメーターの戻り値Stringです。しかし、それらの長さを取得するとエラーがスローされ、それらを別の文字列と連結しようとすると、文字列「未定義」が返されます(画面ダンプを参照)。

デバッガーのスクリーンショット

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

4

2 に答える 2

50

デバッガーはおそらくあなたに嘘をついていません-デバッガーでその関数を起動すると、パラメーターが渡されません。ただし、デバッグに使用する値を確実に取得する必要があるだけです。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実行を一時停止したりすることができます。


編集 - 引数の調査

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

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

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

  return argArray;
}

スクリーンショット

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

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

于 2013-11-29T14:59:52.537 に答える