Googleフォーム回答をGASで自動集計・処理

Googleフォームの回答を手作業で集計するのは、時間も手間もかかる。特に中小企業の経営者さんやフリーランスの方なら、できるだけ効率化して業務時間を減らしたいですよね。おじさんもGAS(Google Apps Script)を使って、Googleフォームの回答を自動で集計・処理する仕組みを作っているけど、今日はそんなノウハウをシェアするよ。
なぜGASでGoogleフォームの回答を自動処理するのか?
Googleフォームの回答はスプレッドシートに自動で記録されるけど、そのままだとデータの整理や集計、抽出、バックアップが面倒。おじさんの経験上、以下のポイントが重要だ。
既存の回答データを消さずに履歴を残すこと
大事なデータを誤って削除しちゃったら大損失。だから、既存シートの内容はそのままに新しい日時付きのシートやファイルに出力する。入力検証を挟むこと
フォームの回答が想定外の場合はエラー処理や警告を出せると安心。まとめて書き込む(Batch Write)
スプレッドシートの書き込みは回数を減らすと処理が速くなるので、まとめて一括処理。バックアップと復元ができること
何かあってもすぐに前の状態に戻せる仕組みを用意する。Googleアカウントの利用枠内で追加の専用SaaS料金なしで運用可能
ただしApps Scriptのquota・実行上限はあるので注意。
初期設定と必要な権限
Googleフォームと連携したスプレッドシートを用意する
フォームの回答先としてスプレッドシートを設定しておく。GASプロジェクトを作成
フォームの回答スプレッドシートからメニュー「拡張機能」→「Apps Script」で新規プロジェクトを作成。必要な権限
- スプレッドシートの読み書き権限
- Drive APIを有効にする場合はDriveへのアクセス権限(バックアップ用)
- トリガー設定権限(インストール可能トリガーの設定に必要)
installable trigger(インストール可能トリガー)を設定する
フォームの回答が送信されたときに処理を自動実行するために、GASの「トリガー」から「フォーム送信時」を条件に関数を紐付ける。
コード例:Googleフォーム回答の自動集計とバックアップ
以下のコードは、フォーム回答データを読み込み、入力検証を行い、結果を新しい日時付きのシートに一括書き込み。さらに元データのバックアップをGoogleドライブの新しいスプレッドシートファイルに作成する例だ。
function processFormResponses(e) {
// トリガーから呼ばれる関数。e.namedValuesにフォーム回答が入る。
// 回答スプレッドシートIDと元シート名(フォーム回答シート)
const SPREADSHEET_ID = 'ここにあなたのスプレッドシートIDを入れる';
const FORM_SHEET_NAME = 'フォームの回答 1'; // フォーム回答シート名
// 1. 元の回答シートを開く
const ss = SpreadsheetApp.openById(SPREADSHEET_ID);
const formSheet = ss.getSheetByName(FORM_SHEET_NAME);
if (!formSheet) {
Logger.log('回答シートが見つかりません');
return;
}
// 2. 元データを配列で取得(ヘッダー含む)
const data = formSheet.getDataRange().getValues();
// 3. 入力検証(例: 回答に空欄がないかチェック)
const header = data[0];
const rows = data.slice(1);
for (let i = 0; i < rows.length; i++) {
const row = rows[i];
for (let j = 0; j < row.length; j++) {
if (row[j] === '' || row[j] === null) {
Logger.log(`入力検証エラー: 行${i + 2} 列${j + 1}が空欄です`);
// 必要に応じて通知処理を追加可能
}
}
}
// 4. 新しいシート名に日時を付与して作成
const timestamp = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyyMMdd_HHmmss');
const newSheetName = `集計結果_${timestamp}`;
const newSheet = ss.insertSheet(newSheetName);
// 5. 一括書き込み(ヘッダー+データ)
newSheet.getRange(1, 1, data.length, data[0].length).setValues(data);
// 6. バックアップ用スプレッドシートを新規作成して元データをコピー
const backupSS = SpreadsheetApp.create(`フォーム回答バックアップ_${timestamp}`);
const backupSheet = backupSS.getSheets()[0];
backupSheet.getRange(1, 1, data.length, data[0].length).setValues(data);
// 7. ログ出力
Logger.log(`処理完了: 新シート「${newSheetName}」作成、バックアップ作成完了`);
}
ポイント解説
- 元のデータは一切消さずに新しいシートを作って書き込むので安心。
- バックアップは別ファイルで作成し、万が一の復元に備える。
- 入力検証は「空欄チェック」の簡単な例だが、用途に応じて拡張可能。
- 一括でsetValuesを使うことで書き込み回数を削減し処理を高速化。
clearやdeleteRowsなどの削除APIは使っていない。- 実行はフォーム送信時のインストール可能トリガーを設定して自動化するのがベスト。
復元手順とトラブル回避
- バックアップ用スプレッドシートはGoogleドライブに保存されるので、必要時はファイルを開いて元の回答シートにコピー&ペーストすれば復元可能。
- トリガーを設定した後は、権限承認ダイアログが出るので、必ず承認しておくこと。
- 実行上限に達すると処理が止まるため、回答数が膨大な場合は処理を分割するなど工夫が必要。
- 個人情報を扱う場合はGoogleのガイドラインや法令に従い適切に管理すること。
導入効果の試算(例)
たとえば、おじさんの知り合いの中小企業さんが回答集計に毎回30分かけていたとする。
- 1ヶ月に20回集計すると30分×20回=10時間/月
- 時給3,000円換算で3万円/月の人件費
- GASで自動化できればほぼ0分に近づけるので、単純計算で月3万円×12ヶ月=36万円のコスト削減効果が期待できる(実際の効果は業務内容により異なる)。
- 追加費用なしでGoogleアカウントの利用枠内(Apps Scriptのquotaあり)で運用可能。
まとめ
- Googleフォームの回答はGASで自動集計・バックアップを作るのが効率的。
- 既存データを消さず、新規シート・新規ファイルに書き込む設計が安全。
- 入力検証やバッチ処理で信頼性と速度を両立。
- installable triggerでフォーム送信時に自動実行。
- コストをかけずに業務自動化が可能だが、スクリプトの実行上限には注意。
GASを使いこなせば、こうしたちょっとした業務が驚くほど楽になる。おじさんのノウハウやツールが気になる方は、ぜひメンバーシップで500以上のGASツールを試してみてね。