実践編⑤:24時間365日「即レス」する無敵の受付嬢!フォーム回答への自動返信&自分への通知システム

フォームを作っただけで満足し、回答が来ているのに3日間放置してクレームになる……そんな悲劇を回避しつつ、入力してくれたお客様に「おっ、この会社は対応が早いな(実は自動だけど)」と思わせる「即レスの魔術」を実装します。

前回、あなたは「Googleフォームを一瞬で作る魔法」を手に入れた。

これでアンケートや問い合わせフォームは無限に量産できる。

だが、ここで新たな問題が発生する。

フォームを公開したのはいいが、「回答が来たことに気づかない」のだ。

「せっかく問い合わせしてくれたのに、気づいたのが3日後……」

「お客様から『回答まだですか?』って催促が来た(死にたい)」

「ていうか、回答が来るたびに手動でお礼メール打つの? 今の時代に? 正気?」

安心してほしい。

GASを使えば、回答ボタンが押された0.1秒後に「お問い合わせありがとうございます!」と返信し、同時にあなたへ「おい、仕事が来たぞ」と報告するシステムが作れる。

あなたは寝ていても、遊んでいても、トイレに入っていても、「超高速対応のビジネスマン」として振る舞えるのだ。

1. 【発端】「手動返信」という時代遅れの儀式

想像してほしい。

お客様がフォームに入力してくれた。その瞬間、彼らは「ちゃんと届いたかな?」と不安になる。

そこであなたが手動でメールを返すまで、彼らは不安なままだ。

一方、あなたはスプレッドシートをF5キーで連打して更新し、「まだかな…」と待つわけにはいかない。

気づけば夕方。対応は後手後手。

「自動販売機」になれ。

コイン(回答)を入れたら、即座にジュース(お礼メール)が出てくる。この仕組みを作らない限り、あなたは一生「メール返信」という雑用から解放されない。

2. 【翻訳】回答データを使って「手紙」を書く

今回のミッションは2つだ。

  1. お客様へ: 「受け付けましたよ」という安心を与えるメール。
  2. 自分へ: 「新しい回答が来たよ」という業務連絡。

これを実現するためには、フォームと紐付いている「スプレッドシート(回答の保存先)」を使うのが一番確実だ。

【AIへの指示メモ(仕様書)】

  • 対象: フォームの回答が溜まるスプレッドシート
  • トリガー: 「フォームが送信された時」
  • 取得データ: 回答された中身(名前、メアド、問い合わせ内容など)
  • メール作成(お客様用):

    • 宛先:回答に入力されたメールアドレス
    • 本文:「{お名前} 様、お問い合わせありがとうございます。内容は {問い合わせ内容} で承りました。」のように、回答内容を埋め込む。

  • メール作成(自分用):

    • 宛先:自分のメールアドレス
    • 件名:【新規回答】フォームから連絡がありました
    • 本文:全回答内容を表示

ポイントは、「{お名前} のように、プレースホルダー(置換用の穴)を使って文章を作りたい」とAIに伝えることだ。これならプログラムが苦手でも直感的にメール文面を作れる。

3. 【発注】AIへのプロンプト送信

さあ、AIに「優秀な受付嬢」になってもらおう。

今回は「フォームの質問項目」を具体的に伝えておくと、AIがより正確なコードを書いてくれる。

<実際に送信するプロンプト>

Plaintext

GASで「Googleフォーム自動生成ツール」を作りたいです。
スプレッドシートに書かれたリストを読み込んで、新しいフォームを作成してください。

# シート構成
・A列:質問のタイトル
・B列:質問の種類(「記述」「選択肢」「ラジオ」の3パターンに対応したい)
・C列:選択肢(カンマ区切りで入力されている。例:「A,B,C」)

# 要件
1. 新規にGoogleフォームを作成する(タイトルは「自動生成フォーム」)
2. シートの2行目から順にデータを読み込む
3. B列の値によって、追加する質問アイテムを変える
   - 「記述」の場合 → 短文回答(addTextItem)
   - 「選択肢」の場合 → プルダウン(addListItem)
   - 「ラジオ」の場合 → ラジオボタン(addMultipleChoiceItem)
4. C列に選択肢がある場合は、それを分割して設定する
5. 作成完了後、フォームの編集用URLをログに出力する

初心者なので、条件分岐の部分がわかるように書いてください。

4. 【実装】トリガー設定という「最後のスイッチ」

AIが出力したコードをGASエディタに貼り付ける。

コード内の「自分のメールアドレス」や「件名」を好きに書き換えよう。

ここからが最重要だ。

コードを貼り付けただけでは、このツールは動かない。

「フォームが送信された時」にこのコードを動かせ!という命令(トリガー)を設定する必要がある。

  1. GAS画面左側の「時計アイコン(トリガー)」をクリック。
  2. 右下の「+ トリガーを追加」をクリック。
  3. イベントの種類を選択: 「フォーム送信時」に変更。
  4. 「保存」をクリック。

これでスイッチが入った。

試しに自分でフォームに入力して送信してみよう。

送信ボタンを押した瞬間、あなたのスマホ(管理者)と、入力したメアド(顧客)の両方にメールが届けば成功だ。

5. 【仕上げ】「即レス」は最高の営業だ

これで、あなたは「24時間365日、0.1秒で反応する無敵の受付対応」を手に入れた。

顧客は「おっ、ちゃんと届いたな」と安心し、あなたは「あとで確認すればいいや」と余裕を持てる。

このシステムが動いている限り、あなたは寝ていても「仕事が早い人」だ。

さあ、浮いた時間で何をしようか? もちろん、次の自動化を考えるのだ。


(実践編⑤ 終了)


【実践編⑤ 付属資料】

1. AIが生成する標準コード(基本編)

Googleフォームの回答スプレッドシートに紐付けて使用します。

e.namedValues を使うことで、スプレッドシートの列順が変わっても、「質問のタイトル」さえ合っていればデータが取れる堅牢な作りになっています。

JavaScript

function createFormFromSheet() {
  // 1. スプレッドシートのデータを取得
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var data = sheet.getDataRange().getValues(); // 全データを取得

  // 2. 新規フォームを作成
  // タイトルに日時を入れて重複を防ぐ
  var formTitle = "自動生成フォーム_" + Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "MMdd_HHmm");
  var form = FormApp.create(formTitle);

  // 3. 行ごとのループ処理(1行目はヘッダーなので index 1 から開始)
  for (var i = 1; i < data.length; i++) {
    var title = data[i][0];  // A列: 質問タイトル
    var type = data[i][1];   // B列: 質問タイプ
    var optionsRaw = data[i][2]; // C列: 選択肢(カンマ区切り)

    // タイトルが空ならスキップ
    if (!title) continue;

    // 質問タイプによって分岐
    if (type === "記述") {
      // テキスト(短文回答)を追加
      form.addTextItem().setTitle(title);

    } else if (type === "選択肢") {
      // プルダウンを追加
      var item = form.addListItem();
      item.setTitle(title);
      
      // 選択肢がある場合、カンマで分割してセット
      if (optionsRaw) {
        var choices = optionsRaw.toString().split(",");
        // 空白削除などの整形
        var cleanChoices = choices.map(function(c){ return c.trim(); });
        item.setChoiceValues(cleanChoices);
      }

    } else if (type === "ラジオ") {
      // ラジオボタンを追加
      var item = form.addMultipleChoiceItem();
      item.setTitle(title);
      
      if (optionsRaw) {
        var choices = optionsRaw.toString().split(",");
        var cleanChoices = choices.map(function(c){ return c.trim(); });
        item.setChoiceValues(cleanChoices);
      }
    }
  }

  // 4. URLをログと画面に出力
  var editUrl = form.getEditUrl();
  var pubUrl = form.getPublishedUrl();
  
  console.log("作成完了: " + editUrl);
  Browser.msgBox("フォームを作成しました!\\n編集URL: " + editUrl);
}

2. 拡張アイデアコード(応用編:Slack連携)

追加機能:自分への通知を「Slack」に送る

メール通知だと埋もれてしまう……という方のために、ビジネスチャット「Slack」へ通知を送る機能を追加しました。

※Slack側で「Incoming Webhook URL」を取得する必要があります(「Slack Webhook 取得」で検索するとすぐ分かります)。

JavaScript

function createFormAdvanced() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var data = sheet.getDataRange().getValues();

  // ★拡張:フォームのタイトルや説明文もシートから取れるようにする(例:D1セルがタイトル、D2が説明文)
  var formTitle = sheet.getRange("D1").getValue() || "自動生成フォーム";
  var formDescription = sheet.getRange("D2").getValue() || "これはGASで自動生成されたフォームです。";

  var form = FormApp.create(formTitle);
  form.setDescription(formDescription);

  // 質問追加ループ(基本編と同じロジックを使用)
  for (var i = 1; i < data.length; i++) {
    var title = data[i][0];
    var type = data[i][1];
    var optionsRaw = data[i][2];
    // ★拡張:D列に「必須」と書いてあったら必須にする
    var isRequired = (data[i][3] === "必須");

    if (!title) continue;

    var item;
    if (type === "記述") {
      item = form.addTextItem();
    } else if (type === "選択肢") {
      item = form.addListItem();
      if (optionsRaw) item.setChoiceValues(optionsRaw.toString().split(","));
    } else if (type === "ラジオ") {
      item = form.addMultipleChoiceItem();
      if (optionsRaw) item.setChoiceValues(optionsRaw.toString().split(","));
    } else if (type === "日付") {
      // ★拡張:日付タイプも対応
      item = form.addDateItem();
    }

    // 共通設定:タイトルと必須フラグ
    if (item) {
      item.setTitle(title);
      item.setRequired(isRequired);
    }
  }

  // ★拡張:生成されたURLをシートに書き戻す
  // E1セルに「回答用URL」、E2セルに「編集用URL」を書き込む
  var publishedUrl = form.getPublishedUrl();
  var editUrl = form.getEditUrl();

  sheet.getRange("E1").setValue("回答用URL: " + publishedUrl);
  sheet.getRange("E2").setValue("編集用URL: " + editUrl);
  
  // リンクを開きやすくするためにトースト通知
  SpreadsheetApp.getActiveSpreadsheet().toast("URLをE1, E2セルに出力しました", "作成完了");
}


part 8 of 11 【講座名】 AI-GAS[スプレッドシート自動化]

AI-GAS[スプレッドシート自動化]

【GAS初心者】作りたいものが思いつかない?「我慢」をやめれば自動化のネタは無限に湧いてくる

【AI×GAS】AIは「察してちゃん」が大嫌い!欲望を箇条書きにする「思考の翻訳」トレーニング

【GAS初心者】環境構築という「最初のボス」はもういない ——GASとスプレッドシートの蜜月関係

実践編①:「明日やろうは馬鹿野郎」を撲滅せよ —— 期限切れタスクを自分にチクリ報告する「Gmailリマインダー」

実践編②:Googleカレンダーも合体!寝起きの自分に「今日の絶望」を届ける最強モーニングレポート

実践編③:YouTubeを監視せよ!寝ている間に「推し」や「トレンド」を勝手にリストアップする諜報員Bot

実践編④:クリック地獄からの解放!スプレッドシートの「質問リスト」からGoogleフォームを全自動生成する

実践編⑤:24時間365日「即レス」する無敵の受付嬢!フォーム回答への自動返信&自分への通知システム

実践編⑥:画面が真っ赤になっても心停止しない!エラーメッセージはAIへの「ネタ振り」だと思え

実践編⑦:読むな、感じろ……いや、AIに読ませろ!Gemini APIで「長文アンケート」を3秒で要約&感情分析する

第8回(最終回):結論、プログラマーになる必要はない。「プロの指示出しおじさん/おばさん」になれ

コメント

この記事へのコメントはありません。

PAGE TOP