質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

2回答

3337閲覧

sendMailで複数回メールが送信される

kh101

総合スコア20

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

1クリップ

投稿2019/02/14 02:36

編集2019/02/14 02:49

Googleフォームから投稿があった場合にスプレッドシートの「送信先アドレス一覧シート」に記載されているアドレスに通知がされるようにしています。
スプレッドシートから「ツール>スクリプトエディタ」で下記のスクリプトを作成しました。

function sendform(e){ var s = SpreadsheetApp.getActiveSpreadsheet(); var addrSheet = s.getSheetByName("送信先アドレス一覧"); var lastRow = addrSheet.getLastRow() var range = addrSheet.getRange(3, 2, lastRow - 1).getValues() var count = range.length; var addr = ''; for(var i = 0; i < count; i++){ addr = addr + range[i] + ',' } addr = addr.slice(0, -2); var subject = "[投稿がありました]"; var items = ['名前', '住所', '備考']; var body = ['以下の内容で投稿がありました。 \n\n']; for (var i = 0, len = items.length, name; i < len; i++) { name = items[i]; body += '【' + name + '】 \n' + e.namedValues[name] + '\n\n'; } MailApp.sendEmail(addr, subject, body); }

トリガーは以下の通りです。
実行する関数:sendform
デプロイ時に実行:Head
イベントのソース:スプレッドシートから
イベントの種類:フォーム送信時
エラー通知設定:毎日通知を受け取る

フォームから送信した時に、複数回のメールが送信されます。
そのうち1件はフォームの入力内容が反映されているのですが、その他のメールは入力内容が空です。
送信される件数は2件の場合もあれば、5件の場合もあります。

メールが1回のみ送信されるようにしたいのですが、複数回メールが送信される原因がわかりません。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2019/02/14 02:52 編集

類似の質問を何度か目にしましたが、機能として多重化するバグはこれまでありませんでした。トリガが複数登録されていないか、共有している他のユーザがトリガを登録していないか、同じ名前の関数が複数存在しないか、送信先アドレスに同じものが入っていないか、などの設定・データをご確認いただけますか?
kh101

2019/02/14 03:00

送信先アドレス一覧を確認しましたが、重複はありません。 現状、共有しているユーザーはいないので、他のユーザーがトリガを登録していることはないと思います。 「マイトリガー」のぺージでは下記のトリガーのみ登録されています。 プロジェクト:sendform 前回の実行 :2019/02/14 11:14:22 イベント  :スプレッドシートから-フォーム送信時 関数    :sendform
papinianus

2019/02/14 03:06

コードを書く途中で、ファイルバックアップのためコピーしたりしていませんか? コードがこれしかないとして、2通目以降の不正メールにおける「その他のメールは入力内容が空です」というのは、"【"や"】"や見出し項目や、投稿がありましたという件名などは入っているものの、回答が空、という状態で間違いないですね?全くの白紙ではない、と。
kh101

2019/02/14 04:01

バックアップはとっていません。 "【"や"】"や見出し項目や、投稿がありましたという件名などは入っています。 回答のみ空の状態です、全くの白紙ではありません。
papinianus

2019/02/14 04:07

回答シートに、タイムスタンプ以外空白の行があるということでしょうか?
kh101

2019/02/14 04:17

例えば2回メールが送信された場合、1件目は回答ありのメール、2件目が回答なしのメールになりますが、回答シートには、1件目の内容のみ反映されます。 なので、回答シートには空白の行はありません。
papinianus

2019/02/14 06:32

聞けば聞くほど「コード~コピー.gs」があるとしか思えない動作です。解決策は思いつかないので、回避策を回答いたしました。
guest

回答2

0

あたらしく作ったフォームで試しましたが、そのような事象は再現しません。

  • フォームを作り直す

→コードは正常動作していますので、設定などに影響を受けている可能性が高く、googleドライブの設定を確認できない観点での回答としては、作り直しが確実かと思います

  • 必須項目を入れる

→GoogleFormはダブルクリックなどで再送できないようになっていたと思いますが、空白で送られているとしか考えられません。e.namedValuesは送信時のパラメータでなければ動作せず、またエラーがあればメールも送信されませんので、正常に動作しているとしか思えない状況。であれば、必須をかけることで、空白送信が抑止されて、人間が意図して送信した場合の動作が保たれるのではないでしょうか?

投稿2019/02/14 06:32

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kh101

2019/02/14 07:21

回答ありがとうございます。 フォームを新しく作成しなおし、項目を必須にしましたが、それでも現象は変わらず、回答が空のメールが届いてしまいました。
kh101

2019/02/14 07:26

↑ 申し訳ありません。 必須項目の設定漏れがありました。すべての項目を必須にしたら1通になりました。
papinianus

2019/02/14 07:27

逆になんでこっちには来ないのか不思議です。3アドレス指定しましたが、それぞれに1通ずつです。ちょっと私レベルでは理解できない現象です。すみませんでした。 必須にしていれば空白値は送られない、従ってe.namedValuesで対象にアクセスしたときに、内容が取れるはず。もし何らかの設定で回答と別の要因でスクリプトが動いているとしたら、2回目以降には、e.namedValuesの参照に失敗してundefinedエラーでメールがそもそも送られないはず。どう考えても理解不能な動作です。
papinianus

2019/02/14 07:29

全てを必須にしたら1通になるってのもおかしい気がする。もしかして項目はもっといっぱいあって、3つ以外のところに必須を設定なさったのでしょうか。
kh101

2019/02/14 07:35

フォームの入力項目は全部で3つです。 先ほど試したのは、必須項目が2項目、任意項目が1項目の状態で、全ての項目を入力してフォームを送信した時には2通メールが送信され、2件目は全ての回答が空の状態でした。 3つ全てを必須にしたら、1通になりました。
papinianus

2019/02/14 07:37

必須になっていようがいなかろうが、3つとも入力されている状態は、スクリプトレベルでは識別できないので、ほんと何で直ってんのか分からないです。 直ってるってことでよしとしましょう。
kh101

2019/02/14 08:00

すみません、何回か試したのですが、複数回メールが送信され、回答が空のものが届く現象が発生しました...
papinianus

2019/02/14 08:03

何で直ってるか分からなかった点は消えました。が、いくつか前に書いているとおり、私のレベルでは理解できないです。ベストアンサーを取り消して他の回答をまってください。
guest

0

まずは問題切り分けのため、sendform(e)自体が複数回動いているか確認したほうがよろしいかと思います。

投稿2019/02/14 03:46

Kaiser

総合スコア295

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kh101

2019/02/14 04:01

トリガーの実行数をみると、複数回トリガーが発動しています。 なぜ複数回トリガーが発動しているかがわからないです。
退会済みユーザー

退会済みユーザー

2019/02/14 09:38

複数回トリガーが作動しているのならトリガー設定に問題があるのでは?
退会済みユーザー

退会済みユーザー

2019/02/14 09:50

一度トリガーを全て消した状態でフォーム送信したらメール送られますか?トリガーがない状態ならメールは送られないはずですが
退会済みユーザー

退会済みユーザー

2019/02/14 10:27

今気づいたんですがこれってイベントのソースがスプレッドシートなんですね。 イベントのソースをフォームにしたほうがいいのでは?
退会済みユーザー

退会済みユーザー

2019/02/14 10:30

スプレッドシートのフォーム送信ってどんなイベントなのか挙動がよく分からないです。
kh101

2019/02/15 00:15

トリガーを全て消した状態でフォームを送信した場合はメールは送られません。 色々調べた中で、イベントのソースは「スプレッドシートから」で行っていた例が多かったので、その方法でやろうとしています。 イベントのソースを「フォームから」の方法も考えましたが、スプレッドシートのオブジェクトを取得できず、エラーが出てしまいます(TypeError: null のメソッド「getSheetByName」を呼び出せません。)
退会済みユーザー

退会済みユーザー

2019/02/15 01:22

スプレッドシートオブジェクトの取得にはopenByIdメソッドを使うといいかと思います。 var ss = SpreadsheetApp.openById("abc1234567");
退会済みユーザー

退会済みユーザー

2019/02/15 06:20

>色々調べた中で、イベントのソースは「スプレッドシートから」で行っていた例が多かったので、その方法でやろうとしています。 具体的に参考にしたサイトはありますか? 例えばこのサイトだとイベントソースはフォームになっています。 https://takakisan.com/gas-form-send-email-tutorial/
退会済みユーザー

退会済みユーザー

2019/02/15 07:41

なるほど 出来るんですね 公式にもドキュメントありました。 https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events 「sendformの実行数が一回なのにメールが複数回送信される」 という事象であればsendform関数内を調べた方がいいと思いますが、今は「sendformが複数実行されている」という事象みたいなのでトリガー、フォームあたりを調べて行った方がいいかと思います。 問題をわかりやすくする為に、中身がない関数を用意してそれを実行する関数として設定して、トリガーの発動数が一回だけになるように調べて行った方がいいのではないでしょうか
kh101

2019/02/15 08:52

フォームからの方法でうまくいきました! ありがとうございます、助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問