寮食bot不具合:GASトリガー無限発火編
Google Apps ScriptとGoogleスプレッドシートを使って、毎日の献立をツイートするBotを細々と運用中。
2023年第一稼働日の1/10に、予定していたツイートが投稿されないという問題が発生。 色々調べた結果、以下が引き金となったことを確認した。
- Googleスプレッドシートにおいて、MM/dd形式の日付は暗黙的にその年のyyyy/MM/ddとなる
- トリガーに過去日が設定されていた場合、登録後すぐに実行される
- ツイートの実行有無にかかわらず、トリガーを再登録するプログラム
上記1.を解消させることで、とりあえず想定していた動作には戻った。
が、年は毎年明けるので、急ぎではないものの、以下恒久対応も考えておく。
- 献立日付欄の書式を、明示的に「yyyy/MM/dd」に変更する(執筆時点で済)
- 過去日でトリガーを作らないように制御する
何らかのエラーやメッセージなど、自分あてにDMを送って気づきやすくするのも考えておく - トリガーの実行時に、同名でのトリガーを削除する処理を追加する
「トリガーが多すぎます」エラーの回避策。
無限発火編が始まると止まらないので、慎重に考慮する。
== 以後は詳細 ==
MM/dd形式のルールによるもの
Googleスプレッドシート(Excelでも)のルールとして、MM/dd
等で日付を入力した場合、現在の年の日付が自動でセットされる(周知のもの)。
献立表を登録する際、2022年12月のことだが、「1/10」と単純に登録してしまっていたものと考えられる。 その後の日付は、オートフィルでパパパっと作ってしまったため、「2022/01/10」に続く日付が入力されていた。
日付欄の書式が「短い日付」となっていて、気づきにくくなっていたため、書式を「yyyy/MM/dd」に指定することで、間違いに気づきやすくなるよう対応した。
トリガーに過去日が設定されていた場合、登録後すぐに実行される
Google Apps Scriptのトリガーの仕様だと思うが、時間指定型で過去日を指定した場合、登録された直後に実行されてしまう。
この仕様と、後述するプログラムの不具合によって、連続してトリガーが実行されるという結果になったのだと考えられる。
プログラムで「過去日の場合は設定しないようにする」など、過去日の場合を考慮した処理にする必要がある。
プログラムの不具合
不具合、というよりは、考慮不足?
献立を投稿するときのプログラムのフローはだいたいこんな感じになっている。
読み込んだ献立が過去日だった場合、献立ツイートをせずに、過去日で新しいトリガーをセットする、という流れになってしまっている。
このフローと過去日の設定にしていた結果、今回の現象が発生。GASの実行ログは下図のようになってしまっていた。
ちなみに、トリガーが一定数以上あると「トリガーの数が多すぎる。いい加減にしろ」と怒られるので、どこかしらでは止められる。
Exception: このスクリプトに含まれているトリガーの数が多すぎます。さらに追加するには、スクリプトからトリガーを削除する必要があります。