CONCEPT — FORM RESPONSE AGGREGATION
Googleフォームの集計を自動化する方法:スプレッドシート連携・関数・GAS・通知
Googleフォームの集計の自動化とは、フォームに届いた回答をスプレッドシートへ自動でためて、別のシートの関数で件数や合計を出し、必要ならGAS(Google Apps Script)で担当者への通知や別の台帳への転記まで動かすことです。手で集計表を作り直す作業がなくなり、回答が届いた時点で数が更新されます。この記事では、Googleの公式ヘルプで確かめた手順と上限を、説明用の仮想例を使って順に書きます。
フォームの集計を自動化すると、どの作業がなくなるか
説明用の仮想例として、社員30人の会社の総務担当が、備品の購入申請をGoogleフォームで受けている場面を考えます。毎週月曜に回答を開き、部署ごとの件数と金額の合計を手で数えて表にし、経理と部長にメールで送っています。自動化すると、この3つの作業が仕組みに置き換わります。
- 回答を集計表へ写す作業:回答はスプレッドシートの回答シートに1件1行で自動的にたまるので、写す作業がなくなります。
- 部署ごとの件数と金額を数える作業:別の集計シートに書いた関数が、回答が届くたびに数を出し直します。
- 経理と部長に知らせる作業:回答が届いた時点で、GASが申請の中身をメールで送ります。週ごとのまとめは、決めた曜日と時刻にGASが送ります。
4つの部品(フォーム・回答シート・集計シート・通知)のうち、どこまで作るかは回答の数と、回答を誰が使うかで決めます。線引きは後半の節で書きます。
今集計しているフォームがあれば、その項目名と、集計した表を誰に渡しているかを書いて送ってください。どの部品から作るかをお返しします。
手順1:回答の保存先をスプレッドシートにする
Googleの公式ヘルプ「フォームの回答の保存先を選択する」に書かれている手順は、フォームを開き、「回答」タブの「概要」でその他アイコンから「回答の送信先を選択」を押し、新しいスプレッドシートを作るか既存のスプレッドシートを選ぶ、の順です。
- 回答の形:同じヘルプには、回答をスプレッドシートに保存するとデータが自動的にテーブル形式になると書かれています。1件の回答が1行、1つの質問が1列になります。
- 権限:新しく作った回答用スプレッドシートには、フォームの共同編集者が自動的にアクセスできます。その後にフォームの権限を変えても、スプレッドシートの権限は自動では同期されません。経理や部長に見せるときは、スプレッドシート側で共有を設定します。
- つなぎ直し:フォームとスプレッドシートのリンクを解除すると、新しい回答は送られなくなりますが、それまでのデータはスプレッドシートに残ります。
- 消すとき:スプレッドシートを削除してもフォームは消えず、フォームを削除してもスプレッドシートは消えません。フォームから回答を削除すると元に戻せないため、回答の整理はスプレッドシート側でします。
フォームの質問を後から足したり名前を変えたりすると、回答シートの列も変わります。質問を変える日は、集計シートの式が見ている列名もその日に確かめます。入力のばらつきを質問の作り方で減らす方法は「フォーム入力がバラバラで後工程が地獄になる問題」の記事で書いています。
手順2:回答シートには触らず、集計シートを別に作る
回答シートは、フォームが書き込む原本として扱います。並べ替えや色付け、合計の行を回答シートに足すと、次の回答がどこに入ったか追いにくくなり、誰が何を変えたかも分からなくなります。集計は同じスプレッドシートに「集計」シートを足して、そこに関数で作ります。
- COUNTIF:Googleのヘルプでは「範囲内で条件に一致する要素の個数を返します」と説明されています。選択式の質問の件数を数えるのに使います。
- QUERY:データに対してGoogle Visualization APIのクエリ言語で問い合わせる関数です。部署ごと・月ごとにまとめた表を1つの式で作れます。
- ピボットテーブル:[挿入]→[ピボット テーブル]で作ります。ヘルプには、列ごとに見出しを付ける必要があると書かれています。部署別と月別を画面で入れ替えて試すときに向いています。毎週同じ形の表を人に渡すときは、上の関数で表を固めておくと、受け取る人が毎回同じ場所で数を読めます。
部署ごとの件数(集計シートのB2。A2に部署名)
=COUNTIF('フォームの回答 1'!B:B, A2)
部署ごとの金額の合計(集計シートのC2)
=SUMIF('フォームの回答 1'!B:B, A2, 'フォームの回答 1'!D:D)
部署と金額の一覧を、金額の大きい順に(集計シートのE1)
=QUERY('フォームの回答 1'!A:D, "select B, sum(D) where B is not null group by B order by sum(D) desc", 1)
式の範囲は B2:B100 のように行を区切らず、B:B のように列全体を指定します。回答が101件目になっても式を直さずに済みます。
グラフは集計シートの表から作ります。回答シートから直接グラフを作ると、質問を足したときに範囲がずれます。
手順3:通知は、標準のメール通知とGASを使い分ける
フォームには、回答が届いたらメールで知らせる設定が最初からあります。Googleのヘルプ「フォームの回答を表示、管理する」では、「回答」タブのその他アイコンから「新しい回答についてのメール通知を受け取る」を押す手順が書かれています。自分が回答の到着を知るだけなら、これで足ります。
- 標準のメール通知で足りる:フォームの持ち主が、回答が来たことを知りたいだけのとき。
- GASにする:経理や部長など決まった人へ、申請の中身(部署・品名・金額)を本文に入れて送りたいとき。金額が一定以上のときだけ部長にも送る、のように条件で送り先を変えたいとき。
- GASにする:回答を別のスプレッドシートの台帳(備品台帳・顧客台帳)へ1行足したいとき。
function notifyOnSubmit(e) {
const v = e.namedValues;
const lines = Object.keys(v).map(k => k + ':' + v[k].join(', '));
const amount = Number(v['金額'][0]);
const to = amount >= 50000 ? 'keiri@example.com,bucho@example.com' : 'keiri@example.com';
MailApp.sendEmail(to, '備品の購入申請:' + v['部署'][0], lines.join('\n'));
}
スプレッドシート側のフォーム送信時トリガーでは、e.namedValues に質問名と回答の組が入ります。フォーム側にトリガーを付けた場合は e.response に回答全体が入ります(Google Apps Scriptのイベントオブジェクトの説明による)。同じ処理を両方に付けると2回動くため、どちらか1つにします。
自分で設定するトリガー(インストール可能なトリガー)は、作った人のアカウントで動きます。失敗しても画面にはエラーが出ず、作った人に失敗の要約メールが届き、Apps Scriptの「実行数」の画面で確かめられます。
回答の数と通知の宛先を書いて送ってもらえれば、標準の通知で足りるか、GASにするかをお返しします。
週ごとのまとめは、時間を決めて送る
回答のたびにメールが来ると、件数が多い週は読まれなくなります。部長に渡すのが「先週の部署ごとの件数と合計」なら、回答ごとの通知はやめ、時間主導のトリガーで毎週月曜の朝に集計シートの表を送ります。
- 送る中身は、集計シートの表をそのまま本文に入れるか、集計シートのURLだけを送るかを先に決めます。URLだけなら、受け取る人がスプレッドシートを見られる権限を持っているかを確かめます。
- 回答ごとの通知は経理だけに残し、部長には週1回のまとめだけを送る、のように受け取る人ごとに頻度を分けます。
- まとめのメールには、集計シートの最終更新の時刻と件数を入れます。回答が0件の週もメールを送ると、トリガーが止まっていないことが分かります。
Googleの上限と、手作業の集計表をやめて仕組みにする線引き
どこまで仕組みにするかは、回答の数、回答を使う人の数、回答のたびに発生する作業があるかで決めます。最初の3つは、冒頭の図の下段の3段と同じです。
- フォームの「回答」タブの概要を見るだけでよい:見るのは自分だけで、件数と割合が分かればよいとき。社内アンケートや、月に数十件の申込受付がこれに当たります。
- 関数の集計シートにする:毎週、回答を見て手で集計表を作り直しているとき。部署別・担当別・月別の数を誰かに渡しているとき。集計表を作る時間が週に30分を超えるなら、関数に任せる目安になります。
- GASで通知と転記まで動かす:回答のたびに決まった人へ知らせる、別の台帳へ写す、返信メールを送る作業が毎回あるとき。
- スプレッドシートの外に移す:回答を複数のフォームから1つの台帳に集める、同時に何人もが台帳を直す、変更の履歴を残す必要があるときは、スプレッドシートでの台帳運用の限界に近づいています。
Googleの公式ヘルプには、回答の概要が表示されないときは回答数が5万件を超えていること、スプレッドシートに同期されないときは10万件を超えていることが原因として考えられると書かれています。同じページには、2026年9月から1つのフォームの回答数の上限が50万件、合計保存容量が1GBになると書かれています。
Apps Scriptの割り当ての表では、1日あたりのメール受信者数が一般ユーザー向けアカウント(gmail.com など)で100、Google Workspaceのアカウントで1,500、トリガーの合計実行時間が一般ユーザー向けで90分/日、Workspaceで6時間/日、1回の実行時間はどちらも6分です。回答ごとに3人へ送る通知は、一般ユーザー向けアカウントだと1日33件ほどの回答で受信者数の上限に届きます。
トリガーの持ち主と通知先を、共有ドライブの台帳に1行で残す
GASのトリガーは作った人のアカウントで動くため、作った人が異動や退職でアカウントを止めると、通知も転記も黙って止まります。止まったことに気づくのは、届くはずのメールが来ないと誰かが言い出したときです。
回答用スプレッドシートとGASは、会社の共有ドライブに置きます。同じ共有ドライブに「フォーム自動化の台帳」のシートを1つ作り、フォームごとに1行、フォーム名・回答用スプレッドシートのURL・トリガーを作った人・トリガーの種類(フォーム送信時/毎週月曜8時など)・通知の宛先・最後に動作を確かめた日を書きます。
担当者が替わる日は、この台帳の行を見ながら新しい担当者のアカウントでトリガーを作り直し、テストの回答を1件送って通知が届くことを確かめてから、前の担当者のトリガーを消します。台帳の「最後に動作を確かめた日」をその日に書き換えます。
よくある質問
Q. 回答が増えると、集計シートの式を直す必要がありますか?
COUNTIF や QUERY の範囲を B:B や A:D のように列全体で指定しておけば、回答が増えても式はそのままで数が更新されます。ピボットテーブルも、範囲を列全体で指定すれば回答の増加に合わせて集計されます。関数の書き方は Google のCOUNTIF のヘルプとQUERY のヘルプにあります。
Q. 回答の通知を、自分以外の人にも送れますか?
フォームの標準のメール通知は、設定した人が自分で受け取るための機能です。経理や部長など決まった人へ回答の中身を送るときは、GASのフォーム送信時トリガーで MailApp を使います。1日に送れる受信者数には上限があり、Apps Script の割り当てでは一般ユーザー向けアカウントで100、Google Workspace で1,500です(2026年10月31日に確認)。
Q. GASの通知が急に届かなくなりました。何を確かめればいいですか?
まず、トリガーを作った人のアカウントが使える状態か(異動・退職で止まっていないか)を確かめます。次に Apps Script の「実行数」の画面で、失敗した実行とエラーを見ます。インストール可能なトリガーの説明には、失敗しても画面にはエラーが出ず、作った人に失敗の要約メールが届くと書かれています。
Q. フォームの回答は何件まで保存できますか?
フォームの回答を表示、管理するのヘルプには、2026年9月から1つのフォームあたりの回答数50万件、合計保存容量1GBの上限が適用されると書かれています。回答の概要が出ないときは5万件、スプレッドシートに同期されないときは10万件を超えていることが原因として考えられる、とも書かれています。
Q. スプレッドシートとのつなぎ方の公式の手順はどこにありますか?
Google のフォームの回答の保存先を選択するに、回答タブから回答の送信先を選ぶ手順、権限が自動で同期されないこと、リンクを解除してもデータが残ることが書かれています。
集計しているフォームの項目を送って、自動化の進め方を聞く
フォームの質問の一覧、月の回答数、集計した表を誰に渡しているかを書いて送ってください。概要タブで足りるか、関数の集計シートにするか、GASで通知と転記まで動かすかと、最初に作る部品をお返しします。