[Google Apps Script]メール情報をスプレッドシートに書き出す

2016.08.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コンニチハ、千葉です。

受信メールが多すぎる!ということで、どこからメールが届いているのか情報を整理してみました。整理する上で、スプレッドシートにメール情報を出力することで分析しやすくしました。

今回は、Gmailの情報をスプレッドシートに出力してみましたのでご紹介です。

Google Apps Scriptとは?

Java Scriptベースで、Googleの各種サービスをプログラミングで操作できるものです。実行方法としては、APIキーを取得してローカル等からも実行できますが、今回はスプレッドシート上からも利用できますので、こちらを利用しました。

Google Apps ScriptはGASとよく略すので、以降はGASと記載します。

エディタの起動方法

まずは、スプレッドシートを作成します。

20160828-google-apps-script-gmail-to-spreadsheet-1

エディタを起動します

20160828-google-apps-script-gmail-to-spreadsheet-2

コード

20160828-google-apps-script-gmail-to-spreadsheet-3

以下のコードを貼り付けます。

function searchContactMail() {
 
  /* Gmailから特定条件のスレッドを検索しメールを取り出す */
  var strTerms = 'label:all'; //メール検索条件
  var numMailMax = 20000; //取得するメール総数  
  var numMail = 500; //1度に取得するメール数
  var myThreads; //条件にマッチしたスレッドを取得、最大500通と決まっている
  var myMsgs; //スレッドからメールを取得する →二次元配列で格納
  var valMsgs;

  var i = SpreadsheetApp.getActiveSheet().getLastRow();

  if(i<numMailMax) {  
    valMsgs = [];
    myThreads = GmailApp.search(strTerms, i, numMail); //条件にマッチしたスレッドを取得、最大500通と決まっている
    myMsgs = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得する →二次元配列で格納

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

    /* スプレッドシートに出力 */
    if(myMsgs.length>0){
      SpreadsheetApp.getActiveSheet().getRange(i + 1, 1, j, 5).setValues(valMsgs); //シートに貼り付け
    } 
  }
}

var strTerms = 'label:all'; //メール検索条件

検索文字列を指定します。from:"example.com"等、Gmail検索時に利用できるフォーマットで指定します。

var numMailMax = 20000; //取得するメール総数 何件メールを取得するか?という指定です。今回は最大で20000件を取得するよう指定しています。

5分の壁

さて、GASを実行する上で5分の壁があります。プログラムが5分以上実行すると、強制的に停止します。この制限を前提としてプログラミングをする必要があります。で、今回この制限を突破するためにどのように実装したかといいますと

  • 実行は5分内でおさまること
  • 5分間隔で実行するトリガーを設定
  • 1実行で500件のメールを取得(何件取得したかは、スプレッドシートの行数で判断)
  • これを指定した最大件数まで繰り返す

としてみました。そのため、実行前の事前準備として

  • スプレッドシートの行を削除
  • 5分間隔で実行するトリガーを設定

する必要があります。

実行する

スプレッドシートの行を削除

現在何件まで取得したか?ということを判定するために、スプレッドシートの行を削除します(実装としてあまりいけてませんが。。。)このような状態にします。

20160828-google-apps-script-gmail-to-spreadsheet-4

5分間隔で実行するトリガーを設定

5分間隔でプログラムが起動されるようにトリガーを設定します。(いわゆるcron)スクリプトエディタより

20160828-google-apps-script-gmail-to-spreadsheet-5

20160828-google-apps-script-gmail-to-spreadsheet-6

20160828-google-apps-script-gmail-to-spreadsheet-7

これで、5分間隔で実行されます。あとは、コーヒーを飲んで待ちます。2万件の取得だと、200分で完了です。

最後に

今回は、GmailとスプレッドシートのAPIを利用しましたが、他にもGoogle Driveやカレンダー情報も操作できますので、自動化したいなーと思ったら"GAS"や"Google Apps Script"で検索すると幸せになれるかもしれません。それでは、また!

参考

https://developers.google.com/apps-script/reference/gmail/