Google Apps Scriptで「スプレッドシートから」の「フォーム送信時」トリガーが重複する問題
タイトルがすべてですが,以下のサイトを参考に経験サンプリングをやってみることにした際に,重複問題が起きました。なお,こちらの環境や設定,またはGoogleの仕様変更に伴う問題だと考えられるため,スクリプトそのものには原因はないと思います。
こちらのスクリプトの概要だけ述べると,参加者が登録用のGoogleフォームから登録を行うと,prepareSheetという関数が起動するという流れになっています。prapreSheetは(登録フォームの回答が記録される)スプレッドシートのスクリプトとなっています。正常動作では,登録フォームが送信されると,メールが送信されたり送信準備したりという関数になっています。
生じた問題は,1回(1人)の登録でこの関数が重複して起動するという問題でした。Google apps scriptでは,関数を起動するトリガーとして色々なものが設定できますが,prepareSheet関数は「スプレッドシートから」&「フォーム送信時」に起動するというトリガーを設定します。そうすることで,フォーム送信されるごと(=参加登録があるごと)に関数が起動するというわけです。どうやら重複の問題の原因は,このトリガーが1回の登録で数回起動しているということでした(トリガーのログで複数起動を確認)。同様の問題は以下でも報告されています。
解決策として↑のサイトと同様に,prepareSheet関数だけをフォームのスクリプトに移動させました。具体的には,スプレッドシートのスクリプトエディタからprapreSheet()をまるごとをコピーして,フォームのスクリプトエディタにペーストします。そして,一番上の一行を書き換えるだけです。
修正前
var sheet = var sheet = SpreadsheetApp.getActiveSpreadsheet();
修正後
var sheet = SpreadsheetApp.openById('シートのID');
シートのIDは登録フォームのスプレッドシートURLの"spreadsheets/d/xxxxxxxxxxxxxxxxxxxxxxxxx/"のxxxxxxxxxxxxxxxxxxxxxの部分です。
これで重複問題は解決して,うまく動きました。