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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google スプレッドシート

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

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google Apps Script

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

Q&A

解決済

1回答

626閲覧

フォーム回答で特定の列のセルに特定の言葉が入力されるとメール通知するようにしたい

KOJI

総合スコア3

Google スプレッドシート

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

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google Apps Script

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

0グッド

2クリップ

投稿2023/05/23 06:43

実現したいこと

・フォーム回答のシートでN列に「変更」が入るとメール通知するようにしたいです!

前提

Googleフォームからの回答を受け付けるシートでN列に「変更」という回答があった場合のみメール通知が来るようにしたいです。
N列の「変更」はチェックボックス式のフォームのチェックを入れると入力されるようにしています。

該当のGAS

function sendEmailOnFormSubmit(e) { var sheet = e.source.getSheetByName('フォームの回答'); // シート名を適宜変更 var dataRange = sheet.getDataRange(); var values = dataRange.getValues(); // フォーム送信データの最終行を取得 var lastRow = dataRange.getLastRow(); // 回答が「変更」となっている行を検索 var hasAdjustment = false; for (var i = 1; i < lastRow; i++) { var response = values[i][13]; // N列のインデックスを指定します if (response === '変更') { hasAdjustment = true; break; } } if (hasAdjustment && e.namedValues['変更'][0] === '変更') { var recipient = 'mail@gmail.com'; //メールアドレス var subject = '【メールタイトル】'; var message = '変更がありました。'; MailApp.sendEmail(recipient, subject, message); } }

試したこと

GPTを用いて修正をしたりなどしていますが、メールが来ない…もしくはどんな回答でもメールが来るようになってしまいます。

補足情報

トリガー設定は
「実行する関数を選択」で「sendEmailOnFormSubmit」
「イベントのソースを選択」で「スプレッドシート」
「イベントの種類を選択」で「フォーム送信時」
になっています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

フォーム送信イベントから得られるデータに回答先シートに記入する内容の配列e.valuesがあります。
内容は、[A列に記入する値(タイムスタンプ), B列に記入する値(最初の回答), ... 最後の列に記入する値(最後の回答)]となっています。
そのN列に記入されるデータはe.values[13]ですから、その値が「変更」のときにメールを送ります。
複数のフォームが同じスプレッドシートを回答先としているときのために最初のif文を加えてあります。

なお、自動で付加される回答先のシート名は通常は「フォームの回答 1」ですが、ご提示のまま「フォームの回答」としてあります。

JavaScript

1function sendEmailOnFormSubmit(e) { 2 //このスプレッドシートを回答先としているフォームが1つのときは次のif文は不要。 3 if (e.source.getActiveSheet() != 'フォームの回答') {//「フォームの回答 2」等への回答は除外 4 console.log(e.source.getActiveSheet().getName()); 5 console.log('回答先シートが異なる他のフォームからの回答です。'); 6 return; 7 } 8 //回答先シートのN列(14列=index:13)への回答の値が「変更」の場合にメールを送信 9 if(e.values[13] == '変更') { 10 var recipient = 'mail@gmail.com'; //←ここに送信先メールアドレスを記入 11 var subject = '【メールタイトル】'; 12 var message = '変更がありました。'; 13 MailApp.sendEmail(recipient, subject, message); 14 } 15}

なお、配列e.valuesの内容をご確認したい場合は、

JavaScript

1 e.values.forEach((v, i) => { 2 console.log((i + 1) + '番目の値:' + v); 3 });

の3行を冒頭に挿入してみてください。
エディタの左欄の「実行数」から得られるログに内容が表示(フォーム送信後しばらく待つ必要があります)されるようになります。

投稿2023/05/23 07:52

編集2023/05/23 08:11
YellowGreen

総合スコア731

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

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

YellowGreen

2023/05/23 08:03 編集

念のためですが、フォーム送信イベントからeの値を取得しているので、このスクリプトはエディタから実行するとフォームの回答がないのでエラーが発生します。
KOJI

2023/05/23 08:25

エディタ実行エラーは想定していましたが、ReferenceError: e is not defined at [unknown function](コード:5:3)が表示されメールが届きません。。お手数ですがご確認お願いします。
YellowGreen

2023/05/23 08:32

function sendEmailOnFormSubmit(e) { の(e)が抜けていたとき function sendEmailOnFormSubmit() { になっているときやe以外の文字になっているときに発生するエラーです。 当方では正常に動作しております。 ( )の中が半角英文字のeかどうかをご確認いただくのと それでもエラーが発生するときは、 念のため、トリガーの再設定をしてみてください。
YellowGreen

2023/05/23 09:04 編集

at [unknown function]とあるのは、トリガー対象の関数名を取得できていないのでしょうか。 同じ名前の関数がエディタに複数あるとかでしょうか? その後 色々試してみました。 function sendEmailOnFormSubmit() { のように( )の中の e を空白にするとReferenceErrorが発生しますが、 at [unknown function]の表示は再現できません。
KOJI

2023/05/23 09:24

回答先のフォームが1つなのでif~returnまでを消して、eを空白にしてみましたが同じ感じになります。ちなみにトリガー設定は「sendEmailOnformSubmit」のHeadで「スプレッドシートから」の「フォーム送信時」にしています!度々お手数おかけします。
YellowGreen

2023/05/23 09:27

eは()内に残さなければですよ。e.valuesで参照してます。
KOJI

2023/05/23 09:39 編集

function sendEmailOnFormSubmit(e) { //このスプレッドシートを回答先としているフォームが1つのときは次のif文は不要。 } //回答先シートのL列に変更したので「11」にしています if(e.values[11] == '変更') { var recipient = 'sample@gmail.com'; //←ここに送信先メールアドレスを記入 var subject = '【メールタイトル】'; var message = '変更がありました。'; MailApp.sendEmail(recipient, subject, message); } にして先程のトリガーで再設定しましたけどメールはやはり送られません。。 ReferenceError: e is not defined at [unknown function](コード:5:3)です
YellowGreen

2023/05/23 09:43 編集

それは送られないと思います。 if文は{から}までありますので、 //回答先シートのL列に変更したので「11」にしています の前の } の行が残っているので関数がそこで終了してしましますから、その } だけの行も不要です。削除してみてください。
YellowGreen

2023/05/23 09:44

unknown functionの意味がわかりました。 関数が途中で終了して、残りは関数の外のコードになっていたのでeを参照できなかったのですね。
YellowGreen

2023/05/23 09:47

次のif文は不要 ではなく 次の5行は不要と書いておけばよかったですね。 私のミスです。 ごめんなさい。
KOJI

2023/05/23 09:51

解決いたしました!本当にご丁寧にありがとうございました! 感謝してもしきれないほど懇切丁寧にありがとうございます!
YellowGreen

2023/05/23 09:52

お役に立てて良かったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問