お問い合わせフォームからGASへの送信が急に動かなくなった。GASのログシートを確認すると、最後の記録が半年以上前だった。
何が起きていたか
Google Apps ScriptのWebアプリは、スクリプトがGoogleのサービス(スプレッドシートへの書き込みなど)にアクセスするためにOAuth認可が必要だ。
この認可トークンは約6ヶ月間スクリプトが実行されないと失効する。
問い合わせが来なければGASは動かず、トークンが切れて、次に問い合わせが来ても実行権限がないため動かない、という負のループになる。
解決方法
ブラウザでGASのWebアプリURLに直接アクセスすると、OAuth認可フローが走ってトークンが更新される。これで一時的に復旧する。
ただし根本解決にはならない。また半年後に切れる。
恒久対策:keepAliveトリガー
GASのエディタでスクリプトを定期実行するトリガーを設定する。月1回の実行でトークンの失効を防げる。
まずスクリプトに何もしない関数を追加する:
function keepAlive() {
console.log('keepAlive: ' + new Date());
}
次にトリガーを設定する:
- GASエディタ左メニューの時計アイコン「トリガー」を開く
- 右下の「トリガーを追加」をクリック
- 以下の通り設定して保存
| 項目 | 設定値 |
|---|---|
| 実行する関数 | keepAlive |
| イベントのソース | 時間主導型 |
| タイプ | 月ベースのタイマー |
| 日付 | 1日 |
| 時刻 | 午前0時〜1時 |
これで毎月1日にスクリプトが自動実行され、OAuthトークンが維持される。
承認フローについて
ブラウザでGASのURLにアクセスしたときに出る認可画面は「このブラウザを許可する」ではなく「このスクリプトがGoogleのサービスにアクセスすることをGoogleアカウントとして承認する」という意味だ。ブラウザやデバイスに紐づくものではなく、Googleアカウントとスクリプトの関係に対する一回限りの認可だ。
keepAliveトリガーを設定した後は、問い合わせが来なくても毎月スクリプトが動くのでトークンは維持される。設定しておけばあとは放置でいい。