前提・実現したいこと
Google Apps Scriptを用いて受信ボックス内にある「事前課題」というラベルがついているメールの内容を指定のスプレッドシートに転記することを自動化したいと考えています。
取得したい内容:氏名・メールアドレス・電話番号
またメッセージIDも取得し、転記処理に重複なく処理できるようにしたいと考えており、以下を参考にしてみました。
参考URL
また可能であればお尋ねしたいのですが、スプレッドシート上に事前課題というシートがあります。
これを指定・定義するにはどう記述したら良いのでしょうか。
お力添えをいただけますと幸いです。よろしくお願いいたします。
発生している問題・エラーメッセージ
エラー TypeError: Cannot read property '0' of null getMail @ コード.gs:36
該当のソースコード
//シートを取得する。 var sheet = SpreadsheetApp.getActiveSheet(); function getMail() { // メール検索する文字列:今回はラベルにある事前課題 var str = "label:事前課題"; // 上記の文字列に合致するスレッドを取得(とりあえず100件取得します) var threads = GmailApp.search(str,0,100); // メッセージを取得する var messages = GmailApp.getMessagesForThreads(threads); for(var i = 0; i < messages.length; i++){ for(var j = 0; j < messages[i].length; j++){ //メッセージIDを取得(重複を防ぐため) var messageId = messages[i][j].getId(); //もし、スプレッドシートに存在したら実行しない if(!hasId(messageId)){ //メール受信日時を取得 var mailDate = messages[i][j].getDate(); // メッセージの本文をプレーンテキストで取得 var body = messages[i][j].getPlainBody(); //正規表現をつくる var regName = new RegExp('氏名 :' + '.*?' + '\r' ); var regMail = new RegExp('メールアドレス :' + '.*?' + '\r' ); var regTel = new RegExp('電話番号 :' + '.*?' + '\r' ); //正規表現をマッチさせたうえで、転記するときに、 //セルに"お名前:"などが入らないように、正規部分を削る var Name = body.match(regName)[0].replace("氏名:",""); var Mail = body.match(regMail)[0].replace("メールアドレス :",""); var Tel = body.match(regTel)[0].replace("電話番号 :",""); //セルに行を追加する(ID、日時、氏名、アドレス、電話番号) sheet.appendRow([messageID,mailDate,Name,Mail,Tel,]); } } } } // 同じIDのメールは転記しないようにするため、すでにIDがあるかどうか調べる関数 function hasId(id){ //今回は1列目にメールIDを入れていくので1列目から探す var data = sheet.getRange(1, 1,sheet.getLastRow(),1).getValues(); var hasId = data.some(function(value,index,data){ //コールバック関数 return (value[0] === id); }); return hasId; }
試したこと
正規表現についても調べてみましたが、始めたてでまだつかめていないことも多いです。
どこから手を付けたらよいか、今見当もついていない状況です。
補足情報(FW/ツールのバージョンなど)
Gmail,Google Spreadsheetでテストしています。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/10 05:43