【GAS】Gmailの特定条件で検索したスレッドの全メールを取得してスプレッドシートに書き出す

Gmailアイキャッチ

こんにちは!ITライターのもり(@moripro3)です!

こちらの記事で、Gmailから特定条件で検索したメールをスプレッドシートに追加していく方法をお伝えしました。

【GAS】新たな問い合わせメールをGmailで取得しスプレッドシートに随時追加する
Gmailの未読メールを取得する方法、メールを既読にする方法などを活用して、Google Apps Scriptで問い合わせメールを都度スプレッドシートに追加していく方法についてお伝えします。

前回紹介したスクリプトは、スレッドの最初の1件のみを取得する仕組みになっています。

スレッドに含まれるすべてのメールを取得できたほうが、問い合わせメールを蓄積して分析をしたりする時にはより効果的ですよね。

さて、今回の記事では、Gmailのスレッドの全メールを取得するスクリプトを紹介していきます!

スポンサーリンク

前回のスクリプトの確認

特定条件に合致したメールを取得してスプレッドシートに書き出す処理がこちらです。

function fetchContactMail() {

  /* Gmailから特定条件のスレッドを検索しメールを取り出す */
  var strTerms = '検索文字列';
  var myThreads = GmailApp.search(strTerms, 0, 30); //条件にマッチしたスレッドを取得
  var myMsgs = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得する →二次元配列で格納

  var valMsgs = [];

  /* 各メールから日時、送信元、件名、内容を取り出す*/
  for(var i = 0;i < myMsgs.length;i++){
  valMsgs[i] = [];
  valMsgs[i][0] = myMsgs[i][0].getDate();
  valMsgs[i][1] = myMsgs[i][0].getReplyTo();
  valMsgs[i][2] = myMsgs[i][0].getSubject();
  valMsgs[i][3] = myMsgs[i][0].getPlainBody().slice(0,200);
  valMsgs[i][4] = myThreads[i].getPermalink();
 } 

  /* スプレッドシートに出力 */
 if(myMsgs.length>0){
    
    var mySheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('メール'); //シートを取得
    var maxRow=mySheet.getDataRange().getLastRow(); //シートの使用範囲のうち最終行を取得
    mySheet.getRange(maxRow+1, 1, i, 5).setValues(valMsgs); //シートに取得したメッセージのデータを追加

  }
}

二次元配列myMsgsに格納したスレッドから、myMsgs[i][0]で最初の1件目を取得する仕組みになっています。

Gmailのスレッドとは

Gmailヘルプの説明がこちらです。

受信者がメールに返信すると、Gmail では返信がスレッドにまとめられ、最新のメールが一番下に表示されます。

Aさん・Bさんの2人でメールのやりとりをするとき、お互いが「受信したメールに返信」をすると、その一連のやりとりが”スレッド”という一つのかたまりになります。

たとえば、2人がメールを2往復した場合、そのスレッドには合計4件のメールが含まれます。
Gmailのスレッドとは

問い合わせフォーム経由で受信したメールの場合だと、「問い合わせを受信して終わり」ではなく、そこから何往復かやりとりすることが想定されますよね。

スレッドに含まれるすべてのメールを取得して書き出す

二次元配列のスレッドの全メールを取得する

getMessagesForThreadsメソッドで取得したスレッドはこのように二次元配列に格納されています。

Gmailスレッド二次元配列1

そこで、for文を入れ子にして、スレッドが格納されている二次元配列myMsgsの各メールを順番に取得します。
Gmailスレッド二次元配列2

二次元配列の座標を[i][j]と指定するのがポイントです。

function myFunction(){
  
 for(var i=0;i<myMsgs.length;i++){
  for(var j=0;j<myMsgs[i].length;j++){
      
   var date = myMsgs[i][j].getDate();
   var from = myMsgs[i][j].getFrom();
   var subj = myMsgs[i][j].getSubject();
   var body = myMsgs[i][j].getPlainBody().slice(0,200);
   var perm = myThreads[i].getPermalink();

  }
 }
}

これで、二次元配列に格納されたすべてのメールを取得することができます。

pushメソッドで配列に要素を格納する

Arrayオブジェクトのpushメソッドを使用して、取得したメールを配列に格納します。

Arrayオブジェクト.push([データ1,データ2,データ3, …])

配列変数のvalMsgsを宣言しておき、1レコードずつ追加していきます。

valMsgs = [];
valMsgs.push([date,from,subj,body,perm]);

配列をスプレッドシートに書き出す

スレッドのすべてのメールを配列変数valMsgsにデータ格納できたので、これをスプレッドシートに書き出します。

配列を使わずに1行ずつ直接スプレッドシートに書き出すこともできますが、データをいったん配列に格納してから、その配列をまとめてスプレッドシートに書き出す方が、APIの呼び出し回数が少なく処理が高速になります。

Google Apps Scriptで配列を使ってスプレッドシートにデータ行を追加する方法
Google Apps Scriptでは配列操作が非常に重要です。実行速度が6分を超えてエラーとしないテクニックとして、スプレッドシートへのレコード追加を配列へのpushメソッドで処理する方法をお伝えします。

スプレッドシートに書き出すコードがこちらです。

if(myMsgs.length>0){
  var mySheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('メール');
  mySheet.getRange(2, 1, valMsgs.length, 5).setValues(valMsgs);
}

getRangeメソッドの行数指定でvalMsgsの要素数(length)を使うのがポイントです。

setValuesメソッドを使う場合のgetRangeの引数の指定の仕方はこちらをご参考ください。

Google Apps Scriptのスプレッドシート読み書きを格段に高速化をする方法
Google Apps Scriptでスプレッドシートの操作をしていて実行速度が遅い!と感じたことがあると思います。今回はスプレッドシートを操作する場合に処理速度を格段に速くする方法をお伝えします。

スクリプトまとめ

Gmailの特定条件で検索したスレッドの全メールを取得してスプレッドシートに書き出すスクリプトがこちらです。

function searchContactMail() {

  /* Gmailから特定条件のスレッドを検索しメールを取り出す */
  var strTerms = '検索文字列';
  var myThreads = GmailApp.search(strTerms,0,30);
  var myMsgs = GmailApp.getMessagesForThreads(myThreads);//二次元配列

  var valMsgs = [];
  
  /* 各メールから日時、送信元、件名、内容を取り出す */
  for(var i=0;i<myMsgs.length;i++){
    for(var j=0;j<myMsgs[i].length;j++){
   
   var date = myMsgs[i][j].getDate();
   var from = myMsgs[i][j].getFrom();
   var subj = myMsgs[i][j].getSubject();
   var body = myMsgs[i][j].getPlainBody().slice(0,200);
   var perm = myThreads[i].getPermalink();

   valMsgs.push([date,from,subj,body,perm]);
  }
 }
 /* スプレッドシートに出力 */
 if(myMsgs.length>0){
    var mySheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('メール');
    mySheet.getRange(2, 1, valMsgs.length, 5).setValues(valMsgs);
  }
}

実行結果

スレッドに含まれるすべてのメールについて、この5つの情報が取得できました。

  1. 日付
  2. 差出人
  3. 件名
  4. メッセージ(冒頭200文字)
  5. パーマリンク

Gmailスレッド取得結果

まとめ

Google Apps Scriptを使用して、Gmailのスレッドの全メールを取得してスプレッドシートに書き出す方法をお伝えしました。

次回は、Gmailの各メールに一意に割り当てられたメッセージIDを取得・利用して、スクリプトを実行する都度、新しく受信したメールのみを取得するように改良していきますよ。

【GAS】GmailのメッセージIDを利用して新規メールのみをスプレッドシートに追加する
Google Apps Scriptを使用して、GmailのメッセージIDを取得・利用して、検索条件にヒットしたスレッドに含まれるメッセージのうち、新規メッセージのみをスプレッドシートに追記する方法を紹介しています。

連載目次:GASでGmailに届いた問い合わせメールを収集する

お仕事の現場では日々様々なメールが届きます。その中で重要なのが「問い合わせメール」ですね。このシリーズでは、Webサイトからの問い合わせメールを自動でスプレッドシートに取り込んだり、チャットワークに送る方法についてお伝えしていきます。

  1. 【GAS】Gmailに送られた過去のメールから特定条件のメールを検索して取得する
  2. 【GAS】Gmailからメールを検索してスプレッドシートに書き出す方法
  3. 【GAS】Gmailのメッセージから返信先とパーマリンクを取得する方法
  4. 【GAS】新たな問い合わせメールをGmailで取得しスプレッドシートに随時追加する
  5. 【GAS】Gmailに来た問い合わせをChatworkに通知してかつタスク追加する
  6. Google Apps ScriptにおけるGmailの読み取り件数の制限とその対処法
タイトルとURLをコピーしました