Google Apps Scriptは、 トリガー をサポートします。これは、 イベント を渡して、機能をトリガーします。残念ながら、開発環境ではパラメーターを渡さずに関数をテストできるため、そのようにイベントをシミュレートすることはできません。試みると、次のようなエラーが表示されます。
ReferenceError: 'e'は定義されていません。
イベントをオプションのパラメーターのように扱い、「 JavaScriptでオプションの関数パラメーターを行うより良い方法はありますか? 」の手法のいずれかを使用して、トリガー関数にデフォルト値を挿入できます。しかし、それは怠laなプログラマー(それがあなたなら手伝ってくれます!)が意図しない副作用でそのコードを残すリスクをもたらします。
確かにもっと良い方法はありますか?
シミュレートされたイベントをトリガー関数に渡すテスト関数を作成できます。 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 ) );
_
スプレッドシートフォーム送信イベント:
values
配列は空白の回答(「新しいフォーム」+「新しいシート」)をスキップします。 filter(Boolean)
メソッドは、この動作をシミュレートするために使用されます。*セル形式の「プレーンテキスト」は、日付を文字列として保持しますが、これは良い考えではありません。
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 のログを確認します