SpreadSheetで、セルとか行を引数にとって何か実行して返すような関数をApps Scriptで書いた場合、どうやってその関数をデバッグするのかさっぱりわからない。
例えばこういう引数をとらない関数だったら、関数実行するボタン押せば実行されてログが表示される。
function printProductInfo() {
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
for (var i = 0; i < data.length; i++) {
Logger.log("Product name: " + data[i][0]);
Logger.log("Product number: " + data[i][1]);
}
}
けど、こんな感じで引数を取るやつは実行ボタン押しても引数がわからない。(rows
はスプレッドシート側で=calc(A:A)
とかで渡される)
function calc(rows) {
for (var i = 0, len = rows.length; i < len; i++) {
var row = rows[i];
// 何か処理
}
}
スクリプトを保存してスプレッドシートの方に戻ると、この関数が適用されているセルで再実行されて返り値がそのセルに表示されるので、こんな感じで書いて無理矢理デバッグした。
function calc(rows) {
var debug = [];
for (var i = 0, len = rows.length; i < len; i++) {
var row = rows[i][0];
// 何か処理
debug.push(foo); // デバッグしたい値を適当につっこむ
}
return JSON.stringify(debug);
}
これはひどい。