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

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

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

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

Google フォーム

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

Q&A

解決済

1回答

864閲覧

GAS 自動でメール送信 Googleフォームの回答内容と回答内容を参照したセルの値をメール本文に出力したい。

kenta_kenta

総合スコア19

Google スプレッドシート

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

Google フォーム

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

0グッド

0クリップ

投稿2021/12/10 06:28

前提・実現したいこと

Googleフォームで回答がされたら自動で返信できるスクリプトを作成したいです。

Googleフォームの回答に対して、回答内容を参照して関数を組んでいるセルの中身を出力して、自動でメール送信をしたい。

発生している問題

url(回答内容を参照して同じスプレッドシート内で関数を組んでいるセル)が メール内に表示されない。
おそらくトリガーがフォーム送信時になっているのが問題かと思っていますが解決方法がわかりませんでした。
O列(URLが入る列)に事前に文字列を入れた場合にはメール文面に反映されました。

トリガー
イベントソースの選択:スプレッドシートから
イベントの種類を選択:フォームの送信時

試したこと

今書いてあるコードです。

function sendReply(e) { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName('回答内容とurl生成のセルがあるシート'); const answeredName = e.values[3] // 回答されたお名前 const answeredEmail = e.values[4] // 回答されたEmail const ownName = '自分の名前' // こちらの名前 const title = "タイトル件名" const row = sheet.getLastRow(); //最終行を取得 const url = sheet.getRange(row, 15).getValue(); //定数urlにO列(URL生成の列)の最終行にあるセルの中身を取得 const body = ` ${answeredName} 様 メール本文 ${url} ` GmailApp.sendEmail(answeredEmail, title, body)

その他

初学者で調べながら見様見真似でやってます。初歩的なミスもあるかもしれませんが、よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

トリガー
イベントソースの選択:スプレッドシートから
イベントの種類を選択:フォームの送信時
を設定したとき、フォームの内容は、namedValuesというオブジェクトで渡されます。

そして、複数チェックボックス以外のアンケート項目は
e.namedValues['質問項目'][0];
という書き方で、回答を取り出せます。

例えばフォームの質問項目(タイトル)が「名前」「Email」である場合、
名前とEmailは下記のようにして取得できます。

js

1function sendReply(e) { 2 3 const ss = SpreadsheetApp.getActiveSpreadsheet(); 4 const sheet = ss.getSheetByName('回答内容とurl生成のセルがあるシート'); 5 6 const answeredName = e.namedValues['名前'][0]; // 回答されたお名前 7 const answeredEmail = e.namedValues['Email'][0]; // 回答されたEmail 8 9以下略

#追記

フォームの解答以外のセルを出力するにはどうしたら良いかがわかりません。

フォーム送信して新しいデータが最下行に追加された時、O列に入っている式が計算される前(ARRAYFORMULAが走る前)にスクリプトが実行されて、空白セルとしてデータが読み取られてしまっているのが原因と思われます。

解決方法として、O列に入っている数式と同じものを、スクリプト上で組み立てるやり方が考えられます。

※下記のコード内の'XX列の質問項目' は、実際のフォームの質問項目に変えてください。
(3行目にnamedValuesの内容をログ出力するコードを追加したので、その出力を参考に)

js

1function sendReply(e) { 2 // 追加 3 console.log(JSON.stringify(e.namedValues, undefined, 1) // フォームの質問項目の内容を出力 4 5 const ss = SpreadsheetApp.getActiveSpreadsheet(); 6 const sheet = ss.getSheetByName('回答内容とurl生成のセルがあるシート'); 7 8 const answeredName = e.namedValues['名前'][0]; // 回答されたお名前 9 const answeredEmail = e.namedValues['Email'][0]; // 回答されたEmail 10 const ownName = '自分の名前' // こちらの名前 11 const title = "タイトル件名" 12 13// -------追加------- 14 // 'XX列の質問項目' は、実際のフォームの各質問項目に変えてください。 15 const C = encodeURI(e.namedValues['C列の質問項目'][0]); 16 const D = encodeURI(e.namedValues['D列の質問項目'][0]); 17 const F = encodeURI(e.namedValues['F列の質問項目'][0]); 18 const G = encodeURI(e.namedValues['G列の質問項目'][0]); 19 const H = encodeURI(e.namedValues['H列の質問項目'][0]); 20 const I = encodeURI(e.namedValues['I列の質問項目'][0]); 21 const J = encodeURI(e.namedValues['J列の質問項目'][0]); 22 const K = encodeURI(e.namedValues['K列の質問項目'][0]); 23 const L = encodeURI(e.namedValues['L列の質問項目'][0]); 24 const M = encodeURI(e.namedValues['M列の質問項目'][0]); 25 const N = encodeURI(e.namedValues['N列の質問項目'][0]); 26 27 const url = "https://docs.google.com/forms/d/e/Googleフォームのキー/viewform?usp=pp_url&entry.2145272979=" 28 + C + "&entry.918876992=" + D 29 + "&entry.965629543=" + F 30 + "&entry.789231669=" + G 31 + "&entry.55383597=" + H 32 + "&entry.343743215=" + I 33 + "&entry.1212281365=" + J 34 + "&entry.2139868976=" + K 35 + "&entry.36015981=" + L 36 + "&entry.2091679258=" + M 37 + "&entry.269090822=" + N 38 39// -------追加ここまで------- 40 41 const body = ` 42 ${answeredName}43 44 メール本文 45 46 ${url} 47 ` 48 GmailApp.sendEmail(answeredEmail, title, body) 49 50(以下略) 51 52}

「'XX列の質問項目' は、実際のフォームの各質問項目に変えてください。」というのは下のような意味です。
たとえばフォームが図のような質問だと仮定します。
イメージ説明
このとき、色の枠で囲った部分を、それぞれe.namedValues['○○']の「○○」に入れてください、という意味です。

const C = encodeURI(e.namedValues['好きな果物は何ですか?'][0]); const D = encodeURI(e.namedValues['好きな動物は何ですか?'][0]); const F = encodeURI(e.namedValues['好きな野菜はなんですか?'][0]); const G = ... ... ..

投稿2021/12/10 16:18

編集2021/12/13 15:14
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kenta_kenta

2021/12/10 23:27

ご回答ありがとうございます。 フォームの解答以外のセルを出力するにはどうしたら良いかがわかりません。
退会済みユーザー

退会済みユーザー

2021/12/10 23:58 編集

フォーム送信して新しいデータが最下行に追加された時、O列に入っている式が計算される前にスクリプトが実行されて、空白セルとしてデータが読み取られてしまっているのが原因と思われます。 解決方法として、O列に入っている数式の計算を、スクリプト上で再現するやり方が考えられます。 O列には具体的にどのような数式が入っているのでしょうか? たとえば2行目のO2セルに入っている数式を、省略することなく記載してください。 その式をスクリプトに変換したものを回答します。
kenta_kenta
退会済みユーザー

退会済みユーザー

2021/12/12 08:03

追記しました。
kenta_kenta

2021/12/13 13:17 編集

詳しくご回答ありがとうございます。勉強になります。 URLを実際のメール本文に出力することができました!! ちなみにURL内に文字列が入ってしまうのですが、変換することは可能なのでしょうか? // 'XX列の質問項目' は、実際のフォームの各質問項目に変えてください。 (3行目にnamedValuesの内容をログ出力するコードを追加したので、その出力を参考に) └こちらは質問項目をコピペするのではなく、3行目のような形で記載が必要でしょうか? 今はやり方がよくわからず、質問内容をそのままコピペしています。 1から10まで聞いており申し訳ございませんが、ご回答いただけますと助かります。
退会済みユーザー

退会済みユーザー

2021/12/13 15:15

追記しました。 「ちなみにURL内に文字列が入ってしまうのですが、変換することは可能なのでしょうか?」についてですが、%のような文字に変換することを言っているのだと推測し、encodeURI関数で囲むように直しました。
kenta_kenta

2021/12/14 07:25

無事思っていた通りに実装ができました。 すぐに回答いただいて本当に助かりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問