「Googleフォームで集めた回答をそのまま使おうとしたら、列がバラバラで整形が大変…」そんな悩みを抱えている方は多いのではないでしょうか。この記事では、Google Apps Script(GAS)を使って、Googleフォームの回答を自動でスプレッドシートに整形・加工する仕組みを、コード付きで解説します。
フォームの回答が蓄積するたびに手動でコピー&ペーストしたり、列を並び替えたりする作業は、じつは完全に自動化できます。GASのフォーム送信トリガーを活用すれば、回答が届いた瞬間に自動で整形・別シートへ転記・通知まで行えます。
この記事でできること
- フォーム送信のたびに自動で回答を整形・加工する
- 必要な列だけを別シートに転記する
- 回答内容をフォーマットして担当者にメール通知する
- 重複回答の自動チェックと除外処理を実装する
事前準備(5分)
以下のものを用意してください。
- Googleアカウント(無料)
- Googleフォーム(回答先スプレッドシートと連携済み)
- Google Apps Script(フォームに紐づくコンテナバインドスクリプト)
フォームの回答先スプレッドシートが未設定の場合は、フォーム編集画面の「回答」タブ → 「スプレッドシートにリンク」から連携してください。
STEP 1:GASエディタを開いてスクリプトを作成する
フォームの回答が蓄積するスプレッドシートを開き、「拡張機能」→「Apps Script」を選択します。エディタが開いたら、デフォルトの関数を削除して以下のコードを貼り付けます。
// フォーム送信時に自動実行される関数
// スプレッドシートのフォームトリガーに設定する
function onFormSubmit(e) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const rawSheet = ss.getSheetByName('フォームの回答 1'); // 回答シート名
const destSheet = ss.getSheetByName('整形済み') || ss.insertSheet('整形済み');
// 最新の回答行を取得
const lastRow = rawSheet.getLastRow();
const startCol = 1, numRows = 1;
const rawData = rawSheet.getRange(lastRow, startCol, numRows, rawSheet.getLastColumn()).getValues()[0];
// ヘッダーを取得
const headerRow = 1, headerCol = 1, numHeaderRows = 1;
const headers = rawSheet.getRange(headerRow, headerCol, numHeaderRows, rawSheet.getLastColumn()).getValues()[0];
// 整形済みシートのヘッダーを初期化(初回のみ)
if (destSheet.getLastRow() === 0) {
const destHeaders = ['受付番号', 'タイムスタンプ', '名前', 'メールアドレス', 'お問い合わせ内容', 'ステータス'];
destSheet.appendRow(destHeaders);
destSheet.getRange(1, 1, 1, destHeaders.length).setFontWeight('bold');
}
// 受付番号を生成(例:REQ-0001)
const receiptNo = 'REQ-' + String(destSheet.getLastRow()).padStart(4, '0');
// タイムスタンプを整形(例:2026/04/17 09:30)
const timestamp = Utilities.formatDate(
new Date(rawData[0]),
'Asia/Tokyo',
'yyyy/MM/dd HH:mm'
);
// 回答データをマッピング(ヘッダー名でインデックスを取得)
const nameIdx = headers.indexOf('名前');
const emailIdx = headers.indexOf('メールアドレス');
const contentIdx = headers.indexOf('お問い合わせ内容');
// 整形したデータを作成
const formattedRow = [
receiptNo,
timestamp,
nameIdx >= 0 ? rawData[nameIdx] : '',
emailIdx >= 0 ? rawData[emailIdx] : '',
contentIdx >= 0 ? rawData[contentIdx] : '',
'未対応' // デフォルトステータス
];
// 整形済みシートに書き込み
destSheet.appendRow(formattedRow);
Logger.log('整形完了: ' + receiptNo);
}
STEP 2:ヘッダー名に合わせてマッピングをカスタマイズする
STEP 1のコードは「名前」「メールアドレス」「お問い合わせ内容」というフォーム質問名を前提にしています。自分のフォームに合わせて変更が必要な場合は、以下の部分を編集してください。
// ▼ ここを自分のフォームの質問名に変更する
const nameIdx = headers.indexOf('氏名'); // 「名前」→「氏名」に変更する例
const emailIdx = headers.indexOf('連絡先メール'); // 「メールアドレス」→「連絡先メール」
const contentIdx = headers.indexOf('相談内容'); // 「お問い合わせ内容」→「相談内容」
質問名が一致しない場合は indexOf が -1 を返し、空文字がセットされます。フォームのヘッダー名を「ログ」で確認したい場合は、以下のコードを追加して実行してください。
function checkHeaders() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const rawSheet = ss.getSheetByName('フォームの回答 1');
const headerRow = 1, headerCol = 1, numHeaderRows = 1;
const headers = rawSheet.getRange(headerRow, headerCol, numHeaderRows, rawSheet.getLastColumn()).getValues()[0];
Logger.log(headers); // ログでヘッダー一覧を確認
}
STEP 3:フォーム送信トリガーを設定する
GASはコードを書いただけでは動きません。フォームが送信されたときに自動実行されるよう「トリガー」を設定します。
- GASエディタ左側のメニューから「トリガー(時計アイコン)」をクリック
- 右下の「トリガーを追加」ボタンをクリック
- 実行する関数:onFormSubmit
- イベントのソース:「スプレッドシートから」
- イベントの種類:「フォーム送信時」
- 「保存」をクリック
初回は権限承認のポップアップが表示されます。「許可」→Googleアカウントを選択→「許可」の順にクリックしてください。
STEP 4:動作確認
テスト用のフォーム回答を送信し、「整形済み」シートに正しく転記されているか確認します。
トラブルシュートチェックリスト
- 「整形済み」シートが作成されない → シート名の自動生成に失敗している可能性。手動でシートを作成し、シート名が正確に「整形済み」であることを確認
- ヘッダーが空欄になる → フォームの質問名とコード内の文字列が一致しているか checkHeaders() で確認
- トリガーが動かない → 権限承認が完了しているか確認。GASのトリガー画面でエラーが出ていないかもチェック
- 受付番号が重複する → destSheet.getLastRow() は行数を返すので、削除・並び替えをすると重複が起きる。UUIDを使う方法に切り替えること
応用:さらに便利にする拡張アイデア
- メール自動通知:整形後に GmailApp.sendEmail() で担当者や回答者へ確認メールを自動送信する
- 重複チェック:メールアドレスを使って既存の回答と重複していないか検索し、重複行にフラグを立てる
- Slack通知連携:フォーム受付時にSlackのWebhookへPOSTして、チャンネルに即時通知する
- 条件分岐ルーティング:回答内容に応じて「整形済みA」「整形済みB」など複数シートに振り分ける
- PDF自動生成:回答内容をテンプレートDocumentに差し込んでPDF化し、Driveに自動保存する
まとめ
GASのフォーム送信トリガーを使えば、Googleフォームの回答を受け取った瞬間に自動整形・転記・通知まで行えます。手作業のコピー&ペーストや列の並び替えから解放され、業務効率が大きく改善します。
- フォームと連携したスプレッドシートのGASに onFormSubmit 関数を作成する
- ヘッダー名でインデックスを取得し、必要な列だけを整形して別シートに書き込む
- トリガーを「フォーム送信時」に設定すれば全自動で動く
- メール通知・Slack連携・重複チェックなどの拡張も簡単に追加できる
「自社のフォームに合わせてカスタマイズしたい」「もっと複雑な整形ロジックを実装したい」という方は、お気軽にお問い合わせください。


コメントを残す