PR

【GAS】Googleフォームから自動で返信メールを送る(文章編集が簡単)

Google Workspace

Googleフォームから自動返信メールを送信することは、GASを用いて簡単に実現できます。しかし、フォームの変更に合わせてGASを編集する必要が生じる場合があり、煩わしいと感じることも少なくありません。

今回紹介するスクリプトの特徴は、返信メールの文章をスプレッドシートから直接編集できる点です。フォームの変更に都度GASを編集する必要がなくなり、非常に汎用性に優れています。

このスクリプトは、Googleフォームの開発を効率化し、より柔軟な運用を可能にします。ぜひご活用ください。

スポンサーリンク

GAS(作成したスクリプト)の概要

このスクリプトは、フォームで回答を送信すると、回答者のメールアドレスに自動返信メールを送信します。

返信メールの件名と本文は、フォームとリンクした回答シートとは別のシート(必ず2枚目)で編集できます。

件名と本文の{{ }} で囲まれた箇所は、回答内容に自動的に置き換わります。{{ }}内には、フォームで作成した質問項目が入力されます。
例:{{ 名前 }} ⇒ 武田 信玄餅

この{{***}}は、本文だけでなく件名にも使用できます。また、同じ{{***}}を何度でも本文中で使用できます。

この方法では、シートに入力された内容を編集するだけで、返信メールの件名及び本文を簡単に変更できます。そのため、汎用性に優れています。

準備する

フォームとスプレッドシートを作る

まず、フォームを作ります。

質問に「名前」「メールアドレス」「参加」「予約日」を作りました。質問には、必ず「メールアドレス」を作ってください

次に、フォームとリンクしたスプレッドシートを作成してください。

返信メール用のシートを作る

次に、リンクした回答シートとは別に2枚目のシートを作成してください。

必ずセルB1に返信メールの件名を、セルB2に返信メールの本文を作成してください。

上の例では、フォームの質問項目の「名前」「メールアドレス」「参加」「予約日」 を本文中の必要な箇所に{{ }}で囲んで配置しています。

これらが回答と置き換わります。(タイムスタンプは質問にないですが、回答シートに記録されています。)
例){{名前 }}⇒ 武田 信玄餅 、{{メールアドレス}} ⇒ xxxxx@gmail.com 、{{参加 }}⇒ お茶の会...に置換されます。

ちなみに、セル内で文章を編集するときの改行は、[Alt]+[Enter]キー(あるいは、[Ctrl]+[Enter]キー)です。

GASを登録する

スプレッドシートのエディタにGAS(myReply)を登録します。

次のGAS(myReply)をコピペしてください。

  1. function myReply() {
  2.     const ss = SpreadsheetApp.getActiveSpreadsheet();
  3.     //フォームとリンクしている回答シート
  4.     const answerSheet = ss.getSheets()[0];
  5.     //返信メールの件名と本文を記したシート(2枚目のシート)
  6.     const mailSheet = ss.getSheets()[1];
  7.     //回答シートの最終行列
  8.     const lastRow = answerSheet.getLastRow();
  9.     const lastCol = answerSheet.getLastColumn();
  10.     //ヘッダー行の質問項目を配列に取得
  11.     const headerTbl = answerSheet.getRange(1,1,1,lastCol).getDisplayValues()[0];
  12.     //最終行の回答を配列に取得(フォームからの入力値)
  13.     const answerTbl = answerSheet.getRange(lastRow,1,1,lastCol).getDisplayValues()[0];
  14.     //メールアドレスの取得
  15.     const mailAdd = answerTbl[headerTbl.indexOf('メールアドレス')];
  16.     //メールの件名(セル:B1)の取得
  17.     let title = mailSheet.getRange(1,2).getDisplayValue();
  18.     //メールの本文(セル:B2)の取得
  19.     let text = mailSheet.getRange(2,2).getDisplayValue();
  20.     //本文中の{{質問項目}}を回答に置換する
  21.     for (let i = 0; i < lastCol; i++ ) {
  22.       //メールの本文(置換後) ! 正規表現の検索により複数の同じ{{質問項目}}にも対応
  23.       text = text.replace(new RegExp('{{'+ headerTbl[i] +'}}',"g"),answerTbl[i]);
  24.       //メールの件名(置換後) ・・・念のため件名にも適応
  25.       title = title.replace('{{'+ headerTbl[i] +'}}',answerTbl[i]);
  26.     }
  27.   //メール送信
  28.   GmailApp.sendEmail(mailAdd,title,text);
  29. }

↓ ↓ コピペ ↓ ↓

トリガーを設定する

次に、このGAS(myReply)に対してのトリガーを追加してください。

イベントの種類の選択は、「フォーム送信時」を選びます。

※承認を求められたら、「Advanced」(あるいは、「詳細」)→「Go to ~~(Unsafe)」(あるいは、「~~に移動」)→「Allow」(あるいは、「許可」)

実行(フォームから回答を送信する)

実際にフォームから回答を送信します。

結果(返信メールが届く)

まず、回答シートに送信した回答が反映しています。

成功!メールが届きました。

おわりに

作成したGASで使っているパラメータ(メールの件名や本文)を別シートから持ってくる手法は、よくVBAで使っていました。

その時も置換するためのマーカー(今回は{{ }})を何にするかで悩みましたが、たまたま見つけたアドオンが{{ }}を使っていたので、採用させていただきました。

特記したいのが、スクリプトの29行目のnew RegExp関数です。

replace関数は最初に見つけた対象の文字列だけを置換し、同じ文字列でも2つ目からは置換されません。

置換対象の文字列が2つ以上あった場合にも対応したいので、全て置換されるまでreplace関数を繰り返させようか(ループさせようか)と考えていたのですが、置換対象を正規表現にする方法があったことを思い出しました。

replace(/置換対象/g, 置換文字列)のようにgオプションで置換対象が全て置換されます。

ですが、今回のように置換対象に置換したい値を含んだ変数をリテラルとして、どうやっても組み込めませんでした。

そこでいろいろとググって、new RegExp関数を教えていただきました。

yahoo知恵袋:gas、javascriptの正規表現の中に変数を入れたい
質問者様、回答者様に感謝です。

それではまた、

コメント

  1. みみ より:

    カウンセリングの予約フォームを作っていて色々と自動返信で探していたところ、コチラにたどり着きました。メールの返信文をできればシート上で管理したく、こちらのコードを使わせていただきたのですが、とある質問(Q1)の答えがAの場合返信文①を使用し、とある質問(Q1)の答えがBの場合返信文②を使用して返信がいくようにしたいです。
    お手数ですが、IF分を使用したらよいのか、どのようにGASスクリプトを追記・変更したらよいでしょうか。
    Q1=A=返信文①⇒B2セル Q1=B=返信文②⇒C2セル
    として隣同士でシートには記載してみています。
    教えて頂けましたら幸いです。

    • Kasuga てりはと より:

      当ブログをご覧いただきありがとうございます。
      ご質問の件ですが、
      【GAS】googleフォームから自動で返信メール~合計金額など好きな値を追加できる自由度の高い返信メール
      で紹介しているGAS(diyReply)をお使いいただけると簡単に解決できると思います。
      応用例には載せていませんが、実際にフォームからの回答でメール本文を分ける使い方を個人的に使っていました。
      スプレッドシートの関数がお解りなら、diyReplyを使ったとき、B5セルを=IFS(Q1=A,C5,Q1=B,D5)、C5に返信文➀、D5に返信文➁としていただければよいと思います。お試しください。
      また別記事で紹介していますGAS(updateItems)を使いますと、予約フォームに申し込み制限なども付けられますので、ご参考なると思います。これはdiyReplyと同時に使用できます。
      以上、ご回答になりましたら幸いです。

      • みみ より:

        回答ありがとうございます!ご提案頂いた方法で無事に解決できました!そして、updateItemsの設定もできました!このおかげで指定した日時以降の日時が表示されるよう更新したいもの+定員はどうしたらいいかと迷っていたので無事解決いたしました★

        こちらのように内容を変更しやすいものはとてもやりやすいです!メールの一部の文言に装飾を加えたりすることが出来るといいなと思う事があるのですが、それは実現可能なのでしょうか?

        • Kasuga てりはと より:

          お役に立てたようで何よりです。
          文字の装飾についてですが、メールを受け取る側が確実に読めるメールである必要があると思いますので、テキストメールが基本だと思います。つまり、フォントを変える、太字にする、アンダーラインを引くなどといったHTMLメールは諦めた方がよろしかと思います。もちろん〇△◇などのテキストベースの特殊文字は使用できます。また、https://~~~、xxx@~~~.comなどのリンク(青文字でクリックできる)も使用できます。
          ところでテキストメールを最大限に研究しているのが、ご存じのメルマガですね。例えば「メルマガ 装飾」と検索でもすれば、彼ら彼女らの努力が見れます。
          ぜひ素敵なテキストメールをお作り下さい。

          • みみ より:

            当方あまりデータ関係を取り扱う習慣がなかったため、時間計算含め、追加する選択肢を指定した日時以降のみを抽出するのに少し手間取っていました(;´・ω・)
            テキストベースの特殊文字やメルマガでの表現を参考に分かりやすく見やすいテキストメールを考えてみますね!本当にありがとうございます!

タイトルとURLをコピーしました