見出し画像

#27 トリガーをプログラム内で設定する

Google が提供している、GAS のサンプルプログラム(以下 URL)で、プログラムの中でトリガーを設定している例がありました。

具体的には、以下のように追加されているカスタムメニューの項目を選択すると、トリガーを設定しています。

トリガーを設定するカスタムメニュー

この記事では、このサンプルプログラムのように、プログラムでトリガーを設定する方法について取り上げます。

どうやって登録する?

上記 URL のサンプルプログラムで、実際にトリガーを設定している部分は以下の通りです。

  ScriptApp.newTrigger('onFormSubmit')
      .forSpreadsheet(SpreadsheetApp.getActive())
      .onFormSubmit()
      .create();

これは、スプレッドシートに紐づけられたフォームに回答があったときに実行されるトリガーを設定しています。このような「フォーム送信時」のトリガーのように、変更する可能性がない設定であれば、プログラムで追加できるようにしておけば、使い勝手が向上するかもしれません。

設定されるトリガーの状態

プログラム中の 'onFormSubmit' は、設定するトリガー関数になります。上の図のようなスプレッドシートのトリガーを設定するのであれば、この設定する関数の部分だけを変更すれば OK です。

二重登録を防ぐには?

しかしながら、このサンプルプログラムでは、メニュー項目を選択する度に同じ内容のトリガーが複数設定されてしまい、同じ処理を二重に行ってしまいます。
そんな二重登録を防ぐ方法を考えて、サンプルプログラムを修正したのが以下のプログラムです。

変更点は、

/*
  ScriptApp.newTrigger('onFormSubmit')
      .forSpreadsheet(SpreadsheetApp.getActive())
      .onFormSubmit()
      .create();
*/
  triggerInstall( 'ON_FORM_SUBMIT', 'onFormSubmit' );

もともとのトリガーを設定している部分をコメントにして実行されないようにして、21行目で追加した関数 triggerInstall() を呼び出しています。

21行目で呼び出している関数 triggerInstall() は、105 ~ 142行目の部分です。二つの引数 

  • type : 登録しようとするトリガーのタイプ(種類)

  • functionName : 登録しようとするトリガー関数

を受け取り、既に登録されているトリガーに一致するものがないかをチェックし、登録されていなければ登録しています。

具体的には… 112行目の ScriptApp.getProjectTriggers(); で、現在設定されているトリガーを取得して、登録しようとしているトリガーと一致するものかをチェックしています。
116行目の if では、既に登録されているトリガーが、登録しようとしているトリガーと同じタイプのものかをチェックし、118行目の if で同一のトリガー関数が指定されているかをチェックしています。
同一のトリガー関数が既に登録されていれば、二重登録せずに処理を終了します。同じタイプのトリガーが設定されているものの、違う関数が登録されている場合には、登録されていた違う関数が指定されたトリガーを削除し、引数に指定された関数をトリガーとして追加しています。

このプログラムでは、既に同じタイプのトリガーが複数設定されていた場合などには対応しきれていませんが、少なくともこのプログラムで登録する分には、同じトリガー関数を複数設定することはありません。

まとめ

上述したように、作成した GAS のプログラムを利用するために、トリガーを設定しなければならない場合に、そのプログラム内でトリガーを設定できるようにしておけば、設定作業に不慣れな人でも GAS のプログラムを利用しやすくなると思います。
その GAS のプログラムを利用する人のスキルレベルによっては、このようなプログラムによるトリガーの設定を考えてもいいのではないか、と思います。

最後に… この記事を書いていて、134行目からのトリガー関数を設定している部分で、'ON_FORM_SUBMIT' にしか対応していないのであれば、引数に指定する意味がないようにも感じましたが、今後の拡張性のためにも残したままにしておきます。
#「修正するのが面倒なだけでは?」と言わないでください。(^-^;

この記事が気に入ったらサポートをしてみませんか?