※現在の作動状況(2019/7/9)
当記事で紹介している事象がなおったとの報告をいただき、私の環境でもトリガーが正常に作動していることを確認しました。当記事での対処方法は不要ですが、私個人の備忘録として掲載をさせていただきます。
(コメントをくださった皆様ありがとうございました)
対処方法
- スプレッドシートのトリガーを削除
- スプレッドシートのプロジェクトをライブラリ化
- Google Formsからプロジェクトを作成
- Google Formsのプロジェクトにライブラリを組み込む
- Google Formsのプロジェクトにトリガー「フォーム送信時」を組み込む
状況
スプレッドシートに組み込んだGASのトリガー「フォーム送信時」が誤作動を起こしました。具体的には、内容確認のメールを送信する処理が2回以上、多いときには7回程度送信されます。
調査
原因を調べてみたところ、フォーム送信後、ほぼ同じ時刻に複数回トリガーが作動していることが確認できました。
前任者がスプレッドシートをコピペして使っていたのでそれが原因か?とも思ったのですが、同一環境でイチから作ってみても同じ事象が起こり、自分の能力では特定ができませんでした。
対処方法詳細
トリガーを組み込む場所をスプレッドシートからGoogleフォームへと変更しました。
1.スプレッドシートのトリガーを削除
スプレッドシートに付随するプロジェクトで設定しているトリガーを削除します。
1.スクリプトエディタ
2.「現在のプロジェクトのトリガー」
3.トリガーの設定ボタン(三点)
4.「トリガーを削除」
2.スプレッドシートのプロジェクトをライブラリ化
スプレッドシートに付随するプロジェクトで実装している処理をライブラリ化します。Google Formsで再度実装する手間を省略する狙いがあります。
1.スクリプトエディタ
2.「公開」タブ
3.「実行可能APIとして導入」(バージョン設定は任意、アクセスできるユーザーはとりあえず「自分のみ」)
4.表示されたAPI IDを控える
※スプレッドシート側でコードを編集したときはバージョン情報を更新することを忘れないようにしてください
3.Google Formsからプロジェクトを作成
スプレッドシートと連携しているフォームを開きます。
1.Google Forms
2.設定ボタン(三点)
3.「スクリプトエディタ」
4. Google Formsのプロジェクトにライブラリを組み込む
スプレッドシートのプロジェクトで作成したライブラリを組み込みます。
1.スクリプトエディタ
2.「リソース」タブ
3.「ライブラリ」
4.「ライブラリを追加」欄にAPI IDを貼付
5.「追加」ボタン押下
6.最新のバージョンを選択
7.保存
ライブラリ組み込みについての参考:https://www.lisz-works.com/entry/gas-create-lib#%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80
ライブラリ組み込み後、エディタには以下のように記述します。
function myFunction() {
FormApp.getActiveForm();
//スプレッドシートへの転記処理が終わるまで待機
Utilities.sleep(20000);
//ライブラリの関数を実行
spreadsheet.projectname();
}
フォーム送信内容のスプレッドシートへの転記処理に時間がかかることがあるため、念のために20秒ほど待機をしております。待機時間は条件によって変えて良いかと思います。
5. Google Formsのプロジェクトにトリガー「フォーム送信時」を組み込む
1.スクリプトエディタ
2.「現在のプロジェクトのトリガー」
3.「トリガーを追加」
4.「イベントの種類を選択」>フォーム送信時
5.保存
動作状況
概ね希望通りの動作(フォーム送信後、入力者へ自動でメールが送信される)が実現でき、2回以上の連続送信(=トリガーの複数回実行)は起こっていません。
スプレッドシートで全て処理できるのがベストですが、当面はこちらで対応したいと思います。