GoogleAppsScript(GAS)でトリガーをスクリプトからセットする


はじめに

初めまして。wolf25です。
普段はGASとTypeScriptで開発しています。
初めての記事投稿となりますが、参考になればなと思います。
コメントなども頂けると幸いです。

本記事について

GoogleAppsScript(以下GAS)をGoogleFormと合わせて用いてる場合のトリガーをスクリプトからセットする方法を載せています。

トリガーはGUIでぽちぽちやればできるのですが、自動化したかった故、書きました。
スクリプトからトリガーをセットする方法についての記事があまりにも少なかった。
スクリプトからでなくても良い場合はネットにいくらでも転がっていましたので、そちらを参考ください。

対象

  • GASのスクリプトからトリガーをセットしたいと思っている方。
  • トリガーをスクリプトから削除したい方
  • スクリプトをどうやって書けばいいのかわからない方。

トリガーのセット

claspで開発しているため、言語はTS(TypeScript)です。
newTrigger()でトリガーを引かれた後、起動させたい関数名を入力します。

NewTrigger.ts
public sample() {
  const url: string = 'GoogleFormのURL';
  const formObject: Forms = FormApp.openByUrl(url);
  try {
    ScriptApp.newTrigger('トリガー起動後動かしたい任意の関数名')
      .forForm(formObject)
      .onFormSubmit()
      .create();
    Logger.log('successly create trigger .');
  } catch (error) {
    Logger.log('Miss: cannot set trigger');
  }
}

トリガーの削除

自動でトリガーを付与してくれるのはいいのですが、スクリプトを実行する度に同じトリガーが増えていき、これ以上セットできませんというエラーが出てしまったりする。
それを防ぐために常にトリガーが1つになるよう、トリガー削除のスクリプトが以下です。

Delete.ts
public deleteTrigger() {
  for (const trigger of ScriptApp.getProjectTriggers()) {
    try {
      ScriptApp.deleteTrigger(trigger);
      Logger.log('successly delete trigger .');
    } catch (error) {
      Logger.log('Miss: cannot delete trigger .');
    }
  }
}

ScriptApp.getProjectTriggers()で現在のトリガー一覧を取得できます。

for文の中でif(trigger.getHandlerFunction() == "トリガー名")と縛ることで任意のトリガーを削除することもできます。
"トリガー名"はトリガーセットした関数名です。

常にトリガーを1つに保つ

最終的にトリガー作成と削除の両方を動作を行うスクリプトです。

Trigger.ts
export class Trigger {
  constructor() {}

  /**
   * - Set trigger to launch automatically .
   *  - set new trigger after deleting old trigger .
   */
  public setTrigger(form: Form) {
    this.deleteTrigger();

    const url: string = 'GoogleFormの編集権限付きURL';
    const formObject: Forms = FormApp.openByUrl(url);
    try {
      ScriptApp.newTrigger('トリガー起動後動かしたい任意の関数名')
        .forForm(formObject)
        .onFormSubmit()
        .create();
      Logger.log('successly create trigger .');
    } catch (error) {
      Logger.log('Miss: cannot set trigger');
    }
  }

  /**
   * - Delete trigger to launch automatically .
   */
  private deleteTrigger() {
    for (const trigger of ScriptApp.getProjectTriggers()) {
      try {
        ScriptApp.deleteTrigger(trigger);
        Logger.log('successly delete trigger .');
      } catch (error) {
        Logger.log('Miss: cannot delete trigger .');
      }
    }
  }
}

余談

「イベントのソースを選択」から「時間主導型」、「カレンダーから」、「フォーム送信後」というカラムがあったのですが、いつの間にか「フォーム送信後」が消えていて「はて。。?」という感じになりました。
つまり「フォーム送信」をトリガーにするにはスクリプトからしかできないのでしょうか。

まとめ

いかがでしたでしょうか。
私自身、スクリプトからトリガーをセットできることは知っていましたが、書き方がいまいちよくわからなかった(そういう記事も少ない)ので、参考になる人がいたら幸いです。
今回はフォーム送信のトリガーを主に紹介しましたが、時間主導型も同じようにできるので時間があれば更新していきたいと思います。

参考