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

GASGoogleフォーム業務自動化
Googleフォーム回答をGASで自動集計・処理のサムネイル

Googleフォームの回答を手作業で集計するのは、時間も手間もかかる。特に中小企業の経営者さんやフリーランスの方なら、できるだけ効率化して業務時間を減らしたいですよね。おじさんもGAS(Google Apps Script)を使って、Googleフォームの回答を自動で集計・処理する仕組みを作っているけど、今日はそんなノウハウをシェアするよ。


なぜGASでGoogleフォームの回答を自動処理するのか?

Googleフォームの回答はスプレッドシートに自動で記録されるけど、そのままだとデータの整理や集計、抽出、バックアップが面倒。おじさんの経験上、以下のポイントが重要だ。

  • 既存の回答データを消さずに履歴を残すこと
    大事なデータを誤って削除しちゃったら大損失。だから、既存シートの内容はそのままに新しい日時付きのシートやファイルに出力する。

  • 入力検証を挟むこと
    フォームの回答が想定外の場合はエラー処理や警告を出せると安心。

  • まとめて書き込む(Batch Write)
    スプレッドシートの書き込みは回数を減らすと処理が速くなるので、まとめて一括処理。

  • バックアップと復元ができること
    何かあってもすぐに前の状態に戻せる仕組みを用意する。

  • Googleアカウントの利用枠内で追加の専用SaaS料金なしで運用可能
    ただしApps Scriptのquota・実行上限はあるので注意。


初期設定と必要な権限

  1. Googleフォームと連携したスプレッドシートを用意する
    フォームの回答先としてスプレッドシートを設定しておく。

  2. GASプロジェクトを作成
    フォームの回答スプレッドシートからメニュー「拡張機能」→「Apps Script」で新規プロジェクトを作成。

  3. 必要な権限

    • スプレッドシートの読み書き権限
    • Drive APIを有効にする場合はDriveへのアクセス権限(バックアップ用)
    • トリガー設定権限(インストール可能トリガーの設定に必要)
  4. 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を使うことで書き込み回数を削減し処理を高速化。
  • cleardeleteRowsなどの削除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ツールを試してみてね。

GASおじラボで500ツール使い放題 →