Google Apps スクリプト(GAS)を利用すれば、Googleフォームから自動返信メールを送信するのは簡単です。しかし、フォームの内容や返信メールの文章が変更になるたびにGASのコードを修正するのは手間がかかります。
そこで、このGASでは、フォームの内容と返信メールの文章をGoogleスプレッドシートで編集できるようにしました。
これにより、フォームの変更や返信メールの文章の変更があっても、スプレッドシート上の文面を修正するだけで対応できます。
GASの知識がなくても、簡単に自動返信メールの文章を作成と編集ができるため、より柔軟な運用が可能になります。
こんな方におすすめ:
- Googleフォームで手軽に返信メールを使いたい方
- 自動返信メールの文面を頻繁に修正したい方
- GASの知識があまりない方
このGASを活用すれば、Googleフォームの自動返信メールの作成と管理がより効率的になります。ぜひ、あなたの業務効率化に役立ててください
スクリプトの概要~自動返信メールの作成・編集が簡単!
このGASは、フォームで回答を送信すると、回答者のメールアドレスに自動返信メールを送信します。
返信メールの件名と本文は、フォームとリンクした回答シートとは別のシート(必ず2枚目)で編集できます。
件名と本文の{{ }} で囲まれた箇所は、回答内容に自動的に置き換わります。{{ }}内には、フォームで作成した質問項目を使用します。
例:{{ 名前 }} ⇒ 武田 信玄餅
この{{**}}は、本文だけでなく件名にも使用できます。また、同じ{{**}}を何度でも本文中で使用できます。
この方法では、シートに入力された内容を編集するだけで、返信メールの件名及び本文を簡単に変更できます。そのため、汎用性に優れています。
コピペでOK!~自動返信メールの作成手順
実際に簡単なフォームを作成し、自動返信メールが送られてくるまでの手順を説明します。
フォームとスプレッドシートを作る
まず、フォームを作ります。
質問に「名前」「メールアドレス」「参加」「予約日」を作りました。
☝🏼質問には、必ず「メールアドレス」を作ってください。
次に、フォームとリンクしたスプレッドシートを作成してください。
返信メールの管理シートを作る
次に、リンクした回答シートとは別に2枚目のシートを作成してください。
必ずセルB1に返信メールの件名を、セルB2に返信メールの本文を作成してください。
上の例では、フォームの質問項目の「名前」「メールアドレス」「参加」「予約日」 を本文中の必要な箇所に{{ }}で囲んで配置しています。
これらが回答と置き換わります。(タイムスタンプは質問にないですが、回答シートに記録されています。)
例){{名前 }}⇒ 武田 信玄餅 、{{メールアドレス}} ⇒ xxxxx@gmail.com 、{{参加 }}⇒ お茶の会...に置換されます。
ちなみに、セル内で文章を編集するときの改行は、[Ctrl]+[Enter]キー(あるいは、[Alt]+[Enter]キー)です。
シート1(件名と本文)のコピペ用
件名 | 【{{参加}}】予約完了のお知らせ |
本文 | {{名前}}様、お申し込みをありがとうございました。 以下の内容で予約を承りました。 ~~~~~~~~~~~~~~~~~~~~ お申込み日時:{{タイムスタンプ}} 参加者:{{名前}} メールアドレス:{{メールアドレス}} 参加の会:{{参加}} 予約日:{{予約日}} ~~~~~~~~~~~~~~~~~~~~ 以上、よろしくお願いします。 |
GASを登録する
フォームのエディタにGAS(myReply)を登録します。
次のGAS(myReply)をコピペしてください。
- function myReply() {
- // アクティブフォーム
- const form = FormApp.getActiveForm();
- // 返信メールの件名と本文を記したシート(2枚目のシート)
- const mailSheet = SpreadsheetApp.openById(form.getDestinationId()).getSheets()[1];
- // 最新の回答を取得
- const latestResponse = form.getResponses().pop();
- const latestItems = latestResponse.getItemResponses();
- // 質問と回答の配列を生成
- const headerTbl = ['タイムスタンプ', ...latestItems.map(item => item.getItem().getTitle())];
- const answerTbl = [Utilities.formatDate(latestResponse.getTimestamp(),'JST', 'yyyy-MM-dd HH:mm:ss'), ...latestItems.map(item => item.getResponse())];
- // メールアドレスの取得
- const mailAdd = answerTbl[headerTbl.indexOf('メールアドレス')];
- // メールの件名(セル:B1)の取得
- let mailTitle = mailSheet.getRange('B1').getDisplayValue();
- // メールの本文(セル:B2)の取得
- let mailText = mailSheet.getRange('B2').getDisplayValue();
- // 本文中の{{質問}}を回答に置換する
- for (let i = 0; i < headerTbl.length; i++) {
- // メールの本文(置換後) ! 正規表現の検索により複数の同じ{{質問}}にも対応
- mailText = mailText.replace(new RegExp('{{'+ headerTbl[i] +'}}',"g"),answerTbl[i]);
- // メールの件名(置換後) … 件名にも適応
- mailTitle = mailTitle.replace('{{'+ headerTbl[i] +'}}',answerTbl[i]);
- }
- //メール送信
- GmailApp.sendEmail(mailAdd,mailTitle,mailText);
- } // Ver2.0.0 for maintenance
↓ ↓ コピペ ↓ ↓(コピペのあとは、保存を忘れずに!)
トリガーを設定する
次に、このGAS(myReply)に対してのトリガーを追加してください。
イベントの種類の選択は、「フォーム送信時」を選びます。
※承認を求められたら、「Advanced」(あるいは、「詳細」)→「Go to ~~(Unsafe)」(あるいは、「~~に移動」)→「Allow」(あるいは、「許可」)
実行(フォームから回答を送信する)
実際にフォームから回答を送信します。
結果(返信メールが届く)
リンクした回答シートに送信した回答が反映します。
成功!メールが届きました。
以上です。
この例をテンプレートにして、お好きな文章の返信メールを作成してください。
おわりに
作成したGASで使っているパラメータ(メールの件名や本文)を別シートから持ってくる手法は、よくVBAで使っていました。
その時も置換するためのマーカー(今回は{{ }})を何にするかで悩みましたが、たまたま見つけたアドオンが{{ }}を使っていたので、採用させていただきました。
特記したいのが、スクリプトの29行目のnew RegExp関数です。
replace関数は最初に見つけた対象の文字列だけを置換し、同じ文字列でも2つ目からは置換されません。
置換対象の文字列が2つ以上あった場合にも対応したいので、全て置換されるまでreplace関数を繰り返させようか(ループさせようか)と考えていたのですが、置換対象を正規表現にする方法があったことを思い出しました。
replace(/置換対象/g, 置換文字列)のようにgオプションで置換対象が全て置換されます。
ですが、今回のように置換対象に置換したい値を含んだ変数をリテラルとして、どうやっても組み込めませんでした。
そこでいろいろとググって、new RegExp関数を教えていただきました。
yahoo知恵袋:gas、javascriptの正規表現の中に変数を入れたい
質問者様、回答者様に感謝です。
それではまた、
追記(2024.09.29):
今回のバージョンアップ(Ver2.0.0)では、回答データの取得方法を大幅に改善いたしました。従来は、送信された回答をリンクしたスプレッドシートから取得しておりましたが、新しいバージョンでは、フォームに直接記録されたデータから取得するように変更いたしました。
これにより、フォームとスプレッドシートの回答数のずれによる影響を回避し、返信メールがより確実に回答者のメールアドレスに届くようになりました。
ご不明な点や問題点などございましたら、コメントにてお知らせいただけると幸いです。
コメント
こんにちは
てりはとさんの記事を参考に自動返信の設定をさせて頂きました!
わかりやすくて素人の私でも無事完成出来ました。ありがとうございます。
もうすでに質問がでていたら申し訳ないのですが
自動返信の送り主として自分のアドレスが表記されるのですが
それを「○○事務局」という風に表示させたいのですが可能でしょうか?
当ブログをご覧いただきありがとうございます。
できますよ。少し面倒ですけどね。
GASの32行目を次のように変更してください。
GmailApp.sendEmail(mailAdd,title,text,{name:'○○事務局'});
もし、うまく行かないようでしたらお知らせください。
だれでもが簡単にメールの文章を編集できるように、この記事を作りましたが、もっと複雑な返信メールを作りたくなったら、https://terihat.com/gas-diyreply/も試してください。この方が自由度が高くて人気があるようです。
ありがとうございます
早速やってみました。うまくいきました~
やっと初めてうまく出来た素人さんなので
今の状態で満足ですが、今後の参考までご教示いただいて
感謝でございます。ありがとうございます
おめでとうございます。
使っていて何か不備がございましたら、お知らせくださいね。
カウンセリングの予約フォームを作っていて色々と自動返信で探していたところ、コチラにたどり着きました。メールの返信文をできればシート上で管理したく、こちらのコードを使わせていただきたのですが、とある質問(Q1)の答えがAの場合返信文①を使用し、とある質問(Q1)の答えがBの場合返信文②を使用して返信がいくようにしたいです。
お手数ですが、IF分を使用したらよいのか、どのようにGASスクリプトを追記・変更したらよいでしょうか。
Q1=A=返信文①⇒B2セル Q1=B=返信文②⇒C2セル
として隣同士でシートには記載してみています。
教えて頂けましたら幸いです。
当ブログをご覧いただきありがとうございます。
ご質問の件ですが、
【GAS】googleフォームから自動で返信メール~合計金額など好きな値を追加できる自由度の高い返信メール
で紹介しているGAS(diyReply)をお使いいただけると簡単に解決できると思います。
応用例には載せていませんが、実際にフォームからの回答でメール本文を分ける使い方を個人的に使っていました。
スプレッドシートの関数がお解りなら、diyReplyを使ったとき、B5セルを=IFS(Q1=A,C5,Q1=B,D5)、C5に返信文➀、D5に返信文➁としていただければよいと思います。お試しください。
また別記事で紹介していますGAS(updateItems)を使いますと、予約フォームに申し込み制限なども付けられますので、ご参考なると思います。これはdiyReplyと同時に使用できます。
以上、ご回答になりましたら幸いです。
回答ありがとうございます!ご提案頂いた方法で無事に解決できました!そして、updateItemsの設定もできました!このおかげで指定した日時以降の日時が表示されるよう更新したいもの+定員はどうしたらいいかと迷っていたので無事解決いたしました★
こちらのように内容を変更しやすいものはとてもやりやすいです!メールの一部の文言に装飾を加えたりすることが出来るといいなと思う事があるのですが、それは実現可能なのでしょうか?
お役に立てたようで何よりです。
文字の装飾についてですが、メールを受け取る側が確実に読めるメールである必要があると思いますので、テキストメールが基本だと思います。つまり、フォントを変える、太字にする、アンダーラインを引くなどといったHTMLメールは諦めた方がよろしかと思います。もちろん〇△◇などのテキストベースの特殊文字は使用できます。また、https://~~~、xxx@~~~.comなどのリンク(青文字でクリックできる)も使用できます。
ところでテキストメールを最大限に研究しているのが、ご存じのメルマガですね。例えば「メルマガ 装飾」と検索でもすれば、彼ら彼女らの努力が見れます。
ぜひ素敵なテキストメールをお作り下さい。
当方あまりデータ関係を取り扱う習慣がなかったため、時間計算含め、追加する選択肢を指定した日時以降のみを抽出するのに少し手間取っていました(;´・ω・)
テキストベースの特殊文字やメルマガでの表現を参考に分かりやすく見やすいテキストメールを考えてみますね!本当にありがとうございます!