はじめに
世の中は「まぜるな危険」で溢れている。
今日、Googleフォームと、トリガ付きスプレッドシートを混ぜたら、爆発しました。💣💥
要約
Googleフォームの「回答の送信先を選択」で、「フォーム送信時」のトリガ付きのスプレッドシートを紐付けると、スプレッドシートの処理が回答の数だけ走ります。1
顛末
登場するもの
- Googleフォーム
- 旧スプレッドシート
- フォーム送信時にメールを送るGoogle Apps Script付き
- 新スプレッドシート
- 旧スプレッドシートからプロジェクトを移植
したこと
Googleフォームに紐づいていた旧スプレッドシートを新スプレッドシートに引っ越ししようとした。回答が溜まり、列も乱れていたため。
- 旧スプレッドシートをコピー、新スプレッドシートを作成
- 新スプレッドシートにApps Scriptおよびトリガーをセットアップ。(⚠️これが火種)
- Googleフォームを新スプレッドシートに紐付け
- 溜まっていた回答の数だけ、トリガが発火💥
先にトリガーを設定したのが、将棋で言うところの手順前後でした。
再現手順(Step to Reproduce)
1. 適当なGoogleフォームを作成
2. 回答を溜める
3. スプレッドシートを作成する
4. Apps Scriptを作成
以下のように、フォーム提出時の処理とトリガー作成関数を追加。
function onFormSubmit(e) {
console.warn("Adieu, World!")
}
function setTrigger() {
ScriptApp
.newTrigger("onFormSubmit")
.forSpreadsheet(SpreadsheetApp.getActive())
.onFormSubmit()
.create()
}
5. トリガを実装
setTrigger
を実行。以下のようにトリガが生成される。
6. フォームをシートに紐付け
7. Apps Scriptを確認
ここでApps Scriptの実行ログを確認します...
回答分の3回、トリガ処理が走っています☺️
「フォーム送信時」とは...
これは仕様...?
個人的にはこれは予期しない動きだったのですが、仕様なのでしょうか。
インストール可能なフォーム送信トリガーは、ユーザーがフォームに回答したときに実行されます。フォーム送信トリガーには、Google フォーム自体用と、フォームがスプレッドシートに送信される場合のスプレッドシート用の 2 つのバージョンがあります。
フォームがスプレッドシートに送信される場合
に「回答の送信先を選択」したことが当てはまるかというと、まぁ当てはまらないとも言えないか...
内部実装に想いを馳せると、回答時にフォームからスプレッドシートに回答を送るのも、既存の回答を新規スプレッドシートに送るのも一緒!、と、おもんぱかることもできそうです。いや、おもんぱかれないでしょ。アルパカ🦙🦙🦙
Stackoverflowも探しましたが、関連情報はありませんでした。
おわりに
筆者のケースでは実行数Quotaのおかげで途中からエラーになりましたが、それなりの物的・心的な被害を被りました。
Googleフォームの紐付け先を変える際は、
- 引っ越し前にフォームの回答をアーカイブ、回答を消しておく
- スプレッドシートのトリガーはフォームを紐づけてから付ける
のどちらかをしておくのが安心です。
と、ここに他山の石を残し、擱筆とします。
おまけ:生成AIの意見
Gemini 2.0 Pro
発火しない 訂正:Geminiは正解でした。お家芸。「2. スプレッドシートの再リンク」が今回の事例ですね。回答の冒頭と矛盾している気もする。
-
この記事は2025年3月17日時点の動作を元にしています。今後、挙動が変わることがあります。(変わってほしい) ↩