oogleフォームの回答をGoogle Sheetsに連携すると、最初の運用はかなり楽です。
回答が1行ずつ追加されます。フィルタできます。CSVにもできます。必要ならApps Scriptで通知もできます。
ただ、チームで使い始めると、次の問題が出てきます。
誰がこの回答を見るのか
もう返信したのか
いま対応中なのか
営業メールやテスト回答を集計から外したのか
これはフォーム作成の問題ではなく、回答後の運用の問題です。
この記事では、Googleフォームの回答先スプレッドシートに、担当者 と 対応状況 を持たせる最小設計をまとめます。
先に結論
最低限、回答シートに次の列を追加します。
対応状況
担当者
最終更新日
次アクション
除外理由
最初はこれで十分です。
| 列 | 目的 |
|---|---|
| 対応状況 | 未対応、対応中、完了、除外を分ける |
| 担当者 | 誰が見るかを残す |
| 最終更新日 | いつ状態が動いたかを見る |
| 次アクション | 返信、確認、社内連携など次の動きを書く |
| 除外理由 | 営業メール、テスト回答、対象外などを説明する |
Slack通知やメール通知を入れても、この列は必要です。
通知は「気づくため」の仕組みです。対応状況は「仕事がどこまで進んだか」を残す仕組みです。
Googleフォームだけでできること
Googleフォームの公式ヘルプでは、フォームの回答をフォーム画面で確認したり、回答先のスプレッドシートで見たり、CSVでダウンロードしたりできます。新しい回答についてメール通知を受け取る設定もあります。
これだけでも、小さなアンケートや単発の申込なら足ります。
フォームを作る
回答が入る
Sheetsで見る
必要ならCSVで出す
ただ、ここには「誰が対応するか」「対応が完了したか」という業務状態はありません。
Googleフォームが悪いという話ではありません。
回答収集と対応管理は、別の仕事なんです。
対応状況は4つから始める
最初のステータスは、これくらいで十分です。
| 対応状況 | 意味 |
|---|---|
| 未対応 | まだ誰も処理していない |
| 対応中 | 誰かが確認や返信を始めている |
| 完了 | 必要な対応が終わった |
| 除外 | 営業メール、スパム、テスト回答、対象外 |
確認待ち や 保留 を最初から増やしすぎると、運用が重くなります。
まずは 未対応 / 対応中 / 完了 / 除外 で回して、足りなくなったら増やすほうが安全です。
大事なのは、自由入力にしないことです。
未対応
未処理
未返信
まだ
pending
こういう表記ゆれが出ると、フィルタも集計も崩れます。
Google Sheetsで運用するなら、データの入力規則でプルダウンにしておくのがおすすめです。
担当者と対応状況は別にする
よくある失敗は、担当者が決まっただけで、対応中になった気がしてしまうことです。
でも、これは別です。
担当者が入っている
対応中になっている
返信が終わっている
完了している
全部違います。
たとえば、担当者が 田中 になっていても、対応状況が 未対応 なら、まだ手が動いていないかもしれません。
逆に、対応状況が 対応中 なのに担当者が空欄なら、誰が責任を持つのか分かりません。
最低限、次のルールにします。
未対応: 担当者は空欄でもよい
対応中: 担当者を必須にする
完了: 最終更新日を入れる
除外: 除外理由を入れる
これだけで、週次確認がかなり楽になります。
Slack通知はステータスではない
Googleフォームの回答をSlackに通知する構成は実用的です。
Apps Scriptのインストール型トリガーを使うと、フォーム送信などのイベントで関数を自動実行できます。UrlFetchApp.fetch() を使えば、外部URLへHTTP/HTTPSリクエストを送れます。Slack Incoming Webhooksは、発行されたURLへJSONペイロードを送ってチャンネルに投稿する仕組みです。
つまり、こういう構成は作れます。
Googleフォーム
-> Google Sheets
-> Apps Script
-> Slack Incoming Webhook
-> Slackチャンネル
ただし、Slackに流れたことは「気づいたかもしれない」という合図であって、対応が進んだ証拠ではありません。
Slackリアクションで 見ました を付ける運用もあります。小さなチームなら十分なこともあります。
でも、後から一覧で見るなら、回答レコード側に状態を残したほうが安全です。
Slack: 気づく場所
Sheets: 状態を残す場所
この役割を分けます。
Apps Scriptで初期状態だけ入れる例
回答が入ったときに、初期ステータスだけ自動で入れるなら、次のような考え方です。
function onFormSubmit(e) {
const sheet = e.range.getSheet();
const row = e.range.getRow();
const headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
setCellByHeader(sheet, headers, row, "対応状況", "未対応");
setCellByHeader(sheet, headers, row, "最終更新日", new Date());
}
function setCellByHeader(sheet, headers, row, headerName, value) {
const index = headers.indexOf(headerName);
if (index === -1) return;
sheet.getRange(row, index + 1).setValue(value);
}
このコードは、回答行が追加されたときに 対応状況 を 未対応 にし、最終更新日 を入れるだけです。
通知先を変える、担当者を自動判定する、営業メールを除外する、といった処理を足すこともできます。
ただし、最初から全部をGASに入れすぎないほうがいいです。
業務ルールがコードの中に隠れると、あとで引き継ぎづらくなります。
色だけで管理しない
Sheetsでよくあるのが、行の色だけで管理する方法です。
黄色: 対応中
緑: 完了
グレー: 除外
見た目では分かりやすいです。
でも、色だけだとフィルタや集計がしにくいです。コピーしたときに崩れることもあります。人によって色の意味を忘れることもあります。
色を使うなら、必ず 対応状況 列を正本にします。
対応状況 = 完了
行の色 = 緑
この順番です。
色は補助。値が正本です。
除外は削除しない
営業メール、スパム、テスト送信が来たときに、行を削除したくなることがあります。
でも、最初は削除せず 除外 にしたほうが説明しやすいです。
今週の回答: 20件
正当な問い合わせ: 14件
営業メール: 4件
テスト送信: 2件
このように分けられるからです。
行を消すと、なぜ件数が減ったのか分からなくなります。
集計から外したいなら、削除ではなく 除外 と 除外理由 を使います。
FORMLOVAではどう考えているか
FORMLOVAでは、フォーム回答を単なる行としてではなく、公開後の運用イベントとして扱っています。
実際の検証では、次のような流れを確認しています。
回答一覧の名前を出して
参加人数が3名の名前を一覧で教えて
その方々が回答内容全てを教えてください
その2名を対応中のステータスにして
この流れで大事なのは、一覧、絞り込み、詳細確認、ステータス更新が分断されていないことです。
Slackに通知するだけではなく、回答そのものの状態を進めます。
Google Sheetsに出すだけではなく、今どの回答が新規で、どれが対応中なのかを見ます。
これは、Googleフォーム + Sheets + GASを否定する話ではありません。
むしろ、Sheetsで限界まで頑張るときにも同じ考え方が必要です。
回答レコードに状態を持たせる。
担当者と対応状況を分ける。
通知と進捗を分ける。
この3つを決めるだけで、対応漏れはかなり見えやすくなります。
チェックリスト
Googleフォームの回答をチームで見るなら、最低限ここを確認します。
[ ] 回答先Sheetsに「対応状況」列がある
[ ] 対応状況はプルダウンになっている
[ ] 最小ステータスは 未対応 / 対応中 / 完了 / 除外
[ ] 対応中にする時は担当者を入れる
[ ] 完了時は最終更新日を入れる
[ ] 除外時は除外理由を残す
[ ] Slack通知には記録場所と初期ステータスを入れる
[ ] Slackリアクションだけを正本にしない
[ ] 色だけで管理しない
[ ] 営業メールやテスト回答をすぐ削除しない
まとめ
GoogleフォームとGoogle Sheetsは、回答を集めて一覧にするには便利です。
でも、チームで使うなら、回答が届いた後の状態を別で設計する必要があります。
まずは、回答シートに 対応状況 と 担当者 を持たせます。
次に、未対応 / 対応中 / 完了 / 除外 を固定します。
そのうえで、Slack通知やGASは補助として使います。
Slackに流れたことは、対応が完了した証拠ではありません。
回答レコードに状態が残って、はじめて後から追えます。
参考
- Googleフォームの回答を表示、管理する - Google ドキュメント エディタ ヘルプ
- Installable triggers - Google Apps Script
- Class UrlFetchApp - Google Apps Script
- Sending messages using incoming webhooks - Slack
