Quantcast
Channel: いつも隣にITのお仕事
Viewing all articles
Browse latest Browse all 2094

【GAS】GmailのメッセージIDを利用して新規メールのみをスプレッドシートに追加する

$
0
0

Gmail新規メッセージIDアイキャッチ
みなさん、こんにちは!
もり(@excelprog)です。

前回の記事で、Gmailで検索条件にヒットしたスレッドの全メールをスプレッドシートに書き込むスクリプトを紹介しました。

【GAS】Gmailの特定条件で検索したスレッドの全メールを取得してスプレッドシートに書き出す
Google Apps Scriptを使用して、Gmailのスレッドを特定の条件で検索し、スレッドに含まれるすべてのメールを取得してスプレッドシートに書き出す方法についてお伝えします。

このスクリプトは、実行するたびに、検索条件にヒットしたすべてのメッセージを書き出す仕組みになっています。

今回の記事では、Gmailの「メッセージID」を使用して、検索条件にヒットしたメッセージのうち、新規メッセージのみをスプレッドシートに追記するように改良していきます!

前回のスクリプトの確認

前回作成したスクリプトがこちらです。

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);
  }
}

スクリプト修正のポイント

前回のスクリプトと今回のスクリプトの違いです。

【例】1日に3回実行・検索条件にヒットしたメッセージの件数

  • 1回目:4件ヒット
  • 2回目:7件ヒット(=新規3件)
  • 3回目:9件ヒット(=新規2件)

すべてのメッセージを書き込む(前回の記事)

スクリプトを実行するたび、検索条件にヒットしたすべてのメッセージを、2行目を起点として書き込みました。
つまり、1回目・2回目の実行結果は、3回目の実行結果によって上書きされます。
GmailメッセージID追記型2

新規メッセージのみを追記する(今回の記事)

E列にメッセージIDの列を用意します。
メッセージIDを使用して前回実行からの差分を判定し、新規メッセージのみを末尾に追記していきます。

GmailメッセージID追記型1

メッセージIDを取得して新規メッセージのみをスプレッドシートに書き出す

それではスクリプトを修正していきましょう!

メッセージIDを取得する

メッセージIDとは、Gmailの各メッセージに一意に割り当てられたIDのことです。
このメッセージIDはgetIdメソッドで取得できます。

Messageオブジェクト.getId()

二次元配列myMsgsに格納したそれぞれのメッセージから「メッセージID」を取得するコードをfor文の中に組み入れます。

var msid = myMsgs[i][j].getId();

こちらの記事もあわせてご覧ください。

Google Apps ScriptでGmailのメッセージIDを取得する方法
Google Apps Scriptでフォーム送信メールからデータを取得してスプレッドシートに蓄積していくツールを作っています。今回は、GmailメッセージのメッセージIDを取得する方法です。

スプレッドシートにメッセージIDが存在するか判定する

取得した「メッセージID」を書き込む列をスプレッドシートのE列に用意して、検索条件にヒットしたメッセージの「メッセージID」が既に存在するか判定します。

  • 存在する→書き込み不要
  • 存在しない→新規メッセージなので書き込む

判定関数のスクリプトがこちらです。
オブジェクト変数のmySheetはグローバル変数として定義しておきます。

function hasId(id){

  var data = mySheet.getRange(1, 5, mySheet.getLastRow(),1).getValues();//E列(メッセージID)を検索範囲とする
  var hasId = data.some(function(value,index,data){//コールバック関数
    return (value[0] === id);
  });
  return hasId;
}

someメソッドの使い方はこちらの記事をご覧ください。

GASで列データの配列に特定の値が含まれているかを判定するsomeメソッドの使い方
Google Apps Scriptでフォーム送信メールからデータを取得してスプレッドシートに登録していくツールを作成しています。今回は、配列の中に特定の値が含まれているか判定をするsomeメソッドの使い方です。

hasIdの返り値はこのようになります。

  • メッセージIDが存在する → true
  • メッセージIDが存在しない → false

新規メッセージのデータを配列に格納する

if文を使用して、メッセージIDがスプレッドシートに存在するかチェックし、存在しない場合は、pushメソッドで配列変数valMsgsにデータを格納します。

論理NOT演算子です。条件式の真偽値を反転させます。

hasIdの返り値がtrueでなければ(=falseであれば)、処理を実行します。

if(!hasId(msid)){
      
 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,msid,perm]);
}

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

配列変数valMsgsに格納されたデータを、setValuesメソッドでスプレッドシートの末尾に書き込みます。
ポイントは2点です。

  • valMsgsの要素数が0の場合は書き込まない(=新規メッセージ無し)
  • getRangeメソッドの行番号に、最終行+1を指定する(末尾に追記する)

if(valMsgs.length>0){
 var lastRow = mySheet.getDataRange().getLastRow();
 mySheet.getRange(lastRow+1, 1, valMsgs.length, 6).setValues(valMsgs);
}

スクリプトまとめ

以上をまとめたスクリプトがこちらです。

var mySheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('メール');

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 msid = myMsgs[i][j].getId();//メッセージIDを取得
   //もしメッセージIDがスプレッドシートに存在しなければ
   if(!hasId(msid)){
    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,msid,perm]);
   }
  }
 }

 /* スプレッドシートに出力 */
 if(valMsgs.length>0){//新規メールがある場合、末尾に追加する
  var lastRow = mySheet.getDataRange().getLastRow();
  mySheet.getRange(lastRow+1, 1, valMsgs.length, 6).setValues(valMsgs);
 }
}

function hasId(id){

  var data = mySheet.getRange(1, 5, mySheet.getLastRow(),1).getValues();//E列(メッセージID)を検索範囲とする
  var hasId = data.some(function(value,index,data){//コールバック関数
    return (value[0] === id);
  });
  return hasId;
}

実行結果

検索条件にヒットした新規メッセージについて、この6つの情報が取得できます。

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

まとめ

Gmailのメッセージに一意に割り当てられたメッセージIDを取得・利用して、スクリプトを実行する都度、新規メッセージのみをスプレッドシートに追記する方法を紹介しました。

スクリプトを実行するたびに全件の書き込みをするよりも、新規メッセージのみを判定して追記していくほうが、「データ蓄積」という観点ではより合理的ですよね。

ほんのひと手間くわえて、よりスマートなスクリプトを作成していきましょう。

今後もGASの便利なツールを紹介していきます。

どうぞお楽しみに!

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

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

  1. 【GAS】Gmailに送られた過去のメールから特定条件のメールを検索して取得する
  2. 【GAS】Gmailからメールを検索してスプレッドシートに書き出す
  3. フリーランスの仕事はどこから来たか、独立して1年間の受注件数を全て晒す
  4. 【GAS】新たな問い合わせメールをGmailで取得しスプレッドシートに随時追加する
  5. 【GAS】Gmailに来た問い合わせをチャットワークに通知してかつタスク追加する
  6. Google Apps ScriptにおけるGmailの読み取り件数の制限とその対処法
  7. 【GAS】Gmailの特定条件で検索したスレッドの全メールを取得してスプレッドシートに書き出す
  8. 【GAS】GmailのメッセージIDを利用して新規メールのみをスプレッドシートに追加する

Viewing all articles
Browse latest Browse all 2094

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>