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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Google フォーム

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

Google Apps Script

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

Q&A

解決済

1回答

351閲覧

GASを利用してGoogleフォームで入力された情報をメールで送信する際、3桁のフォーマットに指定した状態の自動採番された番号をメール文に記述したい。

wa3bon

総合スコア2

Google フォーム

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

Google Apps Script

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

0グッド

0クリップ

投稿2022/08/30 04:52

前提

GAS初心者です。
まず、やりたい最終目標としてはタイトルの通りで、Googleフォームに入力された内容が担当者にメールで飛ぶようにGASを作成したいです。
大まかな記述はできたのですが、以下の質問を参考にして記載したコードが上手く動いてくれず、メール文に載ってくれませんでした。
https://teratail.com/questions/b2jmdsssrijrro
変数を上記回答そのまま利用してしまっているので、そこが問題かも?というところまでは浮かんだのですが、参考にした質問の②と③は必要ない機能のため、自分のスクリプトに当てはめた時にどこを修正する必要があるのか、もしくは追加で変数の宣言等が必要なのかが分かりませんでした。

さらに、この番号を「001」→「002」のように頭に「00」を付けた3桁のフォーマットに指定したいのですが、こちらはスプレッドシートとスクリプトのどちらで指定するのでしょうか?

フォーマットの指定方法と、スプレッドシートから値を取得してメール文に載せる方法をご教示いただけますと幸いです。
どうぞよろしくお願いいたします。

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

TypeError: Cannot read property 'getRow' of undefined at sendMessage(コード:57:23)

getRowはメソッドの認識なので、未定義というエラーの状態がよくわかっていないです。

該当のソースコード

JavaScript

1FormApp.getActiveForm() 2function sendMessage(e) { 3 // GoogleFormから回答内容を取得 4 let itemResponses = e.response.getItemResponses(); 5 6 // 各変数定義 7 let name; 8 let email; 9(中略)10 11 // スプレッドシートの受付番号を取得して変数rowに代入 12 const row = e.range.getRow(); 13 const sheet = e.range.getSheet(); 14 row = sheet.getRange(row, 2); 15 // 送信先のメールアドレス 16 const mailadress = `${email}`; 17 // 件名変数 18 const subject = '件名'; 19 // 本文変数 20 let body = ''; 21 22 body += `${name}様\n\n`; 23 (中略)24 body += '受付番号: ${row}\n'; 25 body += `お名前: ${name}\n`; 26 body += `メールアドレス: ${email}\n`; 27 (中略)28   29 // メールを送る際の変数を設定 30 GmailApp.sendEmail(mailadress, subject, body);

試したこと

1.スプレッドシートに以下の関数を追加
=arrayformula(if(B1:B<>"",row(A1:A)-1,""))

2.スプレッドシートから値を取得し、変数に代入する記述を追加

// スプレッドシートの受付番号を取得して変数rowに代入 const row = e.range.getRow(); const sheet = e.range.getSheet(); row = sheet.getRange(row, 2);

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

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

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

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

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

guest

回答1

0

ベストアンサー

このスクリプトのトリガー設定のイベントのソースを選択はどうなっていますか?
Googleフォームの編集画面からスクリプトエディタを起動してトリガー設定したとすれば
「フォームから」になっていませんか?
response.getItemResponsesが使えているのでこうなっているのではないかと思います。

e.range.getRow()を使うとすれば、連携したスプレッドシートからスクリプトエディタを起動して
そこでトリガー設定を行いイベントのソースを選択を「スプレッドシートから」にする必要があります。
しかし、こうした場合はe.response.getItemResponsesが使用できません。

ではどうすればいいのかとなると
現状のトリガー設定のままでいくなら、スプレッドシートの取得方法を変更するしかありません。
SpreadsheetApp.openById('スプレッドシートID')で取得し、最終行を取ってくるなどの方法となるでしょう。

そうではなくトリガーの設定を変更し、スプレッドシートのほうにスクリプトを配置するのであれば、
現状のe.response.getItemResponsesを使用した方法ではなくスプレッドシートにある回答を取得し
処理する形に変更する必要があります。

投稿2022/08/30 08:06

YAmaGNZ

総合スコア10222

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

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

wa3bon

2022/08/31 02:51 編集

回答いただき、ありがとうございます!お礼が遅くなり申し訳ありません。 アドバイスいただいたことを参考に色々と試しておりました。 また分からない部分が出てきてしまったので、こちらも可能でしたらご教示いただけますと幸いです。 【問題点】 自動採番された番号が「00(数字)」のフォーマットにならない 【回答から試したこと】 ご指摘の通り、スクリプトのトリガーは「フォームから」に設定していました。 ですので、スプレッドシートの取得方法を変更する案を採用させていただきました。 そこで試していく中で、最終行の取得が上手くいかなかったためスプレッドシート側に設定していた関数を削除し、スクリプト内で自動採番をすることにしました。 自動採番自体は以下の記述で問題なく動き、デバッグや実行ボタンでの実行では全て理想通りの動きをしてくれました。 前提として、スプレッドシートの受付番号列の表示形式で「00」が数字の先頭につくように設定しています。 ―――――――――――――――――――――――――――――――――― let file = SpreadsheetApp.openById('スプレッドシートID'); // 接続したスプレッドシードのアクティブなシートに接続 let sheet = file.getActiveSheet(); // アクティブなシートの最終行を取得 フォームが入力されたとき、受付番号列は空 let lastRow = sheet.getLastRow(); // 受付番号を自動採番 let beforelastRow = sheet.getRange(lastRow-1,1); // 最新のフォーム結果の一つ前の結果の受付番号を取得 console.log('最新の結果より1つ前に入っている値は' + beforelastRow.getValue() + 'です'); console.log('最新の結果より1つ前に表示されている値は' + beforelastRow.getDisplayValue() + 'です'); let num = sheet.getRange(lastRow,1).setValue((beforelastRow.getValue()) + 1); // 最新のフォーム結果の受付番号に、一つ前の受付番号に+1した値をセット console.log('最新の結果に表示されている値は' + num.getDisplayValue() +'です'); // getDisplayValue()でセルの表示される値を取得 // 予めスプレッドシート側で表示形式を[00数字]になるように設定しておく let receiptNum = num.getDisplayValue(); console.log('最新の結果に表示されている値は' + receiptNum +'になっているはずです'); ―――――――――――――――――――――――――――――――――― 実行ログも以下の通りでした。 ―――――――――――――――――――――――――――――――――― 2022/08/31 1:04:06 デバッグ 最新の結果より1つ前に入っている値は49です 2022/08/31 1:04:06 デバッグ 最新の結果より1つ前に表示されている値は049です 2022/08/31 1:04:06 デバッグ 最新の結果に表示されている値は050です 2022/08/31 1:04:06 デバッグ 最新の結果に表示されている値は050になっているはずです ―――――――――――――――――――――――――――――――――― しかし、これが実際のフォーム入力になると以下の結果になってしまいます。 ―――――――――――――――――――――――――――――――――― 2022/08/31 11:34:48 デバッグ 最新の結果より1つ前に入っている値は50です 2022/08/31 11:34:48 デバッグ 最新の結果より1つ前の表示されている値は050です 2022/08/31 11:34:48 デバッグ 最新の結果に表示されている値は51です 2022/08/31 11:34:48 デバッグ 最新の結果に表示されている値は51になっているはずです ―――――――――――――――――――――――――――――――――― 実際の入力になると「00(数字)」のフォーマットから外れてしまうのは何故でしょうか? スクリプトの修正やスプレッドシートの設定修正で直せるものであれば、そちらの方法もご教示いただけますと大変助かります。
YAmaGNZ

2022/08/31 03:01

一般的に0埋めと呼ばれる処理です。 「GAS 0埋め」とでも検索すれば参考になるでしょう。 こちらの処理を実装すれば、スプレッドシート側は何もしなくていいはずです。
wa3bon

2022/08/31 07:38

再度回答いただき、ありがとうございます。 「GAS 0埋め」で調べたところString.prototype.padStart()が出てきましたので、そちらを利用し以下のように変更しました。ただ、それでもダメでした。 質問ばかりで大変申し訳ありませんが、解決策の検索の仕方だけでもご教示ください。 ―――――――――――――――――――――――――――――――――― let lastNum = beforelastRow.getValue(); lastNum++; // 加算処理が文字列結合にされがちなので追加 console.log('beforelastRowに1を加算した数は' + lastNum + 'です'); let lastNum2 = String(lastNum).padStart(3,'0'); console.log(lastNum + 'をpadStart(3,0)で整えた数は' + lastNum2 + 'です'); let num = sheet.getRange(lastRow,1).setValue(lastNum2); console.log('最新の結果に表示されている値は' + num.getDisplayValue() +'です。'); ―――――――――――――――――――――――――――――――――― この実行ログが以下です ―――――――――――――――――――――――――――――――――― 2022/08/31 16:15:47 デバッグ beforelastRowに1を加算した数は59です 2022/08/31 16:15:47 デバッグ 59をpadStart(3,0)で整えた数は059です 2022/08/31 16:15:47 デバッグ 最新の結果に表示されている値は59です。 ―――――――――――――――――――――――――――――――――― setValue()のタイミングでゼロパディング処理が抜けてしまうようなので、以下でも試しましたが結果変わらずでした。 ―――――――――――――――――――――――――――――――――― let num = sheet.getRange(lastRow,1).setValue(String(lastNum).padStart(3,'0')); ――――――――――――――――――――――――――――――――――
YAmaGNZ

2022/08/31 08:06 編集

スプレッドシートに入れる話をされていますが、やりたいことってメールで送信するときに0埋めすることじゃないのですか? スプレッドシートから取り出すのであればスプレッドシート側の表示設定を変更する必要があり、スクリプト側で0埋めしなくてもいいはずです。
wa3bon

2022/08/31 08:06

元々はご認識の通りなのですが、最初にいただいた回答でスプレッドシートの取得方法を変えた際に、私の技術では自動採番のための関数を設定しているスプレッドシードから狙った最終行を取ってくることができなかった(フォームの結果が入力されていない行まで見てしまう)ので、スクリプトの方でスプレッドシートに自動採番する処理を入れました。 この処理追加によって、メール文用の番号をスプレッドシートから取ってきて0埋めするのではなく、そもそも採番の時に0埋めする必要が出てきました。 最初の質問から状況が変わっており、混乱させてしまい申し訳ありません。
wa3bon

2022/08/31 08:11 編集

>スプレッドシートから取り出すのであればスプレッドシート側の表示設定を変更する必要があり、スクリプト側で0埋めしなくてもいいはずです。 追記ありがとうございます。 スプレッドシート側で表示設定は変更してあるのですが、番号を入れるタイミングでその設定が外れてしまうのか、スクリプトで採番をすると設定通りの表示にならなかったのです。 手でスプレッドシートに数字を入れて設定が活きていることは確認しているのですが…。 この事があったので、採番のタイミングで0埋めをしなければならないのだと認識していました。
YAmaGNZ

2022/08/31 08:21

ちょっと試したら、列に表示設定しているつもりでも新しく追加された行に表示設定が効かないようです。 setValueしたrangeにsetNumberFormatで表示形式を変更してやると0埋めされました。
YAmaGNZ

2022/08/31 08:24

スプレッドシート上で0埋めされている必要がないのであれば、メールとして編集する時だけ0埋めすればいいかと思います。 body += `受付番号: ${String(row).padStart(3,'0')}\n`; といった感じで
wa3bon

2022/08/31 08:56

わざわざ試していただき、ありがとうございます!そして私の方でも同じ処理で動きました!! 何度も基本的な事で質問してしまいご迷惑をおかけしましたが、その度に丁寧にご回答いただき本当に本当にありがとうございました。
wa3bon

2022/08/31 09:00

画面更新の影響で17:24にいただいたコメントを見れていませんでした…。 今回はシート上でも0埋めが必要でしたのでsetNumberFormatの形式を採用させていただきました。 ですが、 body += `受付番号: ${String(row).padStart(3,'0')}\n`; の形式も頭に入れておいて、今後に活かしていきます。 最後までご配慮くださりありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問