Day3: Googleフォーム作成。お問い合わせ対応メール作成システム


Day3:手入力からの卒業
Day1とDay2で、あなたは「リストを選んでボタンを押せばメールが作れる」武器を手に入れました。
今回は、その武器に「センサー」を取り付けます。
Before: 問い合わせメールが来る → スプレッドシートを開く → 名前とアドレスをコピペする → メール作成ボタンを押す。
After: (何もしない) → 気づいたらGmailの下書きに返信メールができている。
やることは3つだけ。「入り口(フォーム)」を作り、「道(シート)」をつなげ、「番犬(トリガー)」を置く。これだけです。

Step 1:入り口となる「Googleフォーム」を作る
まずは、お客様が情報を入力する画面を作ります。
Googleフォーム にアクセスし、「空白」(+ボタン)から新規作成します。

2.タイトルを「お問い合わせ」などに変更します。

3.質問項目を作ります。今回はテストとして以下の項目を作りましょう。
お名前(記述式・必須)
メールアドレス(記述式・必須)
ご用件(段落・必須)
(※その他、フリガナや誕生日など、好きな項目を増やしてもOKです!)

Step 2:【重要】Day2のシートと「合体」させる
ここが最大のポイントです。新しいスプレッドシートを作るのではなく、Day2まで作り込んだ「あのシート」にデータを流し込みます。
Googleフォームの編集画面上部にある「回答」タブをクリック。

2.「スプレッドシートにリンク(緑色のアイコン)」をクリック。
3.「既存のスプレッドシートを選択」を選び、「選択」を押す。

Day2で作ったファイル(「顧客管理」シートがあるファイル)を選んで決定。

【確認】
スプレッドシートを開いてみてください。
画面下のタブに、「フォームの回答 1」という新しいシートが増えていれば成功です!

Step 3:【落とし穴回避】見えない「お化け行」を消す
ここ、めちゃくちゃ重要です! Day2で、顧客管理シートの「A列」をチェックボックスに設定しましたよね?
実は、スプレッドシートは「チェックボックスがある=データが入っている」と勘違いします。 そのままだと、フォームから回答が来たとき、チェックボックスがない「はるか下の行(1001行目など)」にデータが追加されてしまいます。
これを防ぐために、「まだ使っていない空の行」をすべて削除しておきましょう。 ショートカットを使えば一瞬です!
【サクッと消す手順】
「顧客管理」シートを開く。

データが入っている最後の行の、「ひとつ下の行(空のチェックボックスがある行)」をクリックして選択する。

以下のキーを押して、一番下の行まで一気に選択する。
Windows: Ctrl + Shift + ↓ (下矢印)
Mac: Command + Shift + ↓ (下矢印)

選択された行番号の上で右クリックし、「行〇〇-〇〇を削除」を選ぶ。

これで、フォームからデータが来たときに、きちんと詰めて追加されるようになります。(追加された行には、自動でチェックボックスが復活するので安心してください!)

Step 4:お礼メールの「型」を用意する
自動返信用の文章をネタ帳に登録しましょう。
スプレッドシートの「テンプレートDB」シートを開き、新しい行に以下を追加してください。
A列:メニュー名
B列:件名テンプレート
C列:本文テンプレート

問い合わせ
お問い合わせありがとうございます
{name} 様
お問い合わせありがとうございます。
〇〇(屋号)です。
内容を確認し、改めてご連絡いたします。
(ここに署名など)

Step 5:【実装】自動連携プログラム
いよいよGASの出番です。
以下のコードをコピーして、Apps Scriptの一番下に追記してください。
⚠️ 注意: コードの中の「数字」だけ、あなたのシートに合わせて書き換える必要があります!(後で解説します)
// ■機能3:フォームから回答が来たら、リストに追加して下書きを作る
function handleFormSubmit(e) {
// 1. 設定:シート名などを指定
const targetSheetName = '顧客管理'; // 転記先のシート名
const formSheetName = 'フォームの回答 1'; // フォーム回答が来るシート名
// テンプレートDBの「5行目」に問い合わせ用文章があると仮定
const templateRow = 5;
const dbSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('テンプレートDB');
const subjectTemplate = dbSheet.getRange(templateRow, 2).getValue(); // B列
const bodyTemplate = dbSheet.getRange(templateRow, 3).getValue(); // C列
// 2. フォームの最新の回答を取得
const ss = SpreadsheetApp.getActiveSpreadsheet();
const formSheet = ss.getSheetByName(formSheetName);
const lastRow = formSheet.getLastRow();
// ★ここ重要!列番号を指定する(左から何番目か?)
const name = formSheet.getRange(lastRow, 2).getValue(); // お名前の列番号
const email = formSheet.getRange(lastRow, 3).getValue(); // メアドの列番号
// 3. 「顧客管理」シートに転記
const targetSheet = ss.getSheetByName(targetSheetName);
// A列(チェック), B列(名前), C列(メアド), D列(件名), E列(本文), F列(ステータス)
let finalSubject = subjectTemplate.replace(/{name}/g, name);
let finalBody = bodyTemplate.replace(/{name}/g, name);
// A列には true (チェック済み) を入れます
targetSheet.appendRow([true, name, email, finalSubject, finalBody, ""]);
// 4. 下書きを作成
GmailApp.createDraft(email, finalSubject, finalBody);
// 5. 転記した行のF列(ステータス)に完了日時を入れる
const newLastRow = targetSheet.getLastRow();
targetSheet.getRange(newLastRow, 6).setValue(new Date());
}
Step 6:【重要】あなたのフォームに合わせて「数字」を直す
フォームの項目を増やしたり、並べ替えたりした場合は、コードの数字を直す必要があります。
スプレッドシートの「フォームの回答 1」シートを見て、左から何番目の列か数えてください。
例: もし、「お名前」「フリガナ」「メールアドレス」の順で作った場合
A列:タイムスタンプ
B列:お名前(1番目)
C列:フリガナ
D列:メールアドレス(3番目)
この場合、コードを以下のように書き換えます。
const name = formSheet.getRange(lastRow, 1).getValue(); // 1列目がお名前
const email = formSheet.getRange(lastRow, 3).getValue(); // 3列目がメアド
ここがズレているとエラーになるので、必ず確認してください!

Step 7:仕上げの「トリガー設定」
最後に、このプログラムが「フォームが送信された時」に勝手に動くように設定します。
Apps Script画面の左側にある「時計のアイコン(トリガー)」をクリック。

右下の「+ トリガーを追加」ボタンをクリック。

以下のように設定を変更して「保存」を押します。
実行する関数:handleFormSubmit
イベントのソース:スプレッドシートから
イベントの種類:フォーム送信時

🚀 いざ、実験!
さあ、感動の瞬間です。
試しにやってみましょう!!
Googleフォームの1度「公開」して、「リンクを共有」から、コピー

検索

自分の名前とメールアドレスを入力して送信してみてください。

確認ポイント:
スプレッドシート: 「顧客管理」シートに行が追加されていますか?
Gmail: 「下書き」フォルダ を見てください。
そこにお客様(今回は自分)宛ての「お問い合わせありがとうございます」メールができていれば、大成功です!
💡 よくある勘違い
「自分のメールアドレスに入力したのに、メールが届かない!」と焦る方がいます。今回のシステムは「あなた(お店)のGmailの下書きの中に、返信用の手紙を用意する」ものです。あなたの「下書きフォルダ」をご確認ください。そこに宝物が入っています。
まとめ:あなたは「ITの魔法使い」になった
おめでとうございます。これでおよそ3日間の無料プログラムはすべて終了です。 振り返れば、現場の悩みから始まったこの旅も、ついに自動化というゴールに到達しました。
Day0: 現場仕事のプロこそ「GAS」が必要な理由を知り、自動化への一歩を踏み出した。
Day1: GASの基礎を学び、動く仕組みを作れた!
Day2: 顧客リストを作り、ワンクリックでメールを作る仕組みを作った。
Day3: フォームと連携し、お問い合わせが来るとメールを下書きに自動で作成できた!「半自動化」を実現した。
この4部作で構築したシステムは、業者に頼めば数万円の見積もりが出るレベルです。それをあなたは、自分の手で、0円で作り上げました。 もう、あなたは「ITが苦手な個人事業主」ではありません。「ITを武器に戦う経営者」の一歩を踏み出しました。
🎁 【袋とじ】覚悟のある人限定。「全自動送信」モードへの切り替え方
ここまで読んで、「下書きなんてまどろっこしい! 私は機械を信じて即時送信したいんだ!」と思ったチャレンジャーなあなたへ。
下書きを経由せず、フォームに来た瞬間にお客様へメールを発射する「フルオートモード」のコードを用意しました。
ただし、送信取り消しはできません。
「名前が間違っていた」「変な文章送っちゃった」という事故も自己責任になります。
その覚悟がある方だけ、以下の手順でコードを「完全版」に書き換えてください。
Apps Scriptのエディタを開く。
今あるコードを「すべて」消して、真っ白にする。(Ctrl+A で全選択して Delete)
以下のコードをまるごとコピペする。
保存ボタン(💾)を押す。
// ■機能1:テンプレートを読み込んで、全員分の本文を作る
function generateBodyFromTemplate() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const lastRow = sheet.getLastRow();
const subjectTemplate = sheet.getRange("I2").getValue();
const bodyTemplate = sheet.getRange("J2").getValue();
for (let i = 2; i <= lastRow; i++) {
const isChecked = sheet.getRange(i, 1).getValue();
const name = sheet.getRange(i, 2).getValue();
const currentBody = sheet.getRange(i, 5).getValue();
if (isChecked === true && currentBody === "") {
let finalSubject = subjectTemplate.replace(/{name}/g, name);
let finalBody = bodyTemplate.replace(/{name}/g, name);
sheet.getRange(i, 4).setValue(finalSubject);
sheet.getRange(i, 5).setValue(finalBody);
}
}
Browser.msgBox("本文の生成が完了しました!");
}
// ■機能2:生成された本文を使って、Gmailの下書きを作る
function createDrafts() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const lastRow = sheet.getLastRow();
for (let i = 2; i <= lastRow; i++) {
const isChecked = sheet.getRange(i, 1).getValue();
const email = sheet.getRange(i, 3).getValue();
const subject = sheet.getRange(i, 4).getValue();
const body = sheet.getRange(i, 5).getValue();
const status = sheet.getRange(i, 6).getValue();
if (isChecked === true && body !== "" && status === "") {
GmailApp.createDraft(email, subject, body);
sheet.getRange(i, 6).setValue(new Date());
}
}
Browser.msgBox("Gmailの下書き作成が完了しました!確認してください。");
}
// ■機能3:【全自動送信版】フォームから回答が来たら、リストに追加して「即送信」する
function handleFormSubmit(e) {
const targetSheetName = '顧客管理';
const formSheetName = 'フォームの回答 1';
// ★テンプレートDBの行番号を確認してください(例:5行目)
const templateRow = 5;
const dbSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('テンプレートDB');
const subjectTemplate = dbSheet.getRange(templateRow, 2).getValue();
const bodyTemplate = dbSheet.getRange(templateRow, 3).getValue();
const ss = SpreadsheetApp.getActiveSpreadsheet();
const formSheet = ss.getSheetByName(formSheetName);
const lastRow = formSheet.getLastRow();
// ★あなたのフォームの列番号に合わせて数字を変更してください
const name = formSheet.getRange(lastRow, 2).getValue(); // 2列目(お名前)
const email = formSheet.getRange(lastRow, 4).getValue(); // 4列目(メアド)
const targetSheet = ss.getSheetByName(targetSheetName);
let finalSubject = subjectTemplate.replace(/{name}/g, name);
let finalBody = bodyTemplate.replace(/{name}/g, name);
// A列に true (チェックあり) を入れます
targetSheet.appendRow([true, name, email, finalSubject, finalBody, ""]);
// ★ここが変更点:下書きではなく「即送信」します!
GmailApp.sendEmail(email, finalSubject, finalBody);
const newLastRow = targetSheet.getLastRow();
targetSheet.getRange(newLastRow, 6).setValue(new Date());
}
これで、あなたのシステムは「全自動即レスマシーン」へと進化しました。
最強のスピードを手に入れたい方は、ぜひ挑戦してみてください。
次回からの【応用編】では、これらの技術を使って「競合サイトの価格を毎日勝手に調べるスパイ・ロボット(スクレイピング)」や「LINEに通知を送る秘書」を作る方法を公開していく予定です。
ビジネスをさらに加速させたい方は、ぜひチェックしてみてください。
それでは、自動化された快適なデスクで、またお会いしましょう!
📺 【100P】「PC画面を見ながら一緒に作りたい」という方へ
ここまで手順を解説してきましたが、 「やっぱり、文字だけだと操作が合っているか不安……」 「エラーが出たらどうしよう……」 と感じている方もいらっしゃるかもしれません。
そんな方のために、本記事の手順を収録した「実演ハンズオン動画」を用意しました。
実際の画面で、どこをクリックするのか?
コードを貼り付ける場所はどこか?
エラーが出ないための設定手順
これらを動画で見ながら、一時停止してマネするだけで、確実にシステムが完成します。
この動画は、缶コーヒー1本分で見ることができます。 「自分で調べる時間を短縮したい」「確実に動くものを作りたい」という方は、ぜひ動画を見ながら進めてみてください。
(※いただいた100円は、今後の記事作成や新しい自動化の研究費として大切に使わせていただきます!)
ここから先は
¥ 200
この記事が参加している募集
この記事が気に入ったらチップで応援してみませんか?
