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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

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

Q&A

解決済

2回答

1205閲覧

GASを使ってスプレッドシートに取得したGmailの本文を分割したい

fuku-chann

総合スコア82

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

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

0グッド

1クリップ

投稿2020/04/27 14:43

編集2020/04/27 14:44

【やりたいこと】
GASで条件を指定してGmailを取得しています。
本文が長いので本文を分割することを検討しています。

現在のイメージ

E列:次回のご予約:04/28/2020 08:00-10:00 (ドライブレコーダー購入と取り付け)
F列:お名前:abc
G列:電話番号:090-1234-5678

【調査したこと】
参考サイトに記載されているコードを参考にして修正をしていますが、GASもJAvascriptも初心者のため苦しんでいます。1時間格闘してわからなかったので、質問させていただきます。

【参考サイト】
http://www.initialsite.com/w01/13064
https://blog.8basetech.com/google-apps-script/gmail_extraction/

【質問内容】
下記の部分を修正して、本文を分割することは方法を知りたいです。ヒントやきっかけになることでもなんでも良いので、ご存知の方いらっしゃいましたらご教示お願いします。

for(var i = 0; i < msgs.length; i++) { mymsg[i]=[]; for(var j = 0; j < msgs[i].length; j++) { mymsg[i][0] = msgs[i][j].getDate(); mymsg[i][1] = msgs[i][j].getFrom(); mymsg[i][2] = msgs[i][j].getSubject(); var nbsp = String.fromCharCode(160); mymsg[i][3] = msgs[i][j].getPlainBody().replace(/<("[^"]*"|'[^']*'|[^'">])*>|nbsp/g,'').replace(/&; | /g,'').substring(0,50000); }

【コード】

function contact_Gmail() { var rowNumber = 2; var mysheetname = 'Gmail解析_' + DateString(new Date()); var GmailSS = SpreadsheetApp.create(mysheetname); var mySheet = GmailSS.getSheets()[0]; mySheet.setName(mysheetname); mySheet.getRange(1,1).setValue("日時"); mySheet.getRange(1,2).setValue("送信元"); mySheet.getRange(1,3).setValue("件名"); mySheet.getRange(1,4).setValue("本文"); var newfolder = DriveApp.createFolder(mysheetname); var searchQuery = 'subject:(”予約が確定" OR "finalized") '; var threads = GmailApp.search(searchQuery, 0, 200); var mymsg=[]; var msgs = GmailApp.getMessagesForThreads(threads); for(var i = 0; i < msgs.length; i++) { mymsg[i]=[]; for(var j = 0; j < msgs[i].length; j++) { mymsg[i][0] = msgs[i][j].getDate(); mymsg[i][1] = msgs[i][j].getFrom(); mymsg[i][2] = msgs[i][j].getSubject(); var nbsp = String.fromCharCode(160); mymsg[i][3] = msgs[i][j].getPlainBody().replace(/<("[^"]*"|'[^']*'|[^'">])*>|nbsp/g,'').replace(/&; | /g,'').substring(0,50000); } var myattachments = msgs[i][j-1].getAttachments(); //添付ファイルを取得 for(var k in myattachments){ newfolder.createFile(myattachments[k]); //ドライブに添付ファイルを保存 } } if(mymsg.length>0){ GmailSS.getSheets()[0].getRange(2, 1, i, 4).setValues(mymsg); //シートに貼り付け } } function DateString(date){ return date.getFullYear().toString() + date.getMonth().toString() + date.getDate().toString() + date.getHours().toString() + date.getMinutes().toString() + date.getSeconds().toString(); };

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

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

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

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

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

guest

回答2

0

正規表現で改行コード「/n」から次の改行コード(若しくは文末)までの1文をmatchで配列に抜き出しておいて、"次回のご予約"だけ次に取得した1文と合わせてしまうのはどうでしょうか?

投稿2020/04/30 23:57

hiroshi0240

総合スコア640

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

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

fuku-chann

2020/05/01 01:44

hiroshi0240様 ご回答ありがとうございます。 試してみたいです。 完全に理解出来なかったので、詳しくご教示いただけないでしょうか?
guest

0

自己解決

皆さんのお力添えがあって、解決いたしました。
ご教示いただいた方々、どうもありがとうございました。
詳細は下記を参照ください ↓ ↓ ↓

正規表現で本文から任意の文字列を取得しました。
詳細は文末の過去質を参照ください。

GAS

1function contact_Gmail() { 2 var ss = SpreadsheetApp.openById('ID'); 3 var mySheet = ss.getSheets()[0]; 4 mySheet.getRange(1,1).setValue("日時"); 5 mySheet.getRange(1,2).setValue("送信元"); 6 mySheet.getRange(1,3).setValue("件名"); 7 mySheet.getRange(1,4).setValue("本文"); 8 mySheet.getRange(1,5).setValue("ご予約"); 9 mySheet.getRange(1,6).setValue("お名前"); 10 mySheet.getRange(1,7).setValue("電話番号"); 11 mySheet.getRange(1,8).setValue("メールアドレス"); 12 mySheet.getRange(1,9).setValue("メニュー"); 13 14 var searchQuery = 'subject:("finalized" OR "予約が確定") '; 15 var threads = GmailApp.search(searchQuery, 0, 200); 16 17 var mymsg=[]; 18 19 var msgs = GmailApp.getMessagesForThreads(threads); 20 21 for(var i = 0; i < msgs.length; i++) { 22 mymsg[i]=[]; 23 for(var j = 0; j < msgs[i].length; j++) { 24 mymsg[i][0] = msgs[i][j].getDate(); 25 mymsg[i][1] = msgs[i][j].getFrom(); 26 mymsg[i][2] = msgs[i][j].getSubject(); 27 mymsg[i][3] = msgs[i][j].getPlainBody().replace(/\s+/g, ""); 28 mymsg[i][4] = fetchData(mymsg[i][3],'-','\('); 29 mymsg[i][7] = fetchData(mymsg[i][1],'<','>') 30 mymsg[i][8] = fetchData(mymsg[i][3],'\(','\)') 31 if (mymsg[i][2].includes("予約")) { 32 mymsg[i][5] = fetchData(mymsg[i][3],'お名前:','電話番号:'); 33 mymsg[i][6] = fetchData(mymsg[i][3],'電話番号:','メールアドレス'); 34 } else { 35 mymsg[i][5] = fetchData(mymsg[i][3],'Name:','Phone'); 36 mymsg[i][6] = fetchData(mymsg[i][3],'Phonenumber:','emailaddress'); 37 } 38 } 39 } 40 if(mymsg.length>0){ 41 ss.getSheets()[0].getRange(2, 1, i, 9).setValues(mymsg); //シートに貼り付け 42 } 43} 44function fetchData(str, pre, suf) { 45 var reg = new RegExp(pre + '.*?' + suf); 46 var data = str.match(reg)[0] 47 .replace(new RegExp(pre), '') 48 .replace(new RegExp(suf), ''); 49 return data; 50}

fechDataを追加した時の経緯
https://teratail.com/questions/258296

正規表現を修正した経緯
https://teratail.com/questions/258852

if構文を追加する方法
[https://teratail.com/questions/259200]

投稿2020/05/08 09:29

fuku-chann

総合スコア82

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問