タイトル通り久々にGASでハマったのでメモ…
現象
onEdit
でC3セルの値に変更があった時test()
を実行する処理を作っていました
function onEdit(e) {
if ( e.range.getRow() ===3 && e.range.getColumn() === 3 ){
//C3の値が変更された時だけ実行!
test();
}
}
状況整理と問題点
onEdit
の処理や中のif文は正常に動いているtest()
もonEdit
の外側では動いているonEdit
内でtest()
を実行しようとすると動かない
test()
がonEdit
の中でだけ実行できないという謎現象にハマりました
原因
Stackdriverのログを見てみたらそれっぽいログを発見
2020/04/29 20:29:40 エラー Exception: スクリプトにはその操作を行う権限がありません。その操作を行うには「(https://www.googleapis.com/auth/calendar || https://www.googleapis.com/auth/calendar.readonly || https://www.google.com/calendar/feeds)」権限が必要です。
at isHoliday(コード:63:32)
at inputTime(コード:42:19)
どうやら権限がないのが原因っぽい
調べてみたらonEdit
やonOpen
等は記述するだけで実行されるシンプルトリガーというカテゴリに分類されるらしいです。
そしてこのシンプルトリガーで実行された場合は権限が最低らしく、セキュリティで実行できる関数に制限があるとのこと。
なので onEdit
から他ツールにアクセスする関数等は実行できないのだけど、今回実行しようとしていた関数の中にカレンダー周りの処理が入っていたのでエラーを吐いているって事みたい
解決策
シンプルトリガーでは動かなくても個別設定したトリガーでは動作するので、プロジェクトのトリガーを設定することで解決します。
トリガー用の関数を用意する
var sheet = SpreadsheetApp.getActiveSheet();
function allExecution() {
var objCell = sheet.getActiveCell();
if(objCell.getColumn()==3 && objCell.getRow()==3){
test();
}
}
getActiveCell()
を使って変更されたセルを判別しています
トリガーを設定する
編集→現在のプロジェクトのトリガーから登録
