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

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

ただいまの
回答率

89.97%

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

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 6,375

kh101

score 16

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • papinianus

    2019/02/14 13:07

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

    キャンセル

  • kh101

    2019/02/14 13:17

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

    キャンセル

  • papinianus

    2019/02/14 15:32

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

    キャンセル

回答 2

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/15 15:39

    例えば下記のサイトでは、スプレッドシートからになっています。
    https://www.atmarkit.co.jp/ait/articles/1708/28/news021.html
    https://manablog.org/google-form-email-push/

    ご提示いただいた、フォームからopenByIdメソッドを使用した方法でも試してみます。

    キャンセル

  • 2019/02/15 16:41

    なるほど 出来るんですね 公式にもドキュメントありました。
    https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events

    「sendformの実行数が一回なのにメールが複数回送信される」 という事象であればsendform関数内を調べた方がいいと思いますが、今は「sendformが複数実行されている」という事象みたいなのでトリガー、フォームあたりを調べて行った方がいいかと思います。
    問題をわかりやすくする為に、中身がない関数を用意してそれを実行する関数として設定して、トリガーの発動数が一回だけになるように調べて行った方がいいのではないでしょうか

    キャンセル

  • 2019/02/15 17:52

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

    キャンセル

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/14 16:37

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

    キャンセル

  • 2019/02/14 17:00

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

    キャンセル

  • 2019/02/14 17:03

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

    キャンセル

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

  • ただいまの回答率 89.97%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる