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

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

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

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

Google フォーム

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

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

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

Q&A

解決済

1回答

3613閲覧

【GAS】フォーム→スプレッドシート→Gメール e.valuesの取得

donguriko

総合スコア30

Google スプレッドシート

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

Google フォーム

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

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

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

0グッド

0クリップ

投稿2022/08/16 10:14

編集2022/08/16 10:55

前提

Googleフォームで簡単な申請ワークフローを作りたいです。
スプレッドシート側でfunction sendMessage(e)をトリガー画面で
イベントソース:スプレッドシートから
イベントの種類:フォーム送信時
で登録しました。

(フォームイメージ)
イメージ説明

イメージ説明

イメージ説明

(回答集約用スプレッドシートイメージ)
イメージ説明

実現したいこと

スプレッドシート側のGASで、新たな申請があった際に、
指定アドレス宛にGoogleフォームの回答内容を含んだ
「回答お知らせメール」をGASで自動送信したいです。

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

フォーム送信をすると、指定アドレス宛にメール送信する処理はできています。
が、フォームの回答内容の取得で失敗しているようで、メール本文上で
表示がされません。

(失敗メールイメージ)
イメージ説明

該当のソースコード

以下全文記載します。

GAS

1function sendMessage(e) { 2 console.log(e) 3 4 //▼配列(e.values)から取得するデータの定義 5 //フォームからの送信データは配列(e.values)として格納 6 //取得したい項目はタイムスタンプ、部署、従業員番号、申請者氏名4つ 7 const timeStamp = e.values[0] ; //タイムスタンプは配列(e.values)のインデックス1 8 const dept = e.values[1] ; //部署は配列(e.values)のインデックス2 9 const EmpNo = e.values[2] ; //従業員番号は配列(e.values)のインデックス3 10 const Name = e.values[3] ; //申請者氏名は配列(e.values)のインデックス4 11 12 const ss = SpreadsheetApp.openById('  ~省略~ '); 13 mySheet1 = ss.getSheetByName('回答マージ'); 14 mySheet2 = ss.getSheetByName('申請お知らせメール宛先'); 15 16 //▼メール宛先の設定 17 //★あとで修正★ 18 //「申請お知らせメール宛先シート(mySheet2)のセルF6から取得 19 //const recipient = mySheet2.getRange(4, 6); 20 const recipient = ('  ~省略~ '); 21 22 //▼メール件名の設定 23 const subject = '【稼働テスト_XXX変更申請】'; 24 25 //▼メール本文の設定 26 let body = ''; 27 body += '本メールは自動送信メールです。\n'; 28 body += '\n'; 29 body += 'XXXの変更申請がありました。\n'; 30 body += '・申請日時    :${timeStamp}\n'; 31 body += '・申請者所属部署 :${dept}\n'; 32 body += '・申請者従業員番号:${EmpNo}\n'; 33 body += '・申請者氏名   :${Name}\n'; 34 body += '\n'; 35 body += '以下URLからスプレッドシートを確認し、\n'; 36 body += '「確認①(●列)」\n'; 37 body += '「確認②(●列)」\n'; 38 body += 'にチェックを入れてしてください。\n'; 39 body += 'https://  ~省略~ '; 40 41 //▼メールオプション 42 const options = { 43 name: '<自動送信>XXX変更申請', 44 noReply: true 45 }; 46 47 //▼メール送信 48 GmailApp.sendEmail(recipient, subject, body, options); 49} 50

試したこと

画面左の「実行数」ボタンで表示されるログ? で確認をすると、
namedValuesのところに内容が入っていて、スプレッドシートにも
内容転記がされているので配列e.values内にデータはありそう。
イメージ説明

メールに流用したい、
・timeStamp
・dept
・EmpNo
・Name
の4項目のインデックス番号の指定が誤っているのか?
と、思っているのですが、知識が足りず、どうやって正しい
インデックス番号を確認すればよいか分かりません。
(ネットでも、そこまで初心者向けの解説を見つけられず。。。)

回答集約スプレッドシートの項目の並び順をもとに左からインデックス[0]、、、
でコードを書いてみましたが、実行数画面で表示されているイメージでは
各項目の並びがスプレッドシートと異なっています。

<質問①>
メール本文上で内容表示がされない原因と修正方法を教えてください。
(単純なコード記載ミスの見落としでしたら申し訳ありません)

<質問②>
インデックス番号の指定誤りが原因の場合は、
次回から自力解決したいのでインデックス番号の確認の仕方を教えてください。

<質問③>
初歩の初歩な内容で本当に申し訳ありません。
フォームからの送信をトリガーにしている時のログ等の確認の仕方を教えて
ください。
console.log等で正しくデータ取得しているのか確認したいと思ったのですが、
スクリプト画面の実行ボタンから処理させると、e.valuesか取得できず。。。
次回から自力解決したいので、どうすれば正しくデータ取得できているかの
確認やデバッグ? 確認をすればよいか教えてください。

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

非エンジニアビギナーです。
お忙しいところ申し訳ありません。
回答に時間がかかってもかまわないので、次回から自力解決できるように
なりたいので、非エンジニアビギナーレベルでも理解できるレベルでの
回答をいただけると助かります。

GAS本や下サイトを参照しましたが、
イベントオブジェクトのe.valuesの使い方が消化不良気味です。

(参照したサイト)
リンク内容①
リンク内容②

回答を受け追記
(ログイメージ 取得したい4項目のconsole.log)
無事確認できました。ありがとうございました。
イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

<質問①> メール本文上で内容表示がされない原因

プレースホルダ(${ })を含む文字列が、シングルクォート(「'」)で囲まれているためです。

プレースホルダ(${ })を変数の内容に置き換えるには、シングルクォート(「'」)ではなく、バッククォート(「`」)で囲まなければなりません。

js

1 //▼メール本文の設定 2 let body = ''; 3 body += '本メールは自動送信メールです。\n'; 4 body += '\n'; 5 body += 'XXXの変更申請がありました。\n'; 6 body += `・申請日時    :${timeStamp}\n`; 7 body += `・申請者所属部署 :${dept}\n`; 8 body += `・申請者従業員番号:${EmpNo}\n`; 9 body += `・申請者氏名   :${Name}\n`;

<質問③>
フォームからの送信をトリガーにしている時のログ等の確認の仕方:

フォームからデータを送信した後、エディタの左側に並んでいるアイコンのうち、下の図の色付きの枠で囲んだ部分のアイコンをクリックします。
イメージ説明

そうすると、記録されたログの一覧が表示されるため、見たいログの行をクリックします。
イメージ説明
(処理状況によっては、ログに反映されるまで時間がかかっており、クリックしても何も表示されない場合があります。その場合はしばらく経ってから再度クリックしてみてください)

投稿2022/08/16 10:34

編集2022/08/16 10:34
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

donguriko

2022/08/16 11:02

qnoirさま お忙しい中、確認と回答・解説ありがとうございました。 原因は、シングルクォート(「'」)とバッククォート(「`」)の 間違いだったのですね。 大変失礼いたしました。 使い分けが必要なのですね。しっかり覚えます。 修正したら、想定通りに動きました。 ありがとうございました。 又、ログ確認の仕方のレクチャーありがとうございました。 取得したい4項目でconsole.logを追記したところ、ログイメージ確認 できました。(画像追加添付) こちらもしっかり覚えて、次回から、活用します。 配列e.valuesのインデックスの考え方等、私の理解で大筋 間違ってはいなさそうなので、自分のモノにできるよう、 色々なケースで実際に手を動かしてみて、引き続き習得に 励みたいと思います。 いつも丁寧なレクチャー本当にありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問