GAS

【GAS】onEdit(e)内で関数を実行できなくてハマった話

タイトル通り久々に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)

どうやら権限がないのが原因っぽい

調べてみたらonEditonOpen等は記述するだけで実行されるシンプルトリガーというカテゴリに分類されるらしいです。

そしてこのシンプルトリガーで実行された場合は権限が最低らしく、セキュリティで実行できる関数に制限があるとのこと。

なので onEditから他ツールにアクセスする関数等は実行できないのだけど、今回実行しようとしていた関数の中にカレンダー周りの処理が入っていたのでエラーを吐いているって事みたい

解決策

シンプルトリガーでは動かなくても個別設定したトリガーでは動作するので、プロジェクトのトリガーを設定することで解決します。

トリガー用の関数を用意する

var sheet = SpreadsheetApp.getActiveSheet();
function allExecution() {
  var objCell = sheet.getActiveCell();
  if(objCell.getColumn()==3 && objCell.getRow()==3){
    test();
  }
}

getActiveCell()を使って変更されたセルを判別しています

トリガーを設定する

編集→現在のプロジェクトのトリガーから登録

ABOUT ME
ytakeuchi
都内在住のフロントエンドエンジニア。2016年からフリーランスとして活動中。座右の銘は「昨日よりも楽に」。好きな言葉は「効率化」。こんな性格なのでプライベートではGoogle Apps Scriptばかり触っています。