寮食bot不具合:GASトリガー無限発火編

Google Apps ScriptとGoogleスプレッドシートを使って、毎日の献立をツイートするBotを細々と運用中。

2023年第一稼働日の1/10に、予定していたツイートが投稿されないという問題が発生。 色々調べた結果、以下が引き金となったことを確認した。

  1. Googleスプレッドシートにおいて、MM/dd形式の日付は暗黙的にその年のyyyy/MM/ddとなる
  2. トリガーに過去日が設定されていた場合、登録後すぐに実行される
  3. ツイートの実行有無にかかわらず、トリガーを再登録するプログラム

上記1.を解消させることで、とりあえず想定していた動作には戻った。
が、年は毎年明けるので、急ぎではないものの、以下恒久対応も考えておく。

  1. 献立日付欄の書式を、明示的に「yyyy/MM/dd」に変更する(執筆時点で済)
  2. 過去日でトリガーを作らないように制御する
    何らかのエラーやメッセージなど、自分あてにDMを送って気づきやすくするのも考えておく
  3. トリガーの実行時に、同名でのトリガーを削除する処理を追加する
    「トリガーが多すぎます」エラーの回避策。
    無限発火編が始まると止まらないので、慎重に考慮する。

== 以後は詳細 ==

MM/dd形式のルールによるもの

GoogleスプレッドシートExcelでも)のルールとして、MM/dd等で日付を入力した場合、現在の年の日付が自動でセットされる(周知のもの)。

献立表を登録する際、2022年12月のことだが、「1/10」と単純に登録してしまっていたものと考えられる。 その後の日付は、オートフィルでパパパっと作ってしまったため、「2022/01/10」に続く日付が入力されていた。

日付欄の書式が「短い日付」となっていて、気づきにくくなっていたため、書式を「yyyy/MM/dd」に指定することで、間違いに気づきやすくなるよう対応した。

トリガーに過去日が設定されていた場合、登録後すぐに実行される

Google Apps Scriptのトリガーの仕様だと思うが、時間指定型で過去日を指定した場合、登録された直後に実行されてしまう。

この仕様と、後述するプログラムの不具合によって、連続してトリガーが実行されるという結果になったのだと考えられる。

プログラムで「過去日の場合は設定しないようにする」など、過去日の場合を考慮した処理にする必要がある。

プログラムの不具合

不具合、というよりは、考慮不足?

献立を投稿するときのプログラムのフローはだいたいこんな感じになっている。

献立投稿機能のフロー

読み込んだ献立が過去日だった場合、献立ツイートをせずに、過去日で新しいトリガーをセットする、という流れになってしまっている。

このフローと過去日の設定にしていた結果、今回の現象が発生。GASの実行ログは下図のようになってしまっていた。

GAS 実行ログ

ちなみに、トリガーが一定数以上あると「トリガーの数が多すぎる。いい加減にしろ」と怒られるので、どこかしらでは止められる。

トリガーが多すぎる場合のエラー

Exception: このスクリプトに含まれているトリガーの数が多すぎます。さらに追加するには、スクリプトからトリガーを削除する必要があります。