問い合わせフォームの回答が届くたびに、内容を読んで見積もり担当や経理担当へ転送している場合、転送漏れや宛先の間違いが起きやすくなります。
担当者が休みの日に届いた問い合わせが誰の目にも触れないまま放置される、という事故も珍しくありません。
この記事では、Google Apps Scriptでフォーム回答の種別を判定し、担当者への通知と種別別シートへの記録までを自動化する仕組みをまとめました。
完成イメージと振り分け表の設計
完成すると、フォームが送信された瞬間に問い合わせ種別が判定され、担当する社員へ通知メールが届きます。
同時に、種別ごとに用意したシートへ回答内容が自動で追記されるため、担当者は自分の担当分だけをまとめたシートを開けば済むようになります。
振り分けの中心になるのが「振り分け設定」というシートです。
種別・担当者メール・記録先シート名を1行にまとめておけば、担当者が変わったときや問い合わせ種別が増えたときも、コードを触らずに表を書き換えるだけで対応できます。
| 種別 | 担当者メール | 記録先シート名 |
|---|---|---|
| 見積もり | 見積もり | |
| 請求内容の確認 | 請求 | |
| クレーム | クレーム | |
| 表にない種別・空欄 | 既定の担当者(コード側で指定) | 未分類 |
フォームの申請にもう一段階、承認という手順を足したい場合は、別記事で扱っています。

手順
フォームの準備からトリガー設定までは、大きく3つのステップです。
Step1. フォームと振り分け設定シートを準備する
Googleフォームで問い合わせフォームを作り、氏名・メールアドレス・問い合わせ種別(プルダウン)・内容の4項目を用意します。
回答をスプレッドシートに送るよう設定すると、A列に送信日時、B列に氏名、C列にメールアドレス、D列に問い合わせ種別、E列に内容が自動で並ぶシートができます。
続けて、同じスプレッドシートに「振り分け設定」という名前のシートを追加してください。
1行目を見出し行にし、A列を「種別」、B列を「担当者メール」、C列を「記録先シート名」とします。
2行目以降に、問い合わせ種別ごとの担当者と記録先シート名を1行ずつ入力すれば準備は完了です。
Step2. コードを貼り付ける(コード全文)
スプレッドシートのメニューから拡張機能を開き、Apps Scriptを選んでスクリプトエディタを開きます。
表示されているコードを全て消し、次のコードをまるごと貼り付けてください。
function onFormSubmitRouteInquiry(e) {
const responseSheetName = 'フォームの回答 1'; // ★ここを変える: フォームの回答が入るシート名
const routingSheetName = '振り分け設定'; // ★ここを変える: 振り分け表のシート名
const defaultOwnerEmail = 'support@example.com'; // ★ここを変える: 振り分け表に一致しないときの既定担当者
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const responseSheet = spreadsheet.getSheetByName(responseSheetName);
const routingSheet = spreadsheet.getSheetByName(routingSheetName);
const lastRow = responseSheet.getLastRow();
const rowValues = responseSheet.getRange(lastRow, 1, 1, 5).getValues()[0];
const applicantName = rowValues[1];
const applicantEmail = rowValues[2];
const inquiryType = rowValues[3];
const inquiryBody = rowValues[4];
const routingRules = routingSheet.getRange(2, 1, routingSheet.getLastRow() - 1, 3).getValues();
const matchedRule = routingRules.find((rule) => rule[0] === inquiryType && rule[1] !== '');
const ownerEmail = matchedRule ? matchedRule[1] : defaultOwnerEmail;
const logSheetName = matchedRule ? matchedRule[2] : '未分類';
const logSheet = getOrCreateLogSheet(spreadsheet, logSheetName);
logSheet.appendRow([rowValues[0], applicantName, applicantEmail, inquiryType, inquiryBody]);
const subject = matchedRule ? `【${inquiryType}】新しい問い合わせが届きました` : '【未分類】担当者未設定の問い合わせが届きました';
const body = [
`${applicantName}様(${applicantEmail})から問い合わせが届きました。`,
'',
`種別: ${inquiryType}`,
`内容: ${inquiryBody}`,
].join('\n');
MailApp.sendEmail(ownerEmail, subject, body);
}
function getOrCreateLogSheet(spreadsheet, sheetName) {
const existingSheet = spreadsheet.getSheetByName(sheetName);
if (existingSheet) {
return existingSheet;
}
const newSheet = spreadsheet.insertSheet(sheetName);
newSheet.appendRow(['日時', '氏名', 'メールアドレス', '種別', '内容']);
return newSheet;
} onFormSubmitRouteInquiry が送信直後の行から氏名・メールアドレス・種別・内容を読み取り、振り分け設定シートの表と照合します。
該当する種別が見つかれば担当者メールと記録先シート名を採用し、見つからなければdefaultOwnerEmailと「未分類」シートにフォールバックします。
getOrCreateLogSheetは記録先シートがまだ存在しないときに見出し付きで新規作成する関数で、種別を追加した直後で記録先シートを手作業で作り忘れても処理が止まりません。
Step3. onFormSubmitトリガーを設定する
スクリプトエディタ左側の時計マーク「トリガー」を開き、右下の「トリガーを追加」を押します。
実行する関数にonFormSubmitRouteInquiry、イベントのソースにスプレッドシート、イベントの種類にフォーム送信時を選んで保存すれば設定は完了です。
以降はフォームが送信されるたびに、この関数が自動で実行されます。
回答をシンプルに転記するだけで足りる場合は、以下の記事も参考になります。

担当者不在時の逃がし先
振り分け表に無い種別が来たり、担当者メールの欄を空欄のまま行を追加してしまったりすると、通知が届かず問い合わせが宙に浮きます。
このコードでは、そうした行は自動的に既定担当者(defaultOwnerEmail)へ通知し、「未分類」シートに記録する設計にしてあるため、少なくとも通知が完全に消えることはありません。
既定担当者を一次受付として固定し、未分類シートに溜まった問い合わせを見ながら振り分け表に種別を追加していく運用が現実的です。
担当者の異動や退職で宛先が変わったときも、コードを直す必要はなく振り分け設定シートの担当者メール欄を書き換えるだけで反映されます。
どの問い合わせから自動化に着手すべきか迷う場合は、着手順の考え方を別記事にまとめました。

Google Apps Scriptでのフォーム振り分けについて相談してみませんか?
「種別が増えるたびに条件分岐を書き足していて管理しづらい」「複数人へ同時に通知したい」「社内にGoogle Apps Scriptを設計できる人材がいない」
少しでもお心当たりがあれば、お気軽にご相談ください。
現在、Google Apps Scriptを使った業務自動化のお悩みをお伺いする 無料の個別相談 を実施しています。
よくある質問
Q. 同じ種別を複数の担当者に同時に通知したいです。
MailApp.sendEmailの宛先はカンマ区切りの文字列で複数指定できます。
振り分け設定シートの担当者メール欄に「 a@example.com , b@example.com 」のように書いておけば、コードを変えずに複数人へ届く仕組みです。
Q. 問い合わせ種別のプルダウンを増やしたときはコードも直す必要がありますか?
振り分け設定シートに行を1つ追加するだけで対応できます。
コードはfindで種別ごとに表を検索しているため、種別の追加や担当者の変更ではコード自体を変更する必要がありません。
Q. 未分類シートに溜まった問い合わせは誰が確認すればいいですか?
defaultOwnerEmailに指定した既定担当者が一次窓口として確認する運用が現実的です。
未分類に溜まる件数が増えてきたら、その内容を見て振り分け設定シートに新しい種別の行を足していけば、未分類は徐々に減っていきます。
Q. フォームの回答自体は元のシートにも残りますよね。二重管理になりませんか?
フォーム回答は元のシート(Step1で作ったフォームの回答 1)にも全件残るため、種別別シートは担当者が自分の担当分だけを見るための絞り込み用の記録です。
データとしては重複しますが、正となるのはあくまで元のフォーム回答シートで、種別別シートは通知と一緒に作る副次的な記録という位置づけです。