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

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

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

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

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Google

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

Q&A

解決済

1回答

1729閲覧

GASで自動返信をやりたい。

jingwang

総合スコア1

Google スプレッドシート

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

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Google

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

0グッド

0クリップ

投稿2020/05/10 18:21

前提・実現したいこと

特定のメールアドレスに届いたメールに自動返信をGASを用いて行う。

メール内容
(会社から届くわけではなく、自動返信をいろいろ参考にしたときに会社の自動返信の参考が多かったためです。)
////////////////
お名前: <名前>
メールアドレス: <メールアドレス>
会社/団体名: <会社名>
電話番号: <電話番号>
メッセージ: <メッセージ>
////////////////

・templeteという名前のスプレッドシートに自動返信用のテンプレートを用意します。
Aの1セルに"Subject" Bの1セル"Body"
Aの2セルに"自動返信(件名)" Bの2セル"自動返信のテストです。"

・送信結果をlogという名前のスプレッドシートに保存しときます。
A1セルに"タイムスタンプ" B1セルに"会社/団体名" C1セルに"担当者" D1セルに"メールアドレス" E1セルに"電話番号" F1セルに"お問い合わせ内容" G1セルに"結果" H1セルに"エラーメッセージ"

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

エラーメッセージ (1)TypeError: Cannot read property 'replace' of undefined (2)TypeError: Cannot read property 'NAME' of undefined (3)TypeError: Cannot read property 'X' of undefined X=TIMESTAMP,NAME,COMPANY・・・・・・ (4)TypeError: Cannot read property 'replace' of undefined

該当のソースコード

javascript

1 2 3 4// 書式変換 5function format(templ, params) { 6 return templ.replace(/${(.*?)}/g, function($0,$1) {<-----------エラー(1) 7 return (params[$1] && typeof(params[$1]) != "object") ?<-----------エラー(2) 8 params[$1].toString() : JSON.stringify(params[$1]); 9 }); 10} 11 12// 「template」シートからメール本文を取得する。 13function getMessage(ss, row, params) { 14 var ss = SpreadsheetApp.openById('スプレッドシートID'); 15 var templ = ss.getSheetByName('template'); 16 var r = templ.getRange('A2:B2'); 17 var subject = r.getCell(1, 2).getValue(); 18 var body = r.getCell(1, 2).getValue(); 19 return {subject: format(subject, params), body: format(body, params)}; 20} 21 22// 送信結果を「log」シートに記録する。 23function setResult(ss, params) { 24 var ss = SpreadsheetApp.openById('スプレッドシートID'); 25 var log = ss.getSheetByName('log'); 26 var r = log.getRange('A2:H999'); 27 // 空いている行を見つける。 28 for (var i = 1; i <= r.getNumRows(); ++i) { 29 if (r.getCell(i, 1).getValue() == "") { 30 break; 31 } 32 } 33 r.getCell(i, 1).setValue(params.TIMESTAMP);<----------エラー(3) 34 r.getCell(i, 2).setValue(params.NAME);<--------エラー(3) 35 r.getCell(i, 3).setValue(params.COMPANY);<--------エラー(3) 36 r.getCell(i, 4).setValue(params.ADDRESS);<--------エラー(3) 37 r.getCell(i, 5).setValue(params.TEL);<--------エラー(3) 38 r.getCell(i, 6).setValue(params.COMMENT);<--------エラー(3) 39 r.getCell(i, 7).setValue(params.RESULT);<--------エラー(3) 40 r.getCell(i, 8).setValue(params.ERROR);<--------エラー(3) 41} 42 43// メール送信 44function sendEMail(to, subject, body, opt) { 45 try { 46 MailApp.sendEmail(to, subject, body, opt); 47 } catch (e) { 48 return {result: 'NG', message: e.message}; 49 } 50 return {result: 'OK', message: ""}; 51} 52 53// メール本文からパラメータを抽出する。 54function extractMessage(body) 55{ 56 body = body.replace(/<*?>/,"").trim();<--------------エラー(4) 57 var lines = body.split("\n"); 58 var name = ""; 59 var company = ""; 60 var address = ""; 61 var tel = ""; 62 var comment = ""; 63 for (var i = 0; i < lines.length; ++i) { 64 var line = lines[i]; 65 if (line.match(/^お名前: (.+)/)) { 66 name = RegExp.$1; 67 } 68 if (line.match(/^会社/団体名: (.+)/)) { 69 company = RegExp.$1; 70 } 71 if (line.match(/^メールアドレス: (.+)/)) { 72 address = RegExp.$1; 73 } 74 if (line.match(/^電話番号: (.+)/)) { 75 tel = RegExp.$1; 76 } 77 if (line.match(/^メッセージ: (.+)/)) { 78 comment = RegExp.$1; 79 while (lines[i+1] != "") { 80 comment += "\n"; 81 comment += lines[i+1]; 82 ++i; 83 } 84 } 85 } 86 return {NAME: name, COMPANY: company, ADDRESS: address, TEL: tel, 87 TO: name + " <" + address + ">", COMMENT: comment} 88} 89 90// 新着メールに対して,自動応答メールを送信する。 91function checkMail() { 92 var ss = SpreadsheetApp.openById('スプレッドシートID'); 93 var threads = GmailApp.getInboxThreads(); 94 for (var i = 0; i < threads.length; i++) { 95 Utilities.sleep(100); 96 var msgs = threads[i].getMessages(); 97 for (var j = 0; j < msgs.length; j++) { 98 var msg = msgs[j]; 99 var check = msg.isUnread(); 100 // 新着メールを確認する。 101 if (msg.isUnread()&& msg.getTo() == "メアド@gmail.com") { 102 // メール本文からパラメータを抽出する。 103 var params = extractMessage(msgs[j].getBody()); 104 // タイムスタンプを加える。 105 params["TIMESTAMP"] = msgs[j].getDate(); 106 // 応答メールのテンプレートを取得する。 107 var send = getMessage(ss, 1, params); 108 // 応答メールを送信する。 109 if (params.ADDRESS != "") { 110 var ret = sendEMail(params.TO, send.subject, send.body, {bcc: BCC}); 111 // 送信結果を加える。 112 params["RESULT"] = ret.result; 113 params["ERROR"] = ret.message; 114 // 送信結果を記録する。 115 Logger.log(params); 116 setResult(ss, params); 117 } 118 // メールを既読にし,アーカイブへ移動させる。 119 msg.markRead(); 120 threads[i].moveToArchive(); 121 } 122 } 123 } 124}

試したこと

(1)TypeError: Cannot read property 'replace' of undefined
(2)Exception: パラメータ(null,number)が SpreadsheetApp.Range.getCell のメソッドのシグネチャと一致しません。
(3)TypeError: Cannot read property 'X' of undefined
X=TIMESTAMP, NAME,COMPANY・・・・・・
(4)TypeError: Cannot read property 'replace' of undefined

解決方法がわからず何もできていません。
(1)と(4)はundefined(未定義) な変数はreplaceメソッド持ってないということですが解決方法がわかりません。
(3)は取得できていないためのエラーだと思いますので、(1)と(2)と(4)が解決すれば治ると思っています。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

mkk

2020/05/11 02:26

デバッグをして、それぞれの変数に想定しているデータが入っているか確認してみてはいかがでしょうか。 ブレークポイントを設定してデバッグ実行の方法はご存じでしょうか? 例えば(1)のエラーですが、「 templ.replace 」とした時にそのエラーが出るのであれば templがString型になっていないことが考えられます。 情報が取れず null になってしまっているなどの原因が考えられますので、 まずは関数に引き渡している値が正しいものになっているか確認してみて下さい。
jingwang

2020/05/11 03:34

mkkさん ご教授ありがとうございます。 デバック実行してみます!
jingwang

2020/05/11 03:41

ご指摘どおり。 想定したデータがこのコードでは1つも入っていませんでした。
mkk

2020/05/11 04:01

デバッグがうまくいったようで何よりです。 これでどの行まで正しいデータが入っているか検証すれば原因の特定がしやすくなるかと思います。 これで解決したのであれば自己解決として下さい。
guest

回答1

0

ベストアンサー

とりあえず、いきなりtempleを使わず、関数内で変数に格納してから、replaceしてみてはいかがでしょうか?

投稿2020/05/13 00:58

officeforest

総合スコア412

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

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

jingwang

2020/05/13 01:01

勉強したてで、replaceは早かったです。 まずは、単純にプログラム内で変数に格納してできるか試してみます。 ご指摘ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問