🐙

【GAS】起動条件を満たした時にトリガーを作成するコードを書いて制限事項に抵触した話

に公開

はじめに

こんにちは!ChillStack 総務の亀田です。
私は、エンジニアではないのですが、社内のエンジニアの皆さんに相談をしながら、
技術を活用して日々の業務の効率化・省力化などを目指しています。

この記事は、社内連絡に利用している Google Apps Scripts(以降、 GAS ) で発生したトラブルについてご紹介します。
GAS で特定の起動条件を満たした時に処理を実行させたい方の参考になれば幸いです。

対象の GAS の処理内容

この GAS は全社的な予定を Google カレンダーに登録しておけば、 AM8:00 に Slack に自動通知されるというものです。
登録されている予定は、例えば、オフィスの設備点検や清掃・工事などの情報、消耗品などの配送予定などです。
都度、手動でアナウンスすることもできますが、設備点検などは前もってわかっていることが多く、都度、 Slack で予約投稿をするよりは、予定が分かった時点でカレンダーに登録しておいて、当日、自動で再アナウンスの形の方が楽かな〜ということでこの処理を作成してみました。

発生したトラブル

運用を始めて 1 ヶ月くらいしたタイミングで以下のエラーにより通知が止まりました。

This script has too many triggers. Triggers must be deleted from the script before more can be added.

このエラーは、GAS の制限であるトリガーの上限「 1 スクリプト 20 トリガーまで」に抵触しており、その後の休日判定ではもうトリガーを作れない状態のため通知されたものでした。

参考:https://developers.google.com/apps-script/guides/services/quotas?hl=ja

トラブルの原因

今回問題となったコードは、「1. 平​日か​どうかを​判定し、​平日なら​ AM8:00 に​起動する​トリガーを​作成する」を実行する以下です。

function setTrigger() {
  let dateTime = new Date();
  const day = dateTime.getDay();
  // 平日のみトリガーを作成する
  if (day == 0 || day == 6) return;
  dateTime.setHours(8);
  dateTime.setMinutes(0);
  ScriptApp.newTrigger('notifyTodayEvents').timeBased().at(dateTime).create();
}

GAS には、元々、画面から設定できるタイムトリガー( 9 時〜 10 時の間で処理を実行する、詳細な時刻は設定できない)という機能は備わっているのですが、例えば、平日だけなどの柔軟な対応はできません。

以前別のやり方で休日判定をする処理は実装したことがあったのですが、実行条件を満たしたら 8 時ジャストの時刻指定でトリガーを作成するという処理は使ったことがなかったので、この方法を試してみたいと考え採用することにしました。

結果、毎日実行判定が走り、 1 回限りのトリガーが実行され、実行後に無効になり溜まっていきます。

この無効になったトリガーが運用開始から 20 営業日を過ぎた頃に「 1 スクリプト 20 トリガーまで」の上限に抵触し、処理が止まってしまったという状況でした。

トラブルへの対処

今回は、無効になったトリガーの蓄積が原因のため、以下のようなトリガーを初期化するコードを追加し、 GAS 標準機能のタイムトリガーを利用して定期的に無効トリガーの削除をする処理を実行するように修正しました。

function TriggerReset() {

  //トリガーをすべて取得
  const triggers = ScriptApp.getProjectTriggers();

  //notifyTodayEventsという名前のトリガーを削除
  for (const trigger of triggers) {
    if (trigger.getHandlerFunction() === 'notifyTodayEvents') {
      ScriptApp.deleteTrigger(trigger);
    }
  }
}

最後に

もしかしたら十分な調査などもせずに新しい技法を採用し、トラブルが発生したという状況に不安を感じた方もいらっしゃるかもしれません。
開発チームが提供するプロダクトでは、他の記事でもご紹介の通り、プロダクトのあるべき姿を目指しながら、開発体験の向上と技術的チャレンジを両立させていますのでご安心ください!

私は、技術は専門でないため、例えば、外部に何かが公開されてしまうような処理など、これやって大丈夫かな?これ危なくないかな?と心配になるものについては、社内の詳しい方に事前に相談をしていますが、今回のように仮に処理が動かなかったとしても致命的にならないものの場合は、トライアンドエラーで経験を積んでいます。

安全に失敗できる場を設けつつも、しっかりやるところはしっかりやる・・・そんな ChillStack に興味はありませんか?
「今は転職する気はないけど、ちょっと興味を持ったので話を聞いてみたい」という方も大歓迎ですので、お気軽にご連絡ください。

会社概要
https://chillstack.com

採用ページ
https://chillstack.com/career

公式 Note
https://note.com/chillstack

株式会社ChillStack Tech Blog

Discussion