ADVERTISEMENT

【Googleドキュメント】Googleフォーム回答から文書を作る時の重複作成防止

【Googleドキュメント】Googleフォーム回答から文書を作る時の重複作成防止
🛡️ 超解決

Googleフォームの回答をもとに、Googleドキュメントを自動作成する便利な仕組みを社内で活用している企業は多いでしょう。ところが、同じ回答に対して何度も文書が生成されてしまい、重複したドキュメントが散乱して困った経験はありませんか。この問題は、フォーム回答のトリガー設定やスクリプトの処理ロジックに起因することがほとんどです。本記事では、重複作成が発生する具体的な原因と、確実に防止するための実務的な対策を解説します。特に、Google Apps Script(GAS)を使った自動化を行っている方向けに、設定ミスや実行タイミングの誤りを防ぐポイントを整理しました。

【要点】この記事で確認すること

  • 最初に見る場所: フォーム回答が保存されたスプレッドシートのタイムスタンプと、既に作成されたドキュメントの一覧です。特に、同じ回答が複数回記録されていないか確認してください。
  • 切り分けの軸: トリガーの設定(時間主導かフォーム送信時か)、スクリプト内の重複チェックロジック、手動実行と自動実行の区別、の3つで原因を切り分けます。
  • 注意点: 会社PCで管理されているスプレッドシートやスクリプトを編集する場合は、管理者の許可を得てから行ってください。不適切な編集で既存のデータや文書を誤って削除するリスクがあります。

ADVERTISEMENT

1. 重複作成が発生する主な原因

重複ドキュメントが作成される原因は、大きく分けて次の3つのパターンに分類できます。いずれも、スクリプトの動作タイミングやデータ管理の不備が根本にあります。

原因1:トリガーの二重設定

Google Apps Scriptでフォーム送信時のトリガーを設定している場合、誤って同じトリガーを複数登録してしまうケースがあります。また、時間主導トリガー(例:1分ごとに実行)とフォーム送信時トリガーが両方有効になっていると、同じ回答が処理されて重複が発生します。

原因2:スクリプト実行のタイムラグ

フォーム送信時にスクリプトが起動しても、処理が完了するまでに数秒から数十秒かかります。その間に同じ回答が再度送信されたり、手動でスクリプトを実行したりすると、重複処理が発生します。

原因3:重複チェックの欠如

スクリプト内で「既に文書が作成された回答かどうか」を確認するロジックが実装されていない場合、同じ回答が何度でも処理されます。特に、スプレッドシートの行データをループで処理する際に、処理済みのマークを付け忘れるとすぐに重複します。

2. 最初に確認すべきポイント

重複作成が起きたとき、まず何を調べればよいかを明確にしておきます。

確認ポイント1:トリガーの一覧を開く

  • スクリプトエディタの左メニューから「トリガー」アイコンをクリックし、現在設定されているトリガーを全て確認します。
  • 同じ関数に対して複数のトリガーが設定されていないか、特に「フォーム送信時」と「時間主導」が混在していないかチェックします。

確認ポイント2:回答スプレッドシートの状態を確認

  • フォーム回答が保存されているスプレッドシートを開き、最終行に「処理済み」を示す列(例:ステータス列)があるか確認します。
  • 同じ回答内容が複数行にわたって記録されていないか目視で確認します。手動で回答をインポートした場合などに生じます。

確認ポイント3:スクリプトの実行ログを確認

  • スクリプトエディタの「実行」メニューから「ログを表示」を開き、最近の実行履歴を確認します。エラーや重複実行の痕跡がないか調べます。
  • 各実行がどのトリガーで起動したかは、ログのタイムスタンプから推測できます。

3. 重複を防ぐための代表的な対策

ここでは、実際に多くの現場で採用されている対策を4つ紹介します。それぞれにメリット・デメリットがあるため、自社の運用に合った方法を選んでください。

対策方法 概要 メリット デメリット
ステータス列の追加 スプレッドシートに「処理済み」列を設け、スクリプト処理後に値を書き込む 実装が簡単で視覚的に管理しやすい 同時実行時に競合が発生する可能性がある
ユニークIDの生成 回答ごとにユニークなID(タイムスタンプ+乱数など)を生成し、ドキュメント名に埋め込む 確実に重複を防止できる コードが複雑になりがち
トリガーの見直し フォーム送信時のみのトリガーに統一し、時間主導トリガーを削除する 処理タイミングが明確で単純 フォーム送信が同時に大量に発生した場合に漏れが生じる
排他制御の導入 スクリプト内で「LockService」を使って排他ロックをかける 同時実行による重複を確実に防げる 処理時間が長くなることがある

4. スクリプトによる自動処理の設計ポイント

ここでは、実際にGASで重複を防止するコードの設計例を示します。以下の手順に沿って実装することで、多くの重複問題を解決できます。

  1. 回答スプレッドシートにステータス列を追加する: 最終列の右側に「ステータス」列(例:G列)を追加し、初期値は空白にしておきます。
  2. スクリプトエディタを開く: スプレッドシートの「拡張機能」→「Apps Script」から開きます。
  3. トリガーを設定する: 「トリガー」メニューから「新しいトリガー」を追加し、関数名とイベントの種類を「フォーム送信時」に設定します。既存のトリガーが複数ある場合は削除します。
  4. 重複チェックロジックを組み込む: 以下のようなコードで、スプレッドシートの最終行から順に未処理の行を探し、ドキュメント作成後にステータス列に「完了」と書き込みます。既に完了した行はスキップします。
  5. 排他ロックを追加する(オプション): 同時実行を防ぐために、LockService.getScriptLock()でロックを取得し、処理完了後に解放します。
  6. テスト実行する: フォームを実際に送信して、期待通りにドキュメントが1つだけ作成されることを確認します。ログも併せて確認します。

コードの具体的な記述例については、Google Apps Scriptの公式リファレンスや信頼できる情報源を参照してください。社内のセキュリティポリシーに沿って、必要に応じて管理者のレビューを受けてください。

5. 失敗パターンとその対処法

実際に現場でよく遭遇する失敗パターンと、その具体的な対処法をまとめます。

失敗パターン1:ステータス列の更新が競合する

複数のスクリプトが同時に実行された際、同じ行に対して「未処理」と判断してしまうことがあります。この場合、LockServiceを使って排他制御を導入してください。また、ステータス列の更新とドキュメント作成を同一トランザクションにすることが重要です。

失敗パターン2:フォーム回答が手動で追加された場合

フォームの回答シートに直接行を追加したり、CSVインポートを行ったりすると、トリガーが発動せず重複の原因になります。このようなケースでは、時間主導トリガーを併用して定期的に未処理行をチェックする方法も検討します。ただし、その際は重複チェックロジックを確実に実装してください。

失敗パターン3:トリガーが削除されないまま放置される

以前のテストで設定したトリガーがそのまま残っていると、予期せずスクリプトが実行されます。定期的にトリガーの一覧を確認し、不要なものは削除する習慣をつけましょう。

よくある質問(Q&A)

Q1. 重複防止のために、管理者に依頼すべきことは何ですか?

管理者には、スクリプトエディタへのアクセス権限の付与、トリガーの追加・削除、およびスプレッドシートの編集権限を依頼してください。また、LockServiceを使用する場合は、スクリプトの実行時間制限(GASの1日あたりの総実行時間)に注意するよう伝えてください。

Q2. 既に重複して作成されたドキュメントはどうすればいいですか?

重複文書は、タイトルや作成日時などで識別し、必要に応じて手動で削除するか、スクリプトで一括削除する機能を追加することも可能です。ただし、削除前に必ず内容を確認し、誤って必要な文書を削除しないようにしてください。

Q3. フォーム送信時トリガーだけでは不十分なケースはありますか?

フォーム送信時トリガーは、フォームから回答があった直後に実行されます。しかし、Googleのサーバー負荷やスクリプト実行制限により、稀にトリガーが失われることがあります。重要な業務で使用する場合は、バックアップとして定期的な時間主導トリガーを併用し、重複チェックを厳重に行うことをおすすめします。

6. まとめ

Googleフォーム回答からのドキュメント作成で重複を防ぐには、トリガーの適切な管理、ステータス列やユニークIDによる重複チェック、排他制御の導入が効果的です。最初にトリガー設定とスプレッドシートの状態を確認し、自社の運用に合った対策を選びましょう。スクリプトの変更は必ずテスト環境で検証した上で本番に適用してください。また、管理者と連携しながら定期的なメンテナンスを行うことで、長期的に安定した自動処理を実現できます。

ADVERTISEMENT

📄
Googleドキュメントトラブル完全解決データベースこの記事以外にも、書式・共有・Apps Script・引用など様々な困りごとへの解決策をまとめています。逆引きに活用してください。
この記事の監修者
✍️

超解決 第一編集部

疑問解決ポータル「超解決」の編集チーム。正確な検証と、現場視点での伝わりやすい解説を心がけています。

ADVERTISEMENT