前提・実現したいこと
特定のメールアドレスに届いたメールに自動返信を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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー