Google Spreadsheet&GASで勤怠管理のシートを作成していた際に、
祝日カレンダーの取得処理実装で30分ほどはまったのでメモ。
現象
gasのonEdit()から祝日取得の関数を呼び出す際に、以下のエラーで怒られる。
Exception: UrlFetchApp.fetch を呼び出す権限がありません。必要な権限: https://www.googleapis.com/auth/script.external_request
祝日取得の関数は以下がメインの処理。
var response = UrlFetchApp.fetch("https://holidays-jp.github.io/api/v1/" + year + "/date.json");
やったこと その1
appscript.json に、oauthScopes を追加。
"oauthScopes" : [
"https://www.googleapis.com/auth/script.external_request",
"https://www.googleapis.com/auth/spreadsheets",
"https://www.googleapis.com/auth/script.external_request"
]
少しはまったところ
→原因はカンマ追加漏れ(oauthScopesを一番最後に追加したので)。
嘘と思うかもしれないが、日頃から使っていないとこんなところでハマる
やったこと その2
権限追加したし、うまくいくやろーと思ってSpreadsheetのセル編集(onEdit関数キック)したが、動かない。
ログを見ると、先ほどと同じエラーが吐かれている。
ちなみに、デバッグで祝日取得の関数を実行すると、問題なく動く。
ダメ元でGeminiさんに聞いてみると、以下の回答。
Google Apps Script (GAS) の onEdit トリガーで UrlFetchApp.fetch を使用する場合に権限エラーが発生する問題は、GASの Simple Trigger と Installable Trigger の違いに起因しています。
なるほど、、わからん。
Simple Trigger
スプレッドシートの編集など、特定のイベントが発生したときに自動的に実行されるトリガーです。
onEdit はSimple Triggerの一種です。
Simple Triggerで実行される関数は、実行ユーザーの権限で動作します。
スクリプトが UrlFetchApp.fetch のような外部サービスにアクセスする権限を必要とする場合、実行ユーザーが事前にその権限を承認している必要があります。
Installable Trigger
スクリプトエディタから手動で設定するトリガーです。
Installable Triggerで実行される関数は、スクリプトのオーナーの権限で動作します。
スクリプトのオーナーが外部サービスへのアクセスを承認していれば、実行ユーザーが承認していなくても UrlFetchApp.fetch を使用できます。
ふむふむ、Installable Triggerでトリガーイベントを作っておけば、よさげと。
ちなみに、追加の仕方は以下のとおり。
- スクリプトエディタで、[トリガー] > [トリガーを追加] を選択
- イベントソースを「スプレッドシート」、イベントの種類を「編集時」、関数を選択して保存
サクッとトリガ追加してSpreadsheetの編集したら、無事に祝日取得処理が動作した!