🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Q&A

解決済

1回答

3513閲覧

2つのgoogleformを1つのスプレッドシートで管理する時のスクリプト

h_fukuda

総合スコア5

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

0グッド

0クリップ

投稿2019/11/20 01:40

編集2019/11/20 02:10

前提・実現したいこと

2つのgoogleformを1つのスプレッドシートで管理し、内容の違う自動返信メールを送りたい。

前提・実現

回答形式の2つのgoogleformを作成し、
1つのスプレッドシートで管理するために、シートを分けて関連付けました。

(テスト1は回答フォーム1、テスト2は回答フォーム2とします)

form送信後に自動返信メールを送りたいのですが、メール本文の内容が回答フォームごとに違うため、スクリプトを新規で追加しました。
フォームに回答後、メールは届きますが、テスト1用とテスト2用両方届いてしまいます。

全くの初心者なので、ネットで見たソースを参考に作成しております。
シート別に違う内容のメールを送ることはそもそも不可能なのでしょうか…

現在2通届いてしまうソースはこちらです。

▼テスト1 フォームの回答 1

function auto_reply() { //自動返信メールの件名 var title = "【テスト1用(自動返信)】"; //自動返信メールの本文1(\nは改行) var body = "この度はお申し込みいただきまして、誠にありがとうございます。\n" + "お問合せいただいた内容は次の通りです。\n" + "------------------------------------------------------------\n\n" //自動返信メールの本文2(\nは改行) var body2 = "------------------------------------------------------------\n\n" + "内容を確認の上、あらためて返信させていただきます。\n"; + "本メールに心当たりが無い場合は、その旨を記載の上ご返信下さいますようお願い申し上げます。\n\n"; //本文作成用の変数 var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('フォームの回答 1'); var row = sheet.getLastRow(); var column = sheet.getLastColumn(); var range = sheet.getDataRange(); //メールアドレス保存用の変数(最後のメール送信時に使用。) var mail = ""; for (var i = 1; i <= column; i++ ) { //スプレッドシートの入力項目名を取得 var header = range.getCell(1, i).getValue(); //スプレッドシートの入力値を取得 var value = range.getCell(row, i).getValue(); //本文1(body)にスプレッドシートの入力項目を追加 body += "■"+header+"\n"; //本文1(body)にフォームの入力内容を追加 body += value + "\n\n"; //スプレッドシートの入力項目が「お名前」の場合は、「様」を付け本文の前に追加 if ( header === 'お名前' ) { body = value+" 様\n\n"+body; } //フォームの入力項目が「メールアドレス」の場合は、変数mailに代入 if ( header === 'メールアドレス' ) { mail = value; } } //本文1に本文2を追加 body += body2; //宛名=mail、件名=title、本文=bodyで、メールを送る GmailApp.sendEmail(mail,title,body); }

▼テスト2 フォームの回答 2

function myFunction() { //自動返信メールの件名 var title = "【テスト2用(自動返信)】"; //自動返信メールの本文1(\nは改行) var body = "この度はお申し込みいただきまして、誠にありがとうございます。\n" + "------------------------------------------------------------\n\n" //自動返信メールの本文2(\nは改行) var body2 = "------------------------------------------------------------\n\n" + "ご来店を心よりお待ちしております。\n\n"; //本文作成用の変数 var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('フォームの回答 2'); var row = sheet.getLastRow(); var column = sheet.getLastColumn(); var range = sheet.getDataRange(); //メールアドレス保存用の変数(最後のメール送信時に使用。) var mail = ""; for (var i = 1; i <= column; i++ ) { //スプレッドシートの入力項目名を取得 var header = range.getCell(1, i).getValue(); //スプレッドシートの入力値を取得 var value = range.getCell(row, i).getValue(); //本文1(body)にスプレッドシートの入力項目を追加 body += "■"+header+"\n"; //本文1(body)にフォームの入力内容を追加 body += value + "\n\n"; //スプレッドシートの入力項目が「お名前」の場合は、「様」を付け本文の前に追加 if ( header === 'お名前' ) { body = value+" 様\n\n"+body; } //フォームの入力項目が「メールアドレス」の場合は、変数mailに代入 if ( header === 'メールアドレス' ) { mail = value; } } //本文1に本文2を追加 body += body2; //宛名=mail、件名=title、本文=bodyで、メールを送る GmailApp.sendEmail(mail,title,body); }

ちなみに、
スプレッドシートにメールアドレスはちゃんとシートごとに追加されています。
プロジェクトエディタの実行(再生マーク)では正しくメール1通のみです。
フォームに回答して自動送信になると2通となります。

どこが間違っているのか、そもそもできないのかもわからず、困っております…

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

takaD

2019/11/20 11:21

>内容の違う自動返信メールを送りたい。 >現在2通届いてしまう この二つは矛盾している気がします。 中身の違う手紙を送りたいなら、二枚ハガキを用意しないといけません。 どちらのソースにも GmailApp.sendEmail(mail,title,body); があるので、どちらもメールを送信するのは正しいことの様に思います。 もう少し情報がほしいです。 また、トリガー設定がどうなっているのかも追記した方がよさそうです。
h_fukuda

2019/11/21 01:11

ありがとうございます! 私の書き方が悪く申し訳ありません。 どう書いたらいいのか…難しいのですが、 テスト1とテスト2は全く内容の異なるフォームです。 フォーム回答後、自動返信メールを送ります。 その2つのフォームの管理を1つのスプレッドシートでしたいのです。 初心者なので手探りなのですが、 テスト1を関連付けたスプレッドシートへテスト2を関連付けて、 スクリプトエディタを2つ用意しました。 |中身の違う手紙を送りたいなら、二枚ハガキを用意しないといけません。 お言葉をお借りするなら、この「ハガキ」に当たる部分はスプレッドシートのシート「中身」はスクリプトエディタではないのでしょうか…考え方が間違っていますでしょうか? |どちらのソースにも |GmailApp.sendEmail(mail,title,body); |があるので、どちらもメールを送信するのは正しいことの様に思います。 正直、この意味すらわかっておらず、ただコピペして記載しているのが現状です。 トリガー設定は、 各フォームの関数名 head スプレッドシートから フォーム送信時 エラーは毎日通知 とシート分2つ設定しています。 意図がうまく伝わったのか不安ですが… よろしくお願いします!!
guest

回答1

0

ベストアンサー

内容理解できました。(というより自分の理解力が不足していました・・・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すれば行けます。
のところを実際のコードで言いますと

GAS

1function myFunction() { 2 var ss = SpreadsheetApp.getActiveSpreadsheet(); 3 var ss2 = ss.getSheetByName('TEST'); 4 5 Logger.log(ss2 == undefined ) 6 if (ss2 == undefined ) { 7 Logger.log('シートが無いのでここで終了'); 8 return; 9 } 10 Logger.log('シートがあったので、ここから先もやるよ'); 11 12return; 13Logger.log('returnの後だからこれは表示されないよ'); 14}

ss.getSheetByName('TEST');を実際にスプレッドシートにある名前と、無い名前を入れて動かしてみると違いが判りますが、プログラムの途中で「return;」があると、そこでプログラムは終了して、
それ以降の処理はやらなくなります。

これを利用することで、条件に応じて、途中でプログラムを停止させる事ができます。

投稿2019/11/21 04:05

編集2019/11/22 01:07
takaD

総合スコア315

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

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

h_fukuda

2019/11/21 04:30

回答ありがとうございます。 レストランを経営の例え…非常にわかりやすいです!まさにそうです。 トリガー設定の問題なのですね。イメージ湧きました。 解決方法も1と2を提示していただき本当に助かります。 解決方法2の意味はわかりますが 「if文と、Trueの時にreturnすれば行けます。」 と実際のソースが全くわかりませんので(お恥ずかしながら…) 解決方法1でなんとかしてみようと思い、 var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('フォームの回答 2'); こちらを var sheet = SpreadsheetApp.SpreadsheetApp.openById('スプレッドシートのID').getSheetByName('フォームの回答 2'); としました。 トリガーの設定を再設定しようと思いましたが、 ベントのソースを選択の箇所に「フォームから」がありません。 選択肢は ・スプレッドシートから ・時間主導型 ・カレンダーから の3つのみです。 「フォームから」の選択肢を追加するにはまた別のソースを記載しないといけないのでしょうか?
takaD

2019/11/21 06:11

スプレッドシートにあるスクリプトではなく、フォームにあるスクリプトです。 フォームの編集画面の右上の中から、スクリプトを作る奴を見つけて下さい。
h_fukuda

2019/11/21 06:50

度々のご返信ありがとうございます フォームにもスクリプトを記載する箇所があるとは…しりませんでした。。。 takaDさんの教えていただいた通りにしたことろ、見事にできました!!!!!!!感動です > < なぜなのか、どういった仕組みなのかはわかりません。が!できたことが嬉しいです! ありがとうございました! 諦めないで良かった・・・ 本当にありがとうございました!
takaD

2019/11/21 07:17

自分もフォームにもスクリプトが作れるというのを知ったときはびっくりしました・・・w 解決できて何よりです。おめでとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問