実験トップ

GAS×Googleフォーム · 登録不要 · コード全文

Googleフォームの回答者に、
自動返信メールを送る(GAS)。

問い合わせ・予約・申込みフォームで「受け付けました」のメールを自動で返すと、届いたかどうかの確認電話や二重送信がぐっと減ります。このページでは Google Apps Script(GAS)で、店名・返信先・受付内容の控えを入れた自動返信を送る方法を、実際にありがちな事故(2通届く・悪用される)の対策込みで紹介します。

1. まず:標準機能で足りるか確認

方法できること向いている場合
フォームの設定「回答のコピーを回答者に送信」回答内容がそのまま届く。文面・送信元名は変えられない控えが届けば十分なとき(コード不要)
このページのGAS件名・本文・送信元名・返信先を自由に。返す項目も選べる「2営業日以内にご連絡します」などの案内や店名を入れたいとき

標準機能で困らないなら、それが一番安全で手間もかかりません。

2. 準備

  1. フォームの「設定 → 回答 → メールアドレスを収集」を「回答者からの入力」にするか、「メールアドレス」という名前の記述式の質問を作ります(どちらでもシートの見出しは「メールアドレス」になります)。
  2. フォームの「回答」タブからスプレッドシートにリンクします。
  3. そのスプレッドシートで「拡張機能 → Apps Script」を開き、下のコードを貼り付けます。
  4. 左の時計アイコン「トリガー」→「トリガーを追加」→ 実行する関数 onFormSubmit・イベントのソース「スプレッドシートから」・イベントの種類「フォーム送信時」で保存。初回だけ Gmail とシートの許可を求められます。

3. コード全文(コピペで動きます)

const EMAIL_Q = 'メールアドレス';   // フォームの質問名(完全一致)
const NAME_Q = 'お名前';
const ECHO_Q = ['ご用件の種類', 'ご希望の日時']; // 控えとして返す質問だけ
const FROM_NAME = '山田商店 お問い合わせ窓口';
const REPLY_TO = 'info@example.com';   // 返信を受ける宛先
const STATUS_HEAD = '自動返信';        // シート右端に作る状態列の見出し

function onFormSubmit(e) {
  const lock = LockService.getScriptLock();
  if (!lock.tryLock(30 * 1000)) return;
  try {
    const sh = e.range.getSheet();
    const row = e.range.getRow();
    const col = statusColumn_(sh);
    const cell = sh.getRange(row, col);
    if (String(cell.getValue()).trim() !== '') return; // 二重起動対策

    const v = e.namedValues;
    const get = q => String((v[q] || [''])[0]).trim();
    const to = get(EMAIL_Q);
    if (!/^[^\s@,;<>]+@[^\s@,;<>]+\.[^\s@,;<>]+$/.test(to)) {
      cell.setValue('ERROR: メール不正'); return;
    }
    if (MailApp.getRemainingDailyQuota() < 1) {
      cell.setValue('ERROR: 送信上限'); return;
    }
    const name = (get(NAME_Q) || 'お客様').slice(0, 40);
    const echo = ECHO_Q.filter(q => get(q) !== '')
      .map(q => '・' + q + ':' + get(q).slice(0, 100)).join('\n');

    const body = name + ' 様\n\n' +
      'お問い合わせありがとうございます。以下の内容で受け付けました。\n' +
      '担当者より2営業日以内にご連絡いたします。\n\n' +
      (echo ? echo + '\n\n' : '') +
      '※このメールは送信専用の自動返信です。お心当たりのない場合は破棄してください。\n' +
      FROM_NAME;
    MailApp.sendEmail({
      to: to,
      subject: '【' + FROM_NAME + '】お問い合わせを受け付けました',
      body: body, name: FROM_NAME, replyTo: REPLY_TO,
    });
    cell.setValue('送信済 ' +
      Utilities.formatDate(new Date(), 'Asia/Tokyo', 'MM/dd HH:mm'));
  } finally {
    lock.releaseLock();
  }
}

function statusColumn_(sh) {
  const last = sh.getLastColumn();
  const head = sh.getRange(1, 1, 1, last).getValues()[0].map(String);
  const i = head.indexOf(STATUS_HEAD);
  if (i >= 0) return i + 1;
  sh.getRange(1, last + 1).setValue(STATUS_HEAD);
  return last + 1;
}

上の5つの定数(質問名・返す質問・送信元名・返信先)を自分のフォームに合わせて書き換えるだけです。質問名はシートの1行目の見出しと完全に同じ文字にしてください。

4. このコードが防いでいる3つの事故

5. よくあるつまずき

メールが届かない:トリガーの「イベントのソース」がフォームになっていると e.range が無くエラーになります。このコードはスプレッドシート側のトリガー用です。実行ログは Apps Script の「実行数」で確認できます。
エディタで ▶実行するとエラー:フォーム送信時に渡される e が無いためで、正常です。テストはフォームから実際に回答して行います。
迷惑メールフォルダに入る:件名に店名を入れ、本文を短く、URLを入れすぎないのが基本です。送信元アドレスは実行したアカウントになり、Workspace でなければ noReply は使えないため、replyTo で返信先を指定しています。

6. AIはどこに使う?(おすすめは「担当者側」)

回答者への自動返信の本文を ChatGPT に書かせるのはおすすめしません。確認していない文面が、そのまま外部の人に届いてしまうからです。AI は担当者への通知側で使い、「種別・緊急度・要約」を付けてから人が返信するのが安全です。その仕組みは Googleフォームの問い合わせをAIで自動振り分け、返信文の下書きは Gmailの問い合わせ返信をAIで下書き にまとめています。

フォームの問い合わせ対応を、もう一歩まとめて自動化したい方へ

自動返信のあと、担当者にAIで種別・緊急度・要約を付けて通知し、放置された問い合わせをリマインドする拡張版です。設定はシートで変えられ、通知に載せる前に電話番号・メールアドレスをマスクします。

フォーム問い合わせAI振り分け・拡張版(設定シート・個人情報マスク・放置リマインド・日次まとめ/$3)を見る → Gmail問い合わせ AI 下書き返信・拡張版($3)→ 請求書PDF+AI添え状・議事録AI要約など、そのまま動くGAS5本+日本語の導入手順書(PRO版・$39)→

手で貼って使うプロンプトだけ欲しい方へ:事務AIプロンプト集12種(無料・投げ銭歓迎)

Gumroad での販売です。このページの自動返信のコードは無料で、有料版には含まれていません。AI を使う機能には OpenAI の API キー(従量課金)が必要です。デジタル納品のため、ダウンロード後の返金はお受けできません(不具合時は誠実に対応します)。

自分で設定するのが不安な方へ(ココナラ・日本円):シート1列のAI一括処理と、当日分の自動サマリーメールのGAS2本+日本語手順書を、ココナラで販売しています(3,000円・税抜〜)。初期設定サポート(+4,000円)や、あなたの実データで自動化フローを1つ一緒に作る導入伴走(+12,000円)は任意のオプションです(いずれも税抜)。対応できるかは購入前の見積り相談で確認できます。

ココナラで導入相談・購入する →

フォーム問い合わせをAIで振り分け · スプレッドシートから差し込みメールを下書き作成 · Gmail問い合わせ返信をAIで下書き · GASからChatGPT APIを安全に呼ぶ · 無料本:GAS×ChatGPT事務自動化の基本

AI Revenue Experiment の用途解説ページです。導入実績や効果測定の結果ではありません。