web-dev-qa-db-ja.com

GASでトリガー機能をテストするにはどうすればよいですか?

Google Apps Scriptは、 トリガー をサポートします。これは、 イベント を渡して、機能をトリガーします。残念ながら、開発環境ではパラメーターを渡さずに関数をテストできるため、そのようにイベントをシミュレートすることはできません。試みると、次のようなエラーが表示されます。

ReferenceError: 'e'は定義されていません。

イベントをオプションのパラメーターのように扱い、「 JavaScriptでオプションの関数パラメーターを行うより良い方法はありますか? 」の手法のいずれかを使用して、トリガー関数にデフォルト値を挿入できます。しかし、それは怠laなプログラマー(それがあなたなら手伝ってくれます!)が意図しない副作用でそのコードを残すリスクをもたらします。

確かにもっと良い方法はありますか?

43
Mogsdad

シミュレートされたイベントをトリガー関数に渡すテスト関数を作成できます。 onEdit()トリガー関数をテストする例を次に示します。 Understanding Events の「Spreadsheet Edit Events」で説明されているすべての情報を含むイベントオブジェクトを渡します。

使用するには、ターゲットonEdit関数にブレークポイントを設定し、関数_test_onEdit_を選択してDebugを押します。

_/**
 * Test function for onEdit. Passes an event object to simulate an edit to
 * a cell in a spreadsheet.
 *
 * Check for updates: https://stackoverflow.com/a/16089067/1677912
 *
 * See https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events
 */
function test_onEdit() {
  onEdit({
    user : Session.getActiveUser().getEmail(),
    source : SpreadsheetApp.getActiveSpreadsheet(),
    range : SpreadsheetApp.getActiveSpreadsheet().getActiveCell(),
    value : SpreadsheetApp.getActiveSpreadsheet().getActiveCell().getValue(),
    authMode : "LIMITED"
  });
}
_

興味があれば、これは3つのセルを条件とする GoogleスプレッドシートのonEdit関数をテストするために書かれました

スプレッドシートフォーム送信イベントのテスト関数は次のとおりです。フォーム送信データを読み取ることにより、シミュレートされたイベントを構築します。これは元々 onFormSubmitトリガーでTypeErrorを取得するために書かれたものですか?

_/**
 * Test function for Spreadsheet Form Submit trigger functions.
 * Loops through content of sheet, creating simulated Form Submit Events.
 *
 * Check for updates: https://stackoverflow.com/a/16089067/1677912
 *
 * See https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events
 */
function test_onFormSubmit() {
  var dataRange = SpreadsheetApp.getActiveSheet().getDataRange();
  var data = dataRange.getValues();
  var headers = data[0];
  // Start at row 1, skipping headers in row 0
  for (var row=1; row < data.length; row++) {
    var e = {};
    e.values = data[row].filter(Boolean);  // filter: https://stackoverflow.com/a/19888749
    e.range = dataRange.offset(row,0,1,data[0].length);
    e.namedValues = {};
    // Loop through headers to create namedValues object
    // NOTE: all namedValues are arrays.
    for (var col=0; col<headers.length; col++) {
      e.namedValues[headers[col]] = [data[row][col]];
    }
    // Pass the simulated event to onFormSubmit
    onFormSubmit(e);
  }
}
_

チップ

イベントをシミュレートするときは、文書化されたイベントオブジェクトをできるだけ一致させるように注意してください。

  • ドキュメントを検証する場合は、トリガー関数から受信したイベントを記録できます。

    _Logger.log( JSON.stringify( e , null, 2 ) );
    _
  • スプレッドシートフォーム送信イベント:

    • namedValuesの値はすべて配列です。
    • タイムスタンプは文字列であり、その形式はフォームのロケールにローカライズされます。デフォルトの書式設定でスプレッドシートから読み取る場合*、それらはDateオブジェクトです。トリガー関数がタイムスタンプの文字列形式(これは悪い考えです)に依存している場合、値を適切にシミュレートするように注意してください。
    • フォームにない列がスプレッドシートにある場合、このスクリプトの手法は、追加された値を含む「イベント」をシミュレートしますが、これはフォーム送信から受け取るものではありません。
    • Issue 4335 で報告されているように、values配列は空白の回答(「新しいフォーム」+「新しいシート」)をスキップします。 filter(Boolean)メソッドは、この動作をシミュレートするために使用されます。

*セル形式の「プレーンテキスト」は、日付を文字列として保持しますが、これは良い考えではありません。

72
Mogsdad

2017 Update:Google Apps Scriptの イベントオブジェクトStackdriver Logging でデバッグします。スクリプトエディターのメニューバーからgoto:View > Stackdriver Loggingログを表示またはストリーミングします。

console.log()DEBUGレベルのメッセージを書き込みます

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

onFormSubmit()

function onFormSubmit (e) {
  var debug_e = {
    authMode:  e.authMode,  
    namedValues: e.namedValues,
    range:  e.range.getA1Notation(),
    value:  e.value
  }

  console.log({message: 'onFormSubmit() Event Object', eventObject: debug_e});
}

onChange()

function onChange (e) {
  var debug_e = {
    authMode:  e.authMode,  
    changeType: changeType,
    user:  e.user
  }

  console.log({message: 'onChange() Event Object', eventObject: debug_e});
}

次に、出力を確認するためにmessage文字列としてラベル付けされた Stackdriver UI のログを確認します

6
random-parts