Google Apps ScriptでDebugをしていた際に、EventTriggerで少しハマった件について、メモを残しておきます。
やりたかったことは、Eventを拾ってその情報をLogシートに書き出しておくということ。
##ハマったこと
SpreadsheetApp.openById();
を使った時に
実行に失敗: その操作を実行する権限がありません。
というエラーが出ていた。
var ss = SpreadsheetApp.openById(SheetID);
単体で実行する分には問題なかったのだが、EventTriggerから呼ばれた際に、エラーになっていた。
呼び出し元ソース
function onEdit(e)
{
var r = e.source.getActiveRange();
sample(r);
}
function sample(range)
{
var useraddress = Session.getActiveUser().getEmail();
range.setNote("Last modified: " + (new Date()) + "[modified by " + useraddress + "]");
Log.debug(range.getA1Notation(), range.getValue());
}
function test_sample()
{
sample(SpreadsheetApp.getActiveSheet().getRange("A1"));
}
##単体の呼び出しは問題なし
var SheetID = PropertiesService.getScriptProperties().getProperty('SPREAD_SHEET_ID');
var LogSheetName = PropertiesService.getScriptProperties().getProperty('LOG_SHEET_NAME');
var Log = {
debug: function (cell, message) { Log.write('Debug', cell, message); },
write: function (logLevel, cell, message) {
var ss = SpreadsheetApp.openById(SheetID);
var logsheet = ss.getSheetByName(LogSheetName);
var logValue = new Array();
logValue = [
logsheet.getLastRow()+1, // A列
new Date(), // B列
logLevel, // C列
cell, // D列
message, // E列
Session.getActiveUser().getEmail()
];
logsheet.appendRow(logValue);
}
};
// unit test
function log_test() {
Log.debug("A1", "ログ出力");
}
log_test()
の実行は問題なし
##Common.gs → Log.gsの参照に何か問題があるのか?
test_sample()
の実行は問題なし。
単体実行では問題なく動く。
どうもSpreadsheetにおいて、onEventからの場合に、setNote()は動作しているのに、Log.debugを呼び出すとopenByIdで止まっている。
##理由はまだ不明だがトリガの設定をすることで解決
リソース>すべてのトリガー(ちなみに、「現在のプロジェクトのトリガー」でもよいです)
ここでトリガーを設定する。
「保存」すれば問題ありません。
これで、実行するとエラーが無くなりました。
##まとめ
- なぜトリガの設定が必要だったのか
- onEventはトリガを設定しなくても動くのに、SpreadsheetApp.openByIdはなぜ嫌がられたのか
この辺りはまだ調査中です。。。
##GASのデバッグでの参考させていただいた記事