デバッグ専用の関数を作り,そこから呼ぶ
結局のところ難しいのってトリガイベントによって実行される関数を,どうやってトリガ情報を任意の値に設定してデバッグ実行するかだと思います.
今の所のベストプラクティスは単純ですがトリガ部分をメイン関数と分離させ,トリガ部分に相当するデバッグ用の関数を別に用意し内部で変数をベタ打ちする方法です.
例として以下のコードはフォームに新しい回答が送信された時に回答に対して何らかの処理を行うコードの一部です.
元コード
デバッグしたい処理はonFormSubmit(e)内に配置されており,引数eを指定する方法がGoogleAppScriptのコンソールには無いため任意タイミングでの実行は不可能でした.
(eを指定できたとしてもgetActiveSheet等が動くのかも不明)
original_code.gs
function onFormSubmit(e) {
var sheet = e.source.getActiveSheet();
var lastRow = sheet.getLastRow();
var data = sheet.getRange(lastRow, 1, 1, 10).getValues()[0];
var mail = data[0];
....
改善後コード
実際にデバッグしたい処理の本体をmain関数に隔離し,トリガによって起動する関数とデバッグ時に任意タイミングで実行する関数を用意しました.
debugOnFormSubmit内にてmainで必要な変数をベタ打ちで用意しているのでトリガに依存せず任意の値を渡した動作をデバッグできます.
ここまで用意したらあとは適当にbreak pointを設定してdebug consoleでデバッグ用関数を指定し実行するだけです.
debug_friendly_code.gs
// トリガ起動用
function onFormSubmit(e) {
var sheet = e.source.getActiveSheet();
var lastRow = sheet.getLastRow();
var data = sheet.getRange(lastRow, 1, 1, 10).getValues()[0];
main(data);
}
// デバッグ専用
function debugOnFormSubmit(){
// デバッグで使用するデータを固定する
var docId = 'YOUR_SHEET_ID_FOR_DEBUG';
var spreadsheet = SpreadsheetApp.openById(docId);
var sheet = spreadsheet.getActiveSheet();
var targetRow = 100;
var data = sheet.getRange(targetRow, 1, 1, 10).getValues()[0];
main(data);
}
function main(data) {
var mail = data[0];
....
敬具