PR

【GAS】Googleフォームから自動で返信メール~合計金額など好きな値を追加できる自由度の高い返信メール

Google Workspace

ここで紹介するGAS(diyReplay)とスプレッドシートの関数を使って、Googleフォームの回答以外の値を、返信メールの文面に簡単に表示できます

例えば、回答項目を使って計算した合計金額などを、返信メールの文章に加えることができます

スポンサーリンク

準備

テストのフォームとスプレッドシートを作りながら、作成したGAS(diyReply)の機能を説明します。

フォーム

次のようなフォームを作ります。

返信メールの件名
返信メールの本文
返信メールの宛先

スプレッドシート

スプレッドシートにリンクします。

シートを追加して、返信メールに必要なシート(ここでは、シート1)を作ります

  • 1行目(C1~E1)には、質問項目の①②③を入れます。
  • 2行目(B2~E2)には、フォームからの回答が入ります。
  • B3OFF(半角)を入れるとメールを送りません。(文章作成時のテスト時に使えます。)
  • B4返信メールの件名を入れます。ここでは、=C2を入れます。
  • B5返信メールの本文を入れます。ここでは、=D2を入れます。
  • B6返信メールの宛先を入れます。ここでは、=E2を入れます。
  • B7:必要なら、CC:を入れます。複数の場合は、aaa@gmail.com, bbb@gmail.comのように,で区切ってください。
  • B8:必要なら、BCC:を入れます。複数の場合は、aaa@gmail.com, bbb@gmail.comのように,で区切ってください。
  • B9:必要なら、送信元(自分)の表示名を入れます。
  • B10:必要なら、返信先アドレスを入れます。
  • B11(New!):必要なら、送信元アドレスを入れます。
    送信元アドレスには、Googleアカウント(Gmailアドレス)のエイリアスをご利用ください。
    (※権限のないメールアドレスでは、送信できませんのでご注意ください。)
  • B12(New!):ON(半角)を入れるとC12に回答編集用のURLを表示します。

GAS

GAS(diyReply)を登録します。スクリプトエディタを開きます。

次のGAS(diyReplay)をエディタへコピペします。

  1. function diyReply(SheetNo) {
  2.   // 引数SheetNo:設定用シートのタブの位置(一番左のシートが0、2番目が1、3番目が2…)
  3.   if(!(SheetNo > 1)) SheetNo = 1;
  4.   // アクティブフォーム
  5.   const form = FormApp.getActiveForm();
  6.   // 設定用シート(2枚目のシート)
  7.   const mailSheet = SpreadsheetApp.openById(form.getDestinationId()).getSheets()[SheetNo];
  8.   // 最新の回答を配列に取得
  9.   const latestItems = form.getResponses().pop();
  10.   const answerItems = latestItems.getItemResponses().map(item => item.getResponse());
  11.   answerItems.unshift(latestItems.getTimestamp()); // タイムスタンプを追加
  12.   // 回答を設定用シートにセット
  13.   mailSheet.getRange(2, 2, 1, answerItems.length).setValues([answerItems]); SpreadsheetApp.flush() // sync;sync;sync
  14.   // B12がONなら編集リンクを設定用シートにセット
  15.   mailSheet.getRange('C12').setValue(mailSheet.getRange('B12').getValue() === 'ON' ? latestItems.getEditResponseUrl() : ""); SpreadsheetApp.flush() // sync;sync;sync
  16.   // 設定用シートの項目(セル:B3-B11)を配列に取得
  17.   const mailTbl = mailSheet.getRange('B3:B11').getDisplayValues().flat();
  18.   // B11が空白ならアクティブユーザーのメールアドレスを使用
  19.   if(!mailTbl[8]) mailTbl[8] = Session.getActiveUser().getEmail();
  20.   // B3がOFF以外はメールを送信
  21.   if (mailTbl[0] !== 'OFF')
  22.     GmailApp.sendEmail(mailTbl[3], mailTbl[1], mailTbl[2], {from: mailTbl[8],cc: mailTbl[4],bcc: mailTbl[5],name: mailTbl[6],replyTo: mailTbl[7]});
  23. } // Ver2.2.0 for maintenance

↓ ↓ コピペ ↓ ↓ (保存を忘れずに!)

トリガー

トリガーを追加します。

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

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

動作テスト

フォームを実行(プレビュー)して、回答、そして送信します。

結果、リンクしたシート(フォームの回答)

結果、シート1に次のように表示されています。

結果、宛先(TO:)へ送られてきた返信メールです。

成功しました。

このように、GAS(diyReply)はフォームからの回答をシート1にコピー、シート1の内容をメールするだけです。

つまり、思い通りのメールを送るには、スプレッドシートの関数を駆使して自分で作る必要があります

そして、どのような返信メールも自由自在に作ることができます

実践編

既存のフォームを修正変更し、改めて回答を募集する際は、過去のデータが混ざらないよう、リンクしたスプレッドシートとフォームの回答を全削除してください。(以下の①②の作業)

①回答シートの回答行を削除する。

②フォームの回答を削除する

応用例その8

フォームより入力された項目には価格があり、その合計金額をメールに表示したいとします。

注文商品(価格あり)の個数をプルダウンのメニューから選ぶフォームです。

返信メールのためのシート1を次のように作りました。
数式表示[Ctrl]+@しています。

シート1

テーブル(コピペ用)に表示します。

質問タイムスタンプ名前メールアドレス注文商品1(1,500円/個)注文商品2 (2,500円/個)
最新の回答
OFF:
メールを送らない
件名ご注文承りました
本文=C2&" 様、
ご注文をありがとうございます。
-------------------------------
注文商品: "&E1&"×"&E2&"個 "&F1&"×"&F2&"個
合計金額:"&TEXT((1500*E2+2500*F2),"#,##0")&"円
-------------------------------
お支払方法は、~~~

またのご利用をお待ちしております。"
TO:=D2
CC:(省略可)
BCC:(省略可)
NAME:(省略可)〇〇商店
REPLY TO:(省略可)
シート1
表計算が得意な人には何でもない関数ですが、セル内に文章を書くのは不慣れな人が多いのではないでしょうか。
"文字列"(ダブルクォーテーションで挟まれた文字列)とセルの数値(C2など)を、&(半角)でつなぎながら文章を書くのは慣れないと少し難しいかもしれません。
コツは最初に"を付けてから、一気に文章を書きあげて最後に"で閉じます。
この時、改行([Ctrl]+[Enter]キー)も気にせずに使います。
それから必要な箇所を"&※※&"に置き換えていきます。(※※は、A1,、B2など)

B5セルに望みの文章が表示出来たら、それがそのままメールの文章になります

実行(プレビュー)します。

シート1

成功です。

合計金額が表示された返信メールが送られてきました

シート1の名前(NAME:)で記した○○商店も表示されています。

この例を参考に、ご自分の思い通りな返信メールをお作り下さい。

既存のフォームを修正変更し、改めて回答を募集する際は、過去のデータが混ざらないよう、リンクしたスプレッドシートとフォームの回答を全削除してください。(以下の①②の作業)

①回答シートの回答行を削除する。

②フォームの回答を削除する

応用例その8.5(クレジット決済を追加する)

お支払い方法に銀行振込だけでなくクレジット決済も対応した応用例です。
ご参考までにどうぞ。

クレジット決済のためにGASとは関係のない次の「メールリンク型決済」サービスを使います。

応用例その9

応用例その11(2つのGASを使って署名活動フォームを作る)

応用例の補足(フォームの選択肢に定員設定を追加する)

次のGAS(updateItems)を使って、フォームの選択肢に定員(人数制限)を付けられます
今回のGAS(diyReply)と同時に使うことで、フォームの応用がさらに広がります。

複数のGASの同時使用の応用例が『応用例その11』です。
参考にしてください。

応用例の補足2(フォームの回答者数に定員設定を追加する)

次のmultiReplyは、今回のdiyReplyに"フォームの回答者数に定員設定"ができる機能を追加しました。
「質問の選択肢」毎の定員でなく、「回答者数」の定員でよいのなら、とても有用なスクリプトです。

おわりに

GASを組むことで、フォームやスプレッドシートから得られる質問項目と回答項目を、メール文書に加えるのは簡単です。

しかし、それらにない計算値などをメールに加えるには、GASを特別に組み直さなければいけません。

フォームに対して1対1のGASになってしまい、汎用性が失われてしまします。

また、GASで数式を組んでテストをするのは、なかなかに手間がかかります。

そこで、この負担をスプレッドシートの関数側に持っていくために、GASの機能を削りに削ってできたのが今回のdiyReplyです。

GASでは困難な複雑な数式も、スプレッドシートの関数ならトライ&エラーが簡単に行えるため短時間で完成できます。

diyReplyと組み合わせることで、今回の例では合計金額ですが、関数に詳しい方はいくらでも難しい数式で得た値を、メールに表示できます。

ぜひ、自由自在な返信メールをご活用ください。

それでは、また次の記事でお会いしましょう。

追記(2024.9.25):

このGASを公開して1年以上が経ちますが、今でも日に20~30人の方がご覧になられるようです。
それに伴いこれまで、いくつかの問題点をご指摘いただきました。
特に、フォームとスプレッドシートの回答数が一致しない場合、混乱が生じていたというご指摘を何度か受け、今回の大幅なバージョンアップを行い以下の点を改善いたしました。

  • 従来はスプレッドシートから回答を取得していましたが、新しいバージョン(2.1.0)では、フォームに直接記録された回答を取得するように変更いたしました。
    これにより、確実に最後の回答を取得できるようになり、フォームとスプレッドシートの回答数が一致しない場合でも確実に、フォームからの送信者(回答者)の回答を使ったメールが送れます。

次の機能は、より柔軟な対応を可能にするため、追加いたしました。

  • 返信メールの送信者(From:)に、フォームのオーナーのメールアドレスのエイリアスを設定できるようにしました。
  • 回答者が自身の回答を編集するためのURLを表示できるようになりました。

もし使ってみて何か問題点がありましたら、コメントにてお知らせいただけると幸いです。

コメント

  1. 以前にもお世話になってます。
    今回は、Googleフォームのフォルダを共有して、申込書を共有することにしたのですが、私(オーナー)だけが開いているときは何の問題も無くこのシステムが使えるのですが、他の人(共有のリンクを教えた人)が開いた状態で申込フォームから送信してみたところ、メールが来なくなりました。
    回答は記録されていたので、それ自体はスプレットシートに反映されていましたが、せっかくの送信した時に送られるメールがいかなくなってしまいました。
    共有してた人に、一回共有ファイルの画面を閉じてもらい、またテスト送信してみた所、今度はちゃんとメールが送信されました。
    やはり、他のアカウントで開いたままだと、エラーが出る感じでしょうか?

    またまたご教示ください。

    • えみさん、お久しぶりです。以前にdiyReplyの問題点をご指摘いただきありがとうございました。
      さてご質問の内容は、共有フォルダ内にあるGoogleフォームと紐付けされたGAS(Gmailの送信)が実行されない問題のことと理解しました。
      今しばらくPCが使えない環境にいますので、実際に確認ができませんが、管理者的な視点からの憶測を述べさせていただきたいと思います。
      ご存知の通りGoogleの共有ではオーナーは常に一人で、他の誰かに譲渡しない限りオーナーはえみさんだけです。
      フォームやシート、ドキュメントなどの編集を共有者のお友達がどれだけ変更を加えてもオーナーはえみさんから変わることはありません。
      今回使っていただいているdiyReplyでは、Gmailを使ってメール送信を行っています。
      このメール送信が共有環境では実行されないことが今回の問題なのだと思います。
      ですが、これはセキュリティ上は正しいことのように思われます。
      なぜなら、もし実行できるのであれば、お友達がフォームのプレビューなどを行うだけで、えみさんのアカウントでメールが送れてしまうことになります。Gmail送信者の権限まで共有できるのであれば共有者はえみさんのアカウントで好きなメールを送れることになります。
      これはセキュリティ上の問題がありますので、Googleは許可していないのでしょうね。
      ですが、えみさんが教えてくださったように共有状態だとオーナーのGmailまで制限されることは私も驚きました。貴重な情報をありがとうございます。
      解決策としましては、フォームとシートの開発は共有フォルダで行なって、完成したらそのフォルダ外へ移して運用することになるのではないでしょうか。
      Googleの共有は本当に厳しいです。共有者は簡単にコピーすらできないのですから、今までのファイルのやり取りの感覚だと慣れるまでが大変です。これからはファイルのコピーではなく所有権の譲渡・付与といった形になるのでしょうね。

      追記、
      前回にフォームとシートの回答数の不一致によるメールの誤送信の問題を教えてくださりありがとうございました。あれから同じことを数人の方からもご指摘を受けまして、私も気になりましたので、思い切ってコードに大幅な修正を加えました。
      主な修正点は回答送信者の回答をシートからではなくフォームから取得するようにしました。これにより回答数の不一致による誤送信は防げるようになりました。
      もしよろしければ、この新しいバージョン(2.1.0)を試していただけたらと思います。

      また何か問題が見つかりましたら、教えていただけますか。

      • なるほど。
        では、フォームとシートは共有にしないでおいた方がいいということですね。
        さっそく抜きます(笑)
        Google難しいです。
        今回、新たなバージョンでやってみた所、1回だけ(だぶん、共有相手がフォルダを開いていたときに共有の中のフォームから申し込み送信してきた時だったと思いますが)、タイムスタンプ、メールアドレス…とか、題名?がそのまま2列目に入ってしまい、エラーが起きたことがありました。
        それも共有したままだったからかもしれませんが、一応、不具合としてお知らせしておきますね。

        このページを参考にたくさんできることが増えているので、とてもありがたいです。
        その中でも、エラーが起きた時に対応してくれるKasugaさんにとても感謝しています。
        また、わからないことがありましたら教えてください。

        • そうですね。
          GASが紐付いたフォームの共有編集には、注意が必要ということですね。
          新しいバージョンは運用を始めてから日も浅いです。えみさんのようにエラーを報告してくださる方は、開発者にとって恩人でもあります。
          また何かわかりましたら、教えてくださいね。

          • こんにちは。
            またまた、質問です。

            このGASの自動返信の際に、受付番号みたいのを付けたいのですが、フォーム送信に対して連番でメールを返信していくことは可能ですか?

            本文に
            申込を受け付けました。【受付番号○○○】

            のように連番でやれたらと考えていましたが、どんなもんでしょうか?

            式などで解決できるのであれば教えてください。

            • もしかしてROW関数でできるかもしれません。一度トライしてみます!
              分からなかったらまた質問させてください。

              • えみさん、こんばんは。
                ちなみに私なら、
                =COUNTA('フォームの回答'!A:A)-1
                ですね。
                ROW関数でもできるのかな?今度挑戦してみようかな。

                • ありがとうございます!
                  そちらの方が簡単そうです^^
                  ありがとうございます。
                  またよろしくお願いします!

  2. 記事を拝見し参考にさせていただいております。
    送信元のメールアドレスを変更したい場合、記述はどのようにしたらよろしいでしょうか?
    ご教示いただけますと大変助かります。
    よろしくお願いいたします。

    • 当ブログをご覧いただきありがとうございます。

      ご質問の送信元のメールアドレスの変更ですが、システムの規制上できません。
      プログラム内でメール送信のコマンドなどを実行したときの送信者は、プログラムの実行者、あるいはプログラムのオーナーになります。
      ですので、Googleフォームは、そのオーナーのGoogleアカウントのメールアドレス(gmail)が使用されます。
      代わりにですが、セルB10の返信先アドレスに記入されたアドレス(ReplyTo)は、相手が返信をするときに採用されます。こちらは自由に設定できます。

      ご参考になりましたでしょうか。

      追記、
      Gmailはエイリアスをサポートしていますので、任意のメールアドレスでGoogleのSendMailサーバーを使うことができます。オーナーのGmailアドレスにエイリアスを設定されている人は、送信元にそのエイリアスを指定できます。
      その場合は、スクリプトの20行目を、
      (変更前)
      GmailApp.sendEmail(mailTbl[3],mailTbl[1],mailTbl[2],{cc:mailTbl[4],bcc:mailTbl[5],name:mailTbl[6],replyTo:mailTbl[7]});
      (変更後)
      GmailApp.sendEmail(mailTbl[3],mailTbl[1],mailTbl[2],{from:'aaa@bbb.co.jp',cc:mailTbl[4],bcc:mailTbl[5],name:mailTbl[6],replyTo:mailTbl[7]})

      このようにエイリアス(aaa@bbb.co.jp)を追加することで送信元を代えることもできます。
      今後、エイリアスを使っている人が多いようなら、送信元も設定項目に追加してもよいのかなと思いました。

      • こんにちは!

        お陰様で13個の商品入れ、トリガーもdiyReply、イベントの種類は「フォーム送信時」、「許可」で完了しました。

        なんですが、シート1にテスト送信分が流れません。
        左から フォームの回答、シート1にしています。

        Cloud のログで以下のエラーが出ています。

        TypeError: Cannot read properties of null (reading ‘getDestinationId’)
        at diyReply(コード:6:43)

        ご教授頂けますでしょうか。
        どうぞ宜しくお願い致します。

        • ご質問を拝見したところ、この記事に記載されているサンプルを試されていないご様子ですね。
          まずは、この記事のサンプルと全く同じものを作りそれを成功させてから、次のステップへとお進みください。
          それを雛形として自分でアレンジを加えてテストを繰り返して、最終的に自分の思うものへと近づけてください。
          どんなプログラムでも成功体験は、必ず必要です。
          初心者は特にこのステップを省略しないでください。
          そうすれば、今回のエラーが発生するはずがないことがわかると思います。
          頑張ってください。

        • そうなんですね。

          分かりました!

          やってみます!

    • ご返信ありがとうございます!
      無事解決いたしました!

      他に見られている方がいらっしゃった場合の事を考えて一応流れを書いておきます。
      ①こちらのサイトを参考にフォームとGASを設定し自分のアドレスで試したところTEST成功
      ②他人にTESTしてもらったところ、自動返信がされていいない事を確認
      ③スプレッドシートを確認したところ、フォームのシートには記入された記録があるが、返信用スプレッドシートには反映されていない状態を確認
      ④グーグルワークスペースのIDをログイン用のアドレスにしていたため、自分以外に返信できていない事を認知
      ⑤Kasuga様のご提案により解決

      エイリアスの使用に関しては企業ベースで使用されている場合はあるあるな感じだと思われます。
      ですので、グーグルフォームを使用するくらいの規模の企業にとっては非常にありがたい解決策だと感じました。
      誠にありがとうございました。

      • N.F LCC様、とても参考になるご返事をありがとうございます。
        Gmailのエイリアスがすぐにお分かりになるとは流石でございます。
        ご参考までに、このエイリアスは送信に関しては問題ないのですが、受信(imapやpopでメールを持ってくる)が不安定(時間がとてもかかる)です。
        ワンタイムパスワードなどこのエイリアスで受けようとして、ひどい目に合いました。ですから、受信に関しては、Gmail側からのimapやpopを使わず、任意アドレス側のサーバーでGmailへの転送設定をすることをおすすめします。

        そうですか。エイリアスを使う人のことも考えた方がよさそうですね。
        折を見て、GASを修正しておきます。
        とても参考になりました。ありがとうございます。

      • Kasuga様
        お世話になります。
        >任意アドレス側のサーバーでGmailへの転送設定
        これは行なっているのですが、yahooや携帯アドレスへの返送率の低さからメールサーバーのみGoogleを使用しようかと考えております。
        このページの趣旨から少し離れてしまいますが、SPF、DKIM、DMARC以外の設定でコツなどありましたらご教示いただけると幸いです。
        現状ではフォームからの返信用アドレスのみgoogleのメールサーバーを使用して、他は転送のままにしようかと考え中です。

        • N.F LCC様、
          少しお困りのことが分からないのですが、、、。
          Gmailのエイリアスについて整理してみますね。
          一つのGoogleのアカウント(Gmailアドレス)にいくつもの任意のメールアドレス(***@yahoo.co.jp, ***@docomo.ne.jpなど)を重ねることができます。
          これにより一つのGmailアドレスでいくつもの任意のメールアドレスを一括管理できます。例えば、このエイリアスを使うことでスマホのGmailアプリだけで全てのメールアドレスの管理ができます。
          また、メール送信時の送信元をエイリアス(***@yahoo.co.jp, ***@docomo.ne.jpなど)に設定できます。このエイリアスはメール送信時にGoogleのSMTPサーバーを使うので、なりすましメールとは全く異なります。
          エイリアスの作り方は、PCのGmailの設定から行います。

          このエイリアスを上手に使えば、色々な問題が解決できます。

          私の理解しているエイリアスについてはこのような感じです。
          さて、私の理解の程度を考慮していただいて、N.F LCC様のお困りの趣旨をもう一度、ご説明していただくと幸いです。

  3. はじめまして!
    自分がやりたかったことが載っているサイトに来れて、有難く設定させていただきました。

    私の知っている関数はSUM計算のみと言う超初心者です。

    質問ですが、他の方も書かれていたことで重複し申し訳ありません、
    何度やっても上手くできませんのでご教授頂きたいです。

    やりたい事は注文がなかった商品は
    上がってこない様にしたいです。

    ①【注文商品】
    “&D1&”×”&D2&”個
    “&E1&”×”&E2&”個
       ↓
    ②【注文商品】
    =IF(D2=””,””,”注文商品:”&D1&”×”&D2&”個
    “)&IF(E2=””,””,”注文商品:”&E1&”×”&E2&”個

    ①を②の様に訂正しましたら、エラーがでています。

    お忙しいところすみませんが教えていただければ幸いです。
    どうぞよろしくお願いします。

    • 当ブログをご覧いただきありがとうございます。

      数式を拝見しますと、気になるのが””(全角のダブルクォーテーション)を使われていないかです。関数記号は全て半角英数字ですので、再度確認をして確実に半角の””をお使いください。←初心者の方に多いミスです。
      これも記載ミスかもしれませんが、最後に”)が抜けています。
      (修正前)
      =IF(D2=””,””,”注文商品:”&D1&”×”&D2&”個
      “)&IF(E2=””,””,”注文商品:”&E1&”×”&E2&”個
      (修正後)
      =IF(D2=””,””,”注文商品:”&D1&”×”&D2&”個
      “)&IF(E2=””,””,”注文商品:”&E1&”×”&E2&”個”)

      ※改行は[Ctrl]+[Enter]、或いは、[Alt]+[Enter]
      この式をコピペして試してください。うまくいかないようでしたらお知らせくださいね。

      • 早々にお返事を頂き、ありがとうございます。

        「””」については半角にしていましたが「:」が全角で、できていませんでした。
        ご指摘ありがとうございます。

        修正してくだったものをコピペしましたが、

        =IF(D2=””,””,”注文商品:”&D1&”×”&D2&”個
        “)&IF(E2=””,””,”注文商品:”&E1&”×”&E2&”個”)

        このままで送られて来ました。

        フォームの質問には
        ・〇〇商品(@1000)とし
        プルダウンで個数を選ぶようにしています。
        プルダウンが問題とかありますでしょうか?

        それと併せて教えて頂きたいことがあるのですが、
        ()内の数式に「”注文商品:」があると下記のようになりますでしょうか?

        商品数が多いので、例えば10種類の商品中2種類のみを注文の場合
        【注文商品】
        ・〇〇商品(@1000)×個数=金額
        ・〇〇商品(@2000)×個数=金額

        というようにしたいです。
        どうぞ宜しくお願い致します。

        • ちょっと説明不足でした。半角””で囲まれていたら全角のどの様な文字でも問題ありません。ですから””内で全角の:を使うのは問題ありません。
          私もうっかりしていたのですが、このコメントに半角の””など特殊記号を使うと全角に自動変換されてしまいます。これは、Wordpress(ブログのシステム)の仕様なのですが、前回のコピペをお願いした関数も全角に変換されていたかもしれません。確認して全角でしたら半角””に直してくださいね。
          さて、関数表記のままメールが送られてきたそうですが、スクリプト(GAS)がセル(A1やB1のマス)に表示されているそのままを送るためです。
          目で見て=IF(A1~~~などのように表示されていたらそのままの表示が送られます。
          [Ctrl]+@キーで関数表示と結果に切り替わるので気をつけてください。関数がそのまま表示されていたらもう一度[Ctrl]+@で切り替えてください。
          ご希望の関数ですが、次のような感じでよいのではないでしょうか。今回は半角が全角に変換されないようにしましたのでそのままコピペできると思います。

          ="【注文商品】"&CHAR(10)&IF(D2="","",D1&"×"&D2&"個="&TEXT((1000*D2),"#,##0")&"円"&CHAR(10))&IF(E2="","",E1&"×"&E2&"個="&TEXT((2000*E2),"#,##0")&"円"&CHAR(10))&IF(F2="","",F1&"×"&F2&"個="&TEXT((3000*F2),"#,##0")&"円"&CHAR(10))

          この関数では、見やすくするために、改行にCHAR(10)を使っています。[Ctrl]+[Enter]でもよいのですが、関数のサンプルではこの方が分かりやすいかもしれませんね。覚えておいて良いと思います。
          このサンプルでは、D,E,Fの3つですが、G,H,~と好きなだけ追加してください。

          シートの関数のよいところは、テストが簡単にできることです。フォームからわざわざ回答を送信しなくても、D1やD2などを自分で直接に値を変えてテストしてくださいね。満足な表示ができたらフォームから回答を送信してテストするとよいですよ。念のため。

          今度はうまくいくとよいですね。

          • 沢山、ご教授を有難うございます。

            そうですね、前回のサンプルで”が全角になっていましたね。そういう事でしたか!難しいですね…。

            さて、また問題なのですが、何度もすみません。

            ①目で見て=IF(A1~~~なので、[Ctrl]+@をしてからコピペをしたのですが、切り替わらずエラーがでます。

            ②CHAR(10)で作って下さってるのに、改行にはならず…。

            [Ctrl]+@をするタイミングが良くないですか?

            (G,H,~と好きなだけ追加)はとても助かります!感謝です。

            • むむむ、なかなかに手強いですね。
              でもご安心ください。この関数は、私の方でテストしていますので、問題はありません。

              そちらのキー配置が私のと違う可能性があります。まず、セルに関数をコピペしてください。
              次の図のように数式のチェックを外してください。これで試してみましょう。

          • 有難うございます

            はい!外しました!
            まだ変わりなくエラーです。

            • う~んこれは……関数に全角文字が渡されたのかも……?
              セルに表示されるエラーは、#VALUE!ですか?
              セルの右上角の赤三角にカーソルを合わすとエラーの説明が表示されると思いますが、何と書いてありますか?

          • 数式の解析エラーです。

            • それは関数が間違っているエラーですね。なにか変な文字が入っているのかな…?
              もう一度、セルをクリアして、次の関数式をコピペしてください。

              ="【注文商品】"&CHAR(10)&IF(D2="","",D1&"×"&D2&"個="&TEXT((1000*D2),"#,##0")&"円"&CHAR(10))&IF(E2="","",E1&"×"&E2&"個="&TEXT((2000*E2),"#,##0")&"円"&CHAR(10))&IF(F2="","",F1&"×"&F2&"個="&TEXT((3000*F2),"#,##0")&"円"&CHAR(10))

              まだ同じエラーが出ますか?
              コピーされた関数式をじ~っと見て、間違いがないかよく見てください。ひょっとして半角”が全角”になっていないでしょうか?
              最後に変な(や”が追加されていませんか?
              間違い探しですね!

          • すみません、全角と変な文字はないか見ましたが、また同じエラーです。
            改行もされないです。私の方の改行されていない数式を見ていただこうとこちらにコピペしましたら、ちゃんと改行されます。

            文字色ですが、【注文商品】、個、#,##0は黒色で、D2やE2は紫や水色、それ以外の文章は全て緑色です。

            最後の住所…27-1としていますがその後に消しても消しても”がつきます。
            何かわかればと思い、記させて頂きました。

            よろしくお願い致します。

            • このコメントにあなたの数式をコピペされたのですか?ちょっと載っていないようなのですが……。
              ひょっとしてですが、私が作成した数式をそのままでなく弄ってテストしていますか?
              もしそうであるなら、セルB5の本文の数式を私の方で見ましょうか?
              このコメントの返信にコピペしていただければ、確認できますがいかがでしょうか?

          • 有難うございます!
            お言葉に甘えまして…。
            宜しくお願い致します。

            =C2&”様

            この度は籽清ZIQINGをご利用頂きまして
            誠にありがとうございます。
            ━━━━━━━━━━━
            =”【注文商品】”&CHAR(10)&IF(D2=””,””,D1&”×”&D2&”個=”&TEXT((1000*D2),”#,##0″)&”円”&CHAR(10))&IF(E2=””,””,E1&”×”&E2&”個=”&TEXT((2000*E2),”#,##0″)&”円”&CHAR(10))&IF(F2=””,””,F1&”×”&F2&”個=”&TEXT((3000*F2),”#,##0″)&”円”&CHAR(10))

            【合計金額】”&TEXT((10500*D2+3500*E2),”#,##0″)&”円
            ━━━━━━━━━━━
            【お支払方法】
            ・のちほどお送り致します請求書に沿って
            海外送金をお願い致します。
            ・振込手数料につきましては別途ご負担wo願います。(インターネットからのお手続きが便利でお得です)
            ・入金確認後、発送準備を進めて参ります。
            ━━━━━━━━━━━
            Mai:ziqing@gmail.com
            籽清ZIQING(シーズジックイーン)
            659-○○
            ○○27-1″

            • 了解です。
              エラー処理とスタイルを整えただけです。計算式等はそのままです。

              =C2&"様

              この度は籽清ZIQINGをご利用頂きまして
              誠にありがとうございます。
              ━━━━━━━━━━━
              【注文商品】
              "&IF(D2="","",D1&"×"&D2&"個="&TEXT((1000*D2),"#,##0")&"円
              ")&IF(E2="","",E1&"×"&E2&"個="&TEXT((2000*E2),"#,##0")&"円
              ")&IF(F2="","",F1&"×"&F2&"個="&TEXT((3000*F2),"#,##0")&"円
              ")&"【合計金額】"&TEXT((10500*D2+3500*E2),"#,##0")&"円
              ━━━━━━━━━━━
              【お支払方法】
              ・のちほどお送り致します請求書に沿って
              海外送金をお願い致します。
              ・振込手数料につきましては別途ご負担wo願います。(インターネットからのお手続きが便利でお得です)
              ・入金確認後、発送準備を進めて参ります。
              ━━━━━━━━━━━
              Mai:ziqing@gmail.com
              籽清ZIQING(シーズジックイーン)
              659-○○○○27-1"

              コピペでお試しください。

          • 今度は、#VALUE!がでました。内容は関数限【 MULTIPLY のパラメータ 2 の値は 数値 にしてください。テキスト が「○○@ymobile.ne.jp」になっているので、数値 にできません。】です。
            この「○○@ymobile.ne.jp」は質問の宛先F2入ってくるもので、TO=F2にしています。
            この後、CCには、店のアドレス、NAMEには店名を手入力しています。

            本当に手を取らせてすみません。
            どうぞ宜しくお願い致します。

            • #VALUE!になりましたね。進歩しました。

              セルのF2は使われていたんですね。サンプルは商品をE~Fにしていましたので、Fを削除しました。
              あと、フォームで商品数をプルダウンから選ぶ時の数値は、必ず半角の数字だけでお願いしますね。

              =C2&"様

              この度は籽清ZIQINGをご利用頂きまして
              誠にありがとうございます。
              ━━━━━━━━━━━
              【注文商品】
              "&IF(D2="","",D1&"×"&D2&"個="&TEXT((1000*D2),"#,##0")&"円
              ")&IF(E2="","",E1&"×"&E2&"個="&TEXT((2000*E2),"#,##0")&"円
              ")&"【合計金額】"&TEXT((10500*D2+3500*E2),"#,##0")&"円
              ━━━━━━━━━━━
              【お支払方法】
              ・のちほどお送り致します請求書に沿って
              海外送金をお願い致します。
              ・振込手数料につきましては別途ご負担wo願います。(インターネットからのお手続きが便利でお得です)
              ・入金確認後、発送準備を進めて参ります。
              ━━━━━━━━━━━
              Mai:ziqing@gmail.com
              籽清ZIQING(シーズジックイーン)
              659-○○○○27-1"

              これでご確認ください。

          • 感動です!!!できました!!!

            あつかましくも完成するまでお付き合いを頂き有難うございました。
            #VALUE!はまだいいことなのですね。

            独学でボツボツと始めてまして
            還暦にして、一人でできたら自信になると思いましたが、ほぼして頂いて…。

            これから、TOに気を付けながら商品を増やしていきます。

            勉強になりました!有難うございました。

            • おめでとうございます。
              初心者にしてはよく対応できていると思います。関数はトライ&エラーを繰り返してこそ成長します。
              ご助言をさせていただくなら、長い数式は部分ごとに分けて、それぞれを別のセルでテストしてから、最後に全体をつなげるようにすると、より効率的にテストができますよ。

              あなたの数式がきっと誰かの役に立つと思いますので、今回はありがとうございました。

  4. おはようございます。

    数を合わせてもやっぱり新しい回答が飛んでくると、前の人にメールが行っちゃうようなので、とりあえず最初に言われたとおり、全てクリアして行も全部削除してやってみます。

    • おはようございます。
      そうですか~、実はフォームとシートの回答数の数合わせで検証したことがないもので、不確実な情報ですみません。
      フォームの回答数とシートの回答数が同じだと問題がないと思っていたのですが……いつか私も試してみますね。
      貴重な情報をありがとうございました。

      • こんばんは!

        また、最新バージョンのGASをコピペして使用していても、この時の質問のような、前の人にもう一度メールが送られてしまう現象が起きました。
        けっこう頻繁に。
        なので一度スプリクトエディタでもう一度こちらのサンプルからコピーして保存して、実行したら、そのあとから送られてきた1つはちゃんと作動していました。

        まだ1つしか質問フォームから送信されていないので、この後どうなるかはわかりませんが、Kasugaさんがつくった式では、フォームの最終回答をひっぱるようにしてるのですよね?
        なのにまたどうしてこの現象が起こったのか確認をお願いしたいと思って連絡しました。
        いつも検証して答えてくださり、ありがとうございます。

        • えみさん、こんばんは。
          度々のエラー報告をありがとうございます。

          まだPCが使えない環境にいますので、テストができない状況なんです…。
          実は新しいバージョンは数回のテストで大丈夫だろうと思って公開したのですが、早まったかもしれませんね。
          おっしゃるとおりフォームの送信者の回答は、フォームの回答から引っ張ってきています。それをシートの2行目に記録します。
          コードを見る限り間違いはないようなんですが、ひょっとしてシートの関数の反応が遅くてセルに新しい値が反映される前にメールを送ってしまっているとか…。実際にそのようなことは結構あります。
          だから、何度も色々なパターンでテストをしないといけないのですが、今回はこれが抜けていましたね。
          えみさんに甘えてしまいますが、もしもう少し新しいバージョンでテストをしていただいて、同じエラーになるようでしたお知らせいただけますか?
          来月にはPCでテストして修正が加えられるので、それまでは使用を見送っていただけたらと思います。
          大変にご迷惑をお掛けしてすみませんでした。

  5. なるほど!
    勉強になります^ ^
    ありがとうございます。
    やってみます!
    また聞きたいことあればコメントするので、その時はご教授くださいm(_ _)m

  6. 返信ありがとうございます!

    では、フォームの回答が13ならば、シートの回答も13であれば問題はないということですか?

    いろいろテストしたりして、フォームの回答も消したり、シートもテストのものが間に挟まったりして、そこを削除して行を詰めて同じ13に合わせたら大丈夫ですか?

    • フォームの回答が13でしたら、次の送信で回答が書かれる行が14行目(タイトル行があるため+1です)になるはずです。確か…
      ここら辺を抑えておけば、うまく扱えると思いますよ。
      あっ、それとシートの回答行と回答行の間に空白行を入れないでくださいね。これは、私の例題の関数COUNTIFが空白でない行をカウントしているので、お気付けください。

  7. このまんまコピペで使用していますが、質問フォームから送信すると、たった今送信した人ではなく、前回の最終行の人がそのままシート1に反映されてメールが行っちゃいます。
    (BCCに私のアドレスを入れたから判明しました)

    コードを開いて、『実行』を押すと最終行の人のが新たにシート1に反映されて返信メールできるようになりますが、毎回それだと、1人2回ずつメールが送らさる感じになっています。

    ①最初にフォームから送信した時は前回の人(仮Aさん)にメールがいく

    ②コードから実行と押せば今送信した人(Bさん)にメールがいく

    ③次にフォームから送信した人にはメールがいかず、前回送信した人(Bさん)にメールが行く

    どうしてかわかりますか?

    • 当ブログをご覧いただきありがとうございます。
      あ~、これは、フォームとシートの回答数がズレているからだと思います。
      今は手元にフォームを実行する環境がないので、メニュー項目などを詳しく説明できないのですが...。
      まず、フォームとシートの同期はフォームからの一方向だと言うことを覚えておいてください。
      例えば、シートの回答を削除しても、フォームの回答は削除されないということです。
      フォームの回答を見て「3件の回答」となっていたとき、シートの回答数も3件なら問題ないのですが、シートの回答を削除したり弄ってしまってもフォームとは同期されませんので、ここは手動で合わせなければなりません。
      一番良いのは、フォームの回答を「︙」から「すべての回答を削除」でクリアして、シートの回答の行を削除して、最初から始めることでしょう。

  8. 記事を参考にさせていただきました。
    スクリプトをコピペし、スプシのシート2のB3〜B10に返信内容を納めているのですが、メールが飛びません。。

    回答内容からVLOOKUPで検索した内容を返信メールに掲載したく、
    VLOOKUPの検索ようにシートをもう2枚追加しております。
    こちらが原因でしょうか。

    ご教示いただけると幸いです。

    • 当ブログをご覧いただきありがとうございます。
      う~ん、確認ですけど…トリガーは大丈夫ですよね? あと、B3~B10を設定しているシートのタブの位置は左から2番目になっていますか?
      このシートの位置を例えば、左から3番目にする時は、diyReply(2)と引数を入れてシートの位置の指示が必要です。

      • ご返信ありがとうございます!
        トリガーも掲載頂いている通りに設定しておりますが、今確認したところエラー100%になっていました・・
        メールを設定しているシートも左から2番目で間違いありませんmm

        もしかしてですが、スクリプトの冒頭
        function diyReply(SheetNo) {

        function diyReply(1) {
        にしないといけないのでしょうか?

        • 実行ログを見ると、

          Exception: Gmail operation not allowed. : Mail service not enabled
          diyReply @ コード.gs:20

          と表示されます。他に設定すべき箇所があるのでしょうか・・・

          • スクリプトのメールを送る段階で権限で弾かれていますね。ログのメッセージからは権限が付与されていないと読めますね。
            また確認ですが、スクリプトを保存するときとか、トリガーをセットするときに承認は求められませんでしたか?

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

        • いいえ、シートの位置が左から2番目でしたら、そのままでよいです。SheetNoは、指定しないと1になります。
          問題は別にありますね。

          • 一番最初に承認を求められたので許可しています・・
            会社のアドレスでやっているので、なんらかのセキュリティシステムが働いてる可能性はありますか・・?

            • どうでしょう?セキュリティの問題は、私の方で再現できないのでなんとも言えないのですね。
              その会社のアドレスは、多量のメールを送ったりしますか?そうであるなら何か制限がかかっている可能性もありますね。
              取り敢えず可能でしたら、ご自分のGoogleアカウントで同じフォームを作ってテストするのが良いかもしれません。

          • 自分のアカウントで試したら飛びました!!ありがとうございます!!

            もう1点、分かればでよいのですが、
            現状メールの本文が改行されない状態で送られてしまっていまして、改行コードなどありましたらご教示いただけますと幸いですmm

            • おめでとうございます。
              セルの中での改行は、[Ctrl]+[Enter]、あるいは[Alt]+[Enter]で改行できます。
              文章の改行したい位置で[Ctrl]+[Enter]キーを入力して、そのまま文章を続けてください。
              私の例文の改行箇所には、[Ctrl]+[Enter]が入っているのですよ。
              ちなみに関数CHARを使うと、次のようになります。
              =”◯△◇様、”&CHAR(10)&”お世話になります。”

          • CHAR(10)で改行できました!ありがとうございます!
            とても参考になりましたmm

            Nice to haveですが、回答修正のリンクも入れられるともっと便利になりそうですね!
            また参考にさせていただきます!

  9. 記事拝見させていただき設定させていただきました。
    例えば、個数選択されていない商品項目の項目名は自動メールでは非表示にすることはできるのでしょうか?

    • 当ブログをご覧いただきありがとうございます。
      非表示にできるとお答えします。なぜならスプレッドシートの関数の問題なので大概のことはできるからです。
      具体例ですと、C2にフォームからの回答の商品個数が入るとして、本文中に、&IF(C2=0,””,”商品:”&C2&”個”)などようにIFを使うなどすればよいのではないでしょうか?

      • ご教示ありがとうございます。

        知識が無いもので、理解が追い付かず申し訳ございません。

        例えば、H1に商品名とH2に注文個数が飛んできます。

        下記の【現在の設定】だと、H2が空欄だったとしても注文確定メールには『商品× 個』で表示されています。
        H2が空欄の商品は注文確定メール上で非表示にしたいです。
        下記の【現在の設定】の場合、本文のどこに&IF(C2=0,””,”商品:”&C2&”個”)をいれればいいのでしょうか。

        【現在の設定】
        注文商品:
        “&H1&”×”&H2&”個
        注文者:”&I2&”

        “&J1&”×”&J2&”個
        注文者:”&K2&”

        お手すきの際にご教示いただけますと幸いです。

        • なるほどなるほど、なさりたいことが理解できました。
          本文のセルに次の様な形式で対応できると思います。
          セルの中での改行は[Ctrl]+[Enter]、あるいは[Alt]+[Enter]をお忘れなく。

          =IF(H2=””,””,”注文商品:”&H1&”×”&H2&”個
          注文者:”&I2&”

          “)&IF(J2=””,””,”注文商品:”&J1&”×”&J2&”個
          注文者:”&K2)

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