質問: value; } } //本文1に本文2を追加 body += body2; //宛名=mail、件名=title、本文=bodyで、メールを送る GmailApp.sendEmail(mail,title,body); } ``` ちなみに、 スプレッドシートにメールアドレスはちゃんとシートごとに追加されています。 プロジェクトエディタの実行(再生マーク)では正しくメール1通のみです。 フォームに回答して自動送信になると2通となります。 どこが間違っているのか、そもそもできないのかもわからず、困っております... ### 試したこと ここに問題に対して試したことを記載してください。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。
回答: 内容理解できました。(というより自分の理解力が不足していました・・・w) まずやりたいことを例え話で言うと、 レストランを経営していたとして、予約フォームとメルマガの登録フォームの管理を 1つのスプレッドシートでやりたいのに、 回答者が予約フォームに投稿したら、メルマガの自動返信も一緒に送信されてしまう。 みたいな感じですかね。 ### 問題の原因 これはtrigger設定の問題で、スプレッドシート側からするとフォームから送信された事実は どのフォームからでも同じですので、 スプレッドシートからフォーム送信時(フォームの情報を受信時)に、 triggerが起動(設定された2つのスクリプト)して、 2通の自動返信メールが届くのが原因です。 ### 解決方法1 最もトラブル無く解決する方法は、フォーム側にスクリプトを書いて、 フォーム側のtriggerで、 「イベントのソースを選択:フォームから」 「イベントの種類:フォーム送信時」 とやればそれで解決できると思います。 フォーム側でスクリプトを動かす場合は、 var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('フォームの回答 2'); この文面の、 .getActiveSpreadsheet()が使えなかったと思うので、 スプレッドシートのIDを入れたりしないとだめだったと思います。 ### 解決方法2 スプレッドシート側でトリガーを設定したい場合は、 例えばフォーム1から送信されたときに、 フォーム2側のプログラムが起動したとしても、フォーム2側に新しい情報が無いから、そこでプログラムを終了する。 という風にして、実行しても、処理を中断させる手があります。 if文と、Trueの時にreturnすれば行けます。 ### 追記 if文と、Trueの時にreturnすれば行けます。 のところを実際のコードで言いますと ``` function myFunction() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var ss2 = ss.getSheetByName('TEST'); Logger.log(ss2 == undefined ) if (ss2 == undefined ) { Logger.log('シートが無いのでここで終了'); return; } Logger.log('シートがあったので、ここから先もやるよ'); return; Logger.log('returnの後だからこれは表示されないよ'); } ``` ss.getSheetByName('TEST');を実際にスプレッドシートにある名前と、無い名前を入れて動かしてみると違いが判りますが、プログラムの途中で「return;」があると、そこでプログラムは終了して、 それ以降の処理はやらなくなります。 これを利用することで、条件に応じて、途中でプログラムを停止させる事ができます。