読者です 読者をやめる 読者になる 読者になる

頭の中は異空間

生活を日々ハックしてよりよくするブログ

Google Apps Scriptを用いてもっと便利にmail管理しよう

Google Apps Script コーディング

GoogleドキュメントをはじめとするオンラインサービスによってOffice製品ばりの機能を利用できるのは有名ですが、それをさらに便利に使いこなす機能があったことを最近知りました。

Google Apps Script(GAS)によってスクリプト形式で、エクセルでいうマクロのようなものを書けて、しかもgmailやドキュメント(いわゆるワード)にもアクセス出来るという万能型の言語が存在します。

これを用いて、大量に来るメールを管理するためにサンプルを作ってみたので備忘録代わりに載せます。

スプレッドシートを用いて効率的な資料作りも出来ますがそちらはまだ作ってません...

 

 

仕様/関数

初心者のためのGoogle Apps Scriptプログラミング入門

を見ればだいたいわかります。

 

特定の文字の入ったメールをまとめて削除するコード

(記事中のコードが間違っていたので修正しました。)

まず、Gmailでは複数のスレッドという単位でオブジェクトを扱います。その1つ1つのスレッドの中に更に複数のメールが詰まっているというわけです。それを踏まえてオブジェクト取得します。

function deleteOldThreads() {
  var deleteNum = 0;
  var delete_border = 60;

  var searchMsg = "ラベル名";
  var allThreadsCount = 0;
  var labelSearched = GmailApp.getUserLabelByName(searchMsg);
  if (labelSearched === null || labelSearched === undefined) {
    Logger.log("---- no threads... ----");
    return;
  }
  allThreadsCount = GmailApp.getUserLabelByName(searchMsg).getThreads().length;
  var targetThreads = GmailApp.search("label:" + searchMsg, 0, 500); // 500が最大
  Logger.log("---- delete old messages(" + allThreadsCount + ")... ----");
  for (var i = 0;i < targetThreads.length;i++) {
    var messages = targetThreads[i].getMessages();
    var lastMessage = messages[messages.length - 1];
    var lastMessageTime = lastMessage.getDate().getTime();
    var day = parseInt(lastMessageTime/(1000*60*60*24));

    if (parseInt(new Date().getTime()/(1000*60*60*24)) - day > delete_border) {
      deleteNum++;
      targetThreads[i].moveToTrash();
    }
    if (deleteNum > 0) { Logger.log("number of deleted items is:" + deleteNum); }
  }
}

上記の例は、特定のラベルのついた、受信日が現在から60日前までのすべてのスレッドを削除するコードです。.search()部分で検索数を制限していますが、引数を文字列だけにすれば全検索です。

この手の操作は必ずと言っていいほどメール検索が必要なため、GmailApp.search()は覚えるべきです。

検索したthreads.moveToTrash()でゴミ箱へ、moveToArchive()でアーカイブ出来ます。

 

注意点

デバッグがしづらいです。Logger.log関数で一応はログ出力出来ますが、すべての処理が完了した後でないと何一つ出力されません。その対策としては、特定のセルに出力すればなんとかなります。しかしメール本文など長文になりがちな文字列を書き出すと見づらいので困り者なのですが...

他には、GmailApp.search関数では1度の実行につき最大500件までしか扱えないということです。つまり仮に対象が1000件あるなら、2回実行しないといけません。最初に件数を

allThreadsCount= ~~

の行で取得しようとしていますが実はこれは無意味で、結局これでも500件までしかカウント出来ませんでした。これはさすがに対策が難しいので、対象スレッドが500件以上にならないように繰り返し整理していくしかないでしょう。無念。

 

他の検索手段

条件を変えて本文中の文言から文字検索したい場合、特に企業からのメールのフッターに書いてあるお決まりの文言に対して有効です。友人からのメールなど、毎回文言が違っている場合は、タイトルから検索すべきでしょう(通常、RE:とついているタイトルをわざわざ編集しない)。threads.getFirstMessageSubject()でそれが可能です。

 

このようにスレッド単位で便利で簡素なメソッド群が用意されているので、一度コードを書けば後はそれをちょっと作り変えるだけで様々な機能に変身させることが可能です。 基本となるコードを書いて更にカスタマイズして、今の自分に合った整理をするための便利な機能を作りましょう!