🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google スプレッドシート

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

Google フォーム

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

Google Apps Script

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

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

2回答

2563閲覧

GASでデバッグで完了するのに、トリガーでは完了しません

gonngonn

総合スコア3

Google スプレッドシート

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

Google フォーム

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

Google Apps Script

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

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2020/12/26 13:53

前提・実現したいこと

GASで下記を実現するプログラムを作ろうと考えています
①フォームから質問のジャンル・内容を投稿
②質問のジャンルが【定型】だったら定型のシートから件名・内容を抽出し、自動返答
(定型シートの中身を抜き出し、オブジェクト化、hlookで見つかれば定型h)
③質問のジャンルが定型のものではない(定型のシートにはない)であれば、別でメール送信
④そのあと別シートに転記

デバッグでは上記すべての動作がうまくいったのですが、
なぜかトリガーから行うと(フォームから投稿時)にうまくいかず、
エラーとして[TypeError: Cannot read property 'title' of undefined at tokoForm(sendglmai:56:73)]
とトリガのエラーに出てしまいます。

※トリガーはフォームからの送信時で設定しています。

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

TypeError: Cannot read property 'title' of undefined at function Form_Naibu3no1() { ### 該当のソースコード

GAS

1function Form_Naibu3no1() { 2 3 const ss = SpreadsheetApp.getActiveSpreadsheet(); 4 const AnswerSh = ss.getSheetByName('フォームの回答') 5 const RowNumber = AnswerSh.getLastRow(); 6 7 //回答に使うデータを配列で取得、最終行の13列目(M)まで 8 const Answer2Values = AnswerSh.getRange(RowNumber,1,1,13).getValues(); 9 10 AnswerSh.getRange(RowNumber,12).setValues([ 11 //M列に関数(hlookupの埋め込み)&H列の値セット 12 [`=hlookup(H${RowNumber},'定型回答'!A1:AA3,1,0)`]]);  13 14 //replyValuesに定型回答の中身を入れる(配列) 15 const ReplySh = ss.getSheetByName('定型回答'); 16 const ReplyValues = ReplySh.getDataRange().getValues(); 17 18 //replyValuesの値を判定のためにオブジェクトに変更・convertObj_のファンクションは下に記載 19 const ReplyObj = convertObj_(ReplyValues); 20 21 console.log(ReplyObj); 22 console.log(Answer2Values[0][11]); 23 24 switch (Answer2Values[0][11] === '#N/A'){ 25 case true: 26 const TeikaigaiTitle = 'テスト2です【定形外】'+ Answer2Values[0][2]; 27 const TeikeigaiBody = '問い合わせフォームに定形外の問い合わせがありました\n\n' 28 + '【受付No】:' + Answer2Values[0][0] +'\n' 29 + '【問い合わせ日時】:' + Answer2Values[0][1] +'\n' 30 + '【内容】:' + Answer2Values[0][3] +'\n' 31 32 33 GmailApp.sendEmail('メールアドレス', TeikaigaiTitle, TeikeigaiBody); 34 break; 35 36 case false: 37 38 GmailApp.sendEmail(Answer2Values[0][2],ReplyObj[Answer2Values[0][11]]['title'],ReplyObj[Answer2Values[0][11]]['body']); 39 AnswerSh.getRange(RowNumber,13).setValue('定型送信済み'); 40 break; 41 42 } 43} 44 45 46function convertObj_(array){ 47 const replyObj = {}; 48 49 for (let i =1;i < array[0].length; i++){ 50 replyObj[array[0][i]] = {title: array[1][i], body: array[2][i]}; 51 } 52 return replyObj; 53}

試したこと

・フォーム、シート、プログラムのオーナーはすべて自分でした
・フォームとシートのリンクは切れていません
・コンテナバインドで作っています
・一回googleアカウントをログアウト後、再度ログインしてもダメでした
・トリガーの削除・再設置をしてもダメでした
・デバッグ&実行ボタンからは正常に動作(メールの送信まで完了)します
・トリガーをシートの起動時等にしたところ、正常に動きました

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

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

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

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

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

papinianus

2020/12/28 07:44

動作がデータ起因なので、コードだけからは回答が難しそうです。 下記の console.log の結果およびサンプルデータを追記可能でしょうか。 //replyValuesの値を判定のためにオブジェクトに変更・convertObj_のファンクションは下に記載 const ReplyObj = convertObj_(ReplyValues); console.log(ReplyObj); console.log(Answer2Values[0][11]);
gonngonn

2021/01/02 10:50

サンプルとしては、 定型回答シートの内容 フォーム項目|定型1質問   |定型2質問   |定型3質問 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー  件名   |定型1件名   |定型2件名   |定型3件名 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー  回答   | 定型1の回答 | 定型2の回答  |定型3の回答 があります。 フォーム項目はフォームに選択項目として用意しています。 ・定型1質問/定型2質問/定型3質問 が入ってくれば定型回答から探し、件名と回答をメール送信 ・それ以外のエラー(#N/A)なら、定型でないと判断し、件名と回答をメール送信 です。 フォームで定型以外の選択肢の場合は console.log(Answer2Values[0][11]); の値は #N/A、それ以外ならフォームの選択肢と同じ(フォーム項目と同じ文字列)でした また、console.log(ReplyObj); の値は 上記の定型回答シートの中身を配列で取得しています。   ↓ { '定型1質問': { title: '定型1件名', body: '定型1の回答' }, { '定型2質問': { title: '定型2件名', body: '定型2の回答' }, { '定型3質問': { title: '定型3件名', body: '定型3の回答' },
guest

回答2

0

自己解決

//回答に使うデータを配列で取得、最終行の13列目(M)まで const Answer2Values = AnswerSh.getRange(RowNumber,1,1,13).getValues();

上記の位置がおかしく、場所を変えたところ解決しました。失礼いたしました。

投稿2021/01/03 11:26

gonngonn

総合スコア3

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

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

0

データを取得したあとに関数をセットしているので、実際にトリガーで動かしたときにはAnswer2Valの0,12は空文字""ではないかと思います。

とすると#N/Aではないブロックにはいり、しかしReplyObjには空文字がキーとして存在しないため、質問のエラーがでる、はあり得る路線かなーと。

ちなみに既存のデータであれば関数は埋まっているはずなので、エラーにならない、も説明がつきます。

そういう操作がもしどうしても必要なら、arrayformulaであらかじめ関数を埋めとくというのも一つかと思います。

この回答では、トリガー発火時に必ず全てのデータが埋まっていることが動作として保証されていること、を前提として仮定しています。

(setvaluesで関数が入れられるのも知らないレベルなので参考程度に)

投稿2020/12/28 08:25

papinianus

総合スコア12705

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

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

gonngonn

2021/01/02 11:03

ありがとうございます。動作としては、 ・フォームから入寮力した場合   → 関数の埋め込みまでは完了している    メールは送信されない ・トリガー  → 関数の埋め込みまでは完了している    メールも送信される という形なんです・・・ 解決は難しそうですね・・ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問