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

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

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

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

Google フォーム

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

Google Apps Script

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

Q&A

解決済

1回答

1180閲覧

フォームの送信時(編集時)にe.namedValuesの値が取れない

wciwij

総合スコア3

Google スプレッドシート

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

Google フォーム

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

Google Apps Script

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

0グッド

1クリップ

投稿2023/04/30 03:56

編集2023/04/30 03:57

実現したいこと

以下のサイトとまったく同じPGでフォーム送信時にメールを送っています。
https://tatsuya-note.com/gas-autoreplymail-forms/?unapproved=59&moderation-hash=2b06bc2b38770f4ef8968c02e2208401#comment-59

原因・回避策がお分かりの方教えていただきたいです。

発生している問題・エラーメッセージ

新規回答では値が取れますが、回答の編集では値が取れません.
正確にはe.namedValues["タイムスタンプ"][0];
は値が取れています。それ以外の値が取れません。

eがundifinedとなるようです

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

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

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

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

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

YellowGreen

2023/04/30 07:12

編集した回答の送信があったときに、タイムスタンプの値が取得できているのであれば、 タイムスタンプだけが取得できて、その他の値が取得できないときは、 編集による回答の送信だと判断して、 回答先のシートでA列がそのタイムスタンプの値と一致する行を検索して それぞれ必要な列からセルの値を取得する方法では希望の動作になりませんか?
wciwij

2023/04/30 07:49

回答ありがとうございます。 原因不明ということでしょうか。 PG初心者でいろいろなところでつまずいておりまして、別のPGを参考に作ろうと思います。 ありがとうございました。
YellowGreen

2023/04/30 21:43 編集

実際に試してみました。 スプレッドシートのフォームの送信イベントの内容は、 回答が編集されたときには、既存の回答全てではなく、 タイムスタンプと変更された回答のみが取得できました。 前回の回答から変更がないものには値がないようです。 namedValuesは、タイムスタンプと質問と更新のあった回答(他の回答は値がない) valuesは、タイムスタンプと更新のあった回答(他の回答は値がない) といずれのイベントの内容も更新されたもののみでした。 namedValuesのオブジェクトの要素数もvaluesの配列の要素数も スプレッドシートに追加される質問と回答の数に一致はしていて 更新がないものは、値がないだけですね。
YellowGreen

2023/04/30 21:59 編集

こちらをトリガー設定することでフォーム送信時の実行ログから確認できます。 function onSubmit(e) { const response = e.namedValues; for (const key in response) { console.log(key + ': ' + response[key][0]); } const values = e.values; for (const value of values) { console.log('A= ' + value); } }
wciwij

2023/05/01 01:05

再びの回答ありがとうございます。 作成いただいたPGで以下確認できました。 == スプレッドシートのフォームの送信イベントの内容は、 回答が編集されたときには、既存の回答全てではなく、 タイムスタンプと変更された回答のみが取得できました。 前回の回答から変更がないものには値がないようです。 == 仕様であれば仕方ないですね・・・・ タイムスタンプからスプレッドシートを検索して値をGETとなると思うのですが、 タイムスタンプが被ったら・・など私の力量的に難しいようなので、 別の方法を検討してみます ありがとうございました
YellowGreen

2023/05/01 01:35

タイムスタンプの件も確認しましたが、 必ずしも一致するとは限りませんでした。 残念ながら、1秒ずれた場合がありました。
wciwij

2023/05/01 13:35

タイムスタンプまで確認いただきありがとうございます。 別途検討いたします。
guest

回答1

0

ベストアンサー

e.namedValuesそのものを取得するわけではありませんが、
トリガー起動の際にタイムスタンプから最新の回答(編集によるものを含む)を取得してメールに送るスクリプトを例示のスクリプトのメール送信に近い形で作成してみました。(メール送信の部分は、e.namedValuesからe.を消去してnamedValuesに変えることでそのまま使えます。)
トリガー起動で実行できます。eの値は参照しない代わりに、フォームの回答先のシート名を指定します。

javascript

1//フォームの最新の回答(編集の回答を含む)を取得 2function onFormSubmit() {//トリガー起動でもeは不要 3 const ss = SpreadsheetApp.getActiveSpreadsheet(); 4 const sheet = ss.getActiveSheet(); 5 //フォームの回答先シート名の確認(複数のフォームの回答先の対応) 6 if (sheet.getName() != 'フォームの回答 1') {//←シート名を書き換える 7 console.log('回答先のシート名[' + sheet.getName() + ']が違います。'); 8 return; 9 } 10 //シートの値を配列に取得 11 const values = sheet.getDataRange().getValues(); 12 //1行目の質問名を取り出す 13 const questions = values.shift(); 14 //1列目のタイムスタンプで最新の回答から降順に並び替え 15 values.sort((a, b) => new Date(b[0]) - new Date(a[0])); 16 const answers = values.shift(); 17 //最新のタイムスタンプの行から回答を取得 18 const namedValues = {};//eは使わない 19 answers.forEach((value, index) => namedValues[questions[index]] = [value]); 20 console.log(namedValues["お問合せ内容"]); 21 let TimeStamp = namedValues["タイムスタンプ"][0]; 22 let Name = namedValues["お名前"][0]; 23 let Email = namedValues["メールアドレス"][0]; 24 let InquiryContent = namedValues["お問合せ内容"][0]; 25 let Subject = "【自動返信】" + Name + " 様 お問合せありがとうございます"; 26 let Body = Name + "様 お問合せありがとうございます。" + "\n" + 27 "\n" + 28 "担当者より改めてご連絡いたしますのでもうしばらくお待ちください。" + "\n" + 29 "\n" + 30 "〜お問合せ内容〜" + "\n" + 31 "お名前:" + Name + "\n" + 32 "メールアドレス:" + Email + "\n" + 33 "お問合せ内容:" + InquiryContent + "\n" + 34 "\n" + 35 "フォーム送信日時:" + TimeStamp + "\n"; 36 GmailApp.sendEmail(Email, Subject, Body); 37}

投稿2023/05/01 06:25

編集2023/05/01 06:40
YellowGreen

総合スコア731

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

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

wciwij

2023/05/01 13:37

同時にデータが送信される可能性が高く、別途質問しているスプレッドシートからURL作成&メール送信が無難なような気がしています。 また、ご相談させてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問