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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

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

Q&A

解決済

2回答

7545閲覧

[GAS]GmailApp.searchで検索するとクエリにマッチしないメールを返却してしまう

reflet0617

総合スコア11

Google Apps Script

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

0グッド

0クリップ

投稿2019/06/13 11:33

編集2019/06/13 11:37

前提・実現したいこと

Google Apps ScriptでGmailの特定のフィルターにマッチした受信メールのみ本文から一部情報を抽出し、スプレッドシートに転記するスクリプトを作成しようとしています。

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

GmailApp.searchで検索するとスレッドに対して検索するため、スレッド内のいずれかのメールにクエリがマッチすると、スレッド内の同じメールを返却してしまい、同じ情報が延々とスプレッドシートに転記されてしまいます。

フィルターの設定は、「未読になっている特定の件名のメール」としています。
メールの送受信の流れが以下だった場合、

1.クライアントが特定の件名でメールを送信する。(TO:自分、CC:会社の同僚)
2.会社の同僚が1のメールに返信する。(TO:クライアント、CC:自分)
3.2のメールに対してクライアントが返信する。(TO:会社の同僚、CC:自分)

この状態で、「クライアントが自分宛てに送った未読になっている特定の件名」を検索すると、自分宛てではない会社の同僚が送ったメールや、クライアントからの返信も取得できてしまいます。

希望としては1のメールのみシートに転記し、2と3については除外したいです。
なお、自力でメール単位のフィルタをしたら良いのでは?と考えましたが、力不足で実装までは出来ていません。

この場合の解決方法などご存知の方いらっしゃいましたらアドバイスいただけますでしょうか。
よろしくお願いいたします。

該当のソースコード

gs

1function main() { 2 3 //Gmailから特定条件のスレッドを検索しメールを取り出す 4 //外部からの返信やチーム内での返信は除外する 5 var query = '(is:unread "問い合わせ")'; 6 query = ' OR (in:spam "問い合わせ")'; 7 query = ' OR (- "RE")'; 8 query = ' OR (- "Re")'; 9 query = ' OR (- "FWD")'; 10 query = ' OR (- "Fwd")'; 11 12 //条件にマッチしたスレッドを取得 13 var myThreads = GmailApp.search(query, 0, 1); 14 //スレッドからメールを取得する →二次元配列で格納 15 var myMsgs = GmailApp.getMessagesForThreads(myThreads); 16 for ( var i = 0 ; i < myMsgs.length ; i++ ) { 17 var msid = myMsgs[i][0].getId();//メッセージIDを取得 18 19 //受信日時、本文、パーマリンクの情報を取得 20 var date = myThreads[i].getMessages()[j].getDate(); 21 var mailBody = myMsgs[i][0].getPlainBody(); 22 var link = myThreads[i].getPermalink(); 23 24 // 正規表現マッチにより、メール本文から情報を抽出する。 25 var extractionInformation = new RegExp(' 抽出情報1' + '.*?' + '\r' ); 26 var eInformation = mailBody.match(extractionInformation)[0].replace(' 抽出情報1:', '').replace('\r', ''); 27 28 } 29 30 //メッセージを既読にする 31 myMsgs[i][0].markRead(); 32 33 } 34 35 //二次元配列で格納した情報をシートに転記 36 if(myMsgs.length>0){ 37 var objSheet = SpreadsheetApp.getActive().getSheetByName("シート名"); 38 var lastRow = objSheet.getDataRange().getLastRow(); 39 40 //シートの最終行に追加 41 objSheet.getRange(lastRow+1, 1).setValue(date); 42 objSheet.getRange(lastRow+1, 2).setValue(eInformation); 43 objSheet.getRange(lastRow+1, 3).setValue(link); 44 objSheet.getRange(lastRow+1, 4).setValue(msid); 45 46}

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

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

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

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

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

papinianus

2019/06/14 09:18

これまともに動かんな。どういうこと?
guest

回答2

0

ベストアンサー

まともに動かんのだから、丸投げで書いての意味だと再解釈して回答しなおし。

javascript

1function getInfo(body) { 2 const reg = /抽出情報1(.*?)(?\r)/; 3 if (!reg.test(body)) return "no info"; 4 return body.match(reg)[0].replace(' 抽出情報1:', ''); 5} 6function main() { 7 8 //Gmailから特定条件のスレッドを検索しメールを取り出す 9 //外部からの返信やチーム内での返信は除外する 10 var query = '(is:unread "問い合わせ")'; 11 query += ' OR (in:spam "問い合わせ")'; 12 query += ' OR (- "RE")'; 13 query += ' OR (- "Re")'; 14 query += ' OR (- "FWD")'; 15 query += ' OR (- "Fwd")'; 16 17 const colleague = ["tana@example.com", "suzu@example.com"]; 18 19 //条件にマッチしたスレッドを取得 20 const myThreads = GmailApp.search(query, 0, 1); 21 //スレッドからメールを取得する →二次元配列で格納 22 var ret = []; 23 const sheet = SpreadsheetApp.getActive().getSheetByName("シート名"); 24 const ids = sheet.getDataRange().getValues().map(function (e) { return e[3]; }); 25 const myMsgs = GmailApp.getMessagesForThreads(myThreads).forEach(function (threads) { 26 thread.forEach(function (msg) { 27 var id = msg.getId(); 28 if (ids.indexOf(id) !== -1) return; 29 if (!msg.isUnread()) return; 30 if (msg.getTo() !== "じぶんのあどれす") return; //あてながふくすういると、これではむり 31 if (colleague.indexOf(msg.getFrom()) !== -1) return; 32 msg.markRead(); 33 ret.push([msg.getDate(), getInfo(msg.getPlainBody()), msg.getPermalink(), msg.getId()]); 34 }); 35 }); 36 sheet.getRange(sheet.getLastRow() + 1, 1, ret.length, 4).setValues(ret); 37}

投稿2019/06/14 09:47

papinianus

総合スコア12705

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

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

reflet0617

2019/06/14 12:50

お返事が遅れてしまい、申し訳ありません。 いかんせん初心者なもので、コードもしっかり書けておらずお恥ずかしい限りです。 ご教示いただいた例を参考に再度書き直してみます。 ご回答いただき、ありがとうございました。
guest

0

gmailmessageに、getTo、getFrom、isUnreadがあります。

myMsgs[i][0]に対してこれらを実行して条件にあたるか判断する方法が考えられます。

別案として
msidを取得してシートに記録しているようなので、シート内にそのmsidがないことを書き込みの判定条件にする、というのも良いと思います。

投稿2019/06/13 22:09

papinianus

総合スコア12705

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問