フォームを作っただけで満足し、回答が来ているのに3日間放置してクレームになる……そんな悲劇を回避しつつ、入力してくれたお客様に「おっ、この会社は対応が早いな(実は自動だけど)」と思わせる「即レスの魔術」を実装します。
前回、あなたは「Googleフォームを一瞬で作る魔法」を手に入れた。
これでアンケートや問い合わせフォームは無限に量産できる。
だが、ここで新たな問題が発生する。
フォームを公開したのはいいが、「回答が来たことに気づかない」のだ。
「せっかく問い合わせしてくれたのに、気づいたのが3日後……」
「お客様から『回答まだですか?』って催促が来た(死にたい)」
「ていうか、回答が来るたびに手動でお礼メール打つの? 今の時代に? 正気?」
安心してほしい。
GASを使えば、回答ボタンが押された0.1秒後に「お問い合わせありがとうございます!」と返信し、同時にあなたへ「おい、仕事が来たぞ」と報告するシステムが作れる。
あなたは寝ていても、遊んでいても、トイレに入っていても、「超高速対応のビジネスマン」として振る舞えるのだ。
1. 【発端】「手動返信」という時代遅れの儀式
想像してほしい。
お客様がフォームに入力してくれた。その瞬間、彼らは「ちゃんと届いたかな?」と不安になる。
そこであなたが手動でメールを返すまで、彼らは不安なままだ。
一方、あなたはスプレッドシートをF5キーで連打して更新し、「まだかな…」と待つわけにはいかない。
気づけば夕方。対応は後手後手。
「自動販売機」になれ。
コイン(回答)を入れたら、即座にジュース(お礼メール)が出てくる。この仕組みを作らない限り、あなたは一生「メール返信」という雑用から解放されない。
2. 【翻訳】回答データを使って「手紙」を書く
今回のミッションは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エディタに貼り付ける。
コード内の「自分のメールアドレス」や「件名」を好きに書き換えよう。
ここからが最重要だ。
コードを貼り付けただけでは、このツールは動かない。
「フォームが送信された時」にこのコードを動かせ!という命令(トリガー)を設定する必要がある。
- GAS画面左側の「時計アイコン(トリガー)」をクリック。
- 右下の「+ トリガーを追加」をクリック。
- イベントの種類を選択: 「フォーム送信時」に変更。
- 「保存」をクリック。
これでスイッチが入った。
試しに自分でフォームに入力して送信してみよう。
送信ボタンを押した瞬間、あなたのスマホ(管理者)と、入力したメアド(顧客)の両方にメールが届けば成功だ。
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セルに出力しました", "作成完了");
}
コメント