Google Apps Scriptで、ラベルがない未読メールを全て既読にする

  • 13
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

最近未読メールが増えてきたので、一括で既読にしたい。

最近、未読メールが溜まってきて困ったので、どうにかしようと考えた。ただ、ラベルが付いたものを何度か一括処理したもの、かなりの量が残っていて、なにかおかしい…。

ということで、Google Apps Scriptでラベルがついていない未読メールを調べてみよう!

作ってみました。最後にメールを受信した時間とメールのSubjectの一覧をメールで通知するコードです。(本当は、メールへのURLを短縮して本文に付けたかったのですが、短時間にAPIを実行すると「Rate Limit Exceeded」例外で止まってしまう。)

ポイントはGmailApp#search()に指定する引数で、Gmailで検索するのと同じようにキーワードを指定する事ができます。

コメントアウトしていますが、URLShortener APIをGASから実行するコードも含まれています。

コード.gs
function unReadAlert() {
  var start = 0;
  var count = 0;
  var max = 500;
  var mailList = "";

  do {
    // ラベルなしで、未読のものを検索。start、maxの引数がないsearch()は、最大500件なのでmax=500にしておく。
    var threads = GmailApp.search("has:nouserlabels is:unread", start, max);
    count = threads.length;

    Logger.log(threads.length + "件");

    for(var i = 0; i < count; i++) {
      var lastDate = threads[i].getLastMessageDate();

      // URLを短縮したいが、短時間に100件程度APIを実行すると「Rate Limit Exceeded」で例外が起こる。
//      var url = UrlShortener.Url.insert({
//        longUrl: threads[i].getPermalink()
//      });

      var datetime = lastDate.getFullYear() + "/" + (lastDate.getMonth() + 1) + "/" + lastDate.getDate()
      + " " + lastDate.getHours() + ":" + lastDate.getMinutes() + ":" + lastDate.getSeconds();

      Logger.log(datetime + " [" + threads[i].getFirstMessageSubject() + "]");
      mailList += (datetime + "[" + threads[i].getFirstMessageSubject() + "]" + "\n");

      // 既読にする。
      //threads[i].markRead();
    }

    start += count;

  } while(count >= max);

  GmailApp.sendEmail("[your_mailaddress]", "未読メール通知", mailList);
}

実行する前に承認を。

許可のリクエスト.png

URLShortener承認.png

URLShortenerは、APIも有効にしてください。
※ただし、URLShortenerは使ってないので、試す方は不要です。(コードを削除すれば承認も要求されません)
URLShortenerAPI.png

developerconsole.png

実行結果

確認すると、「ラベルなし未読メール」は470件ほどありました。(結構見逃したのか…。)

では、実際に既読にしてやる!

実際のコードです。先ほどのものとほとんど変わりません。

コード.gs
function noLabelRead() {
  var start = 0;
  var count = 0;
  var max = 500;
  var mailList = "";

  do {
    // ラベルなしで、未読のものを検索。start、maxの引数がないsearch()は、最大500件なのでmax=500にしておく。
    var threads = GmailApp.search("has:nouserlabels is:unread", start, max);
    count = threads.length;

    Logger.log(threads.length + "件");

    for(var i = 0; i < count; i++) {
      var lastDate = threads[i].getLastMessageDate();

      var datetime = lastDate.getFullYear() + "/" + (lastDate.getMonth() + 1) + "/" + lastDate.getDate()
      + " " + lastDate.getHours() + ":" + lastDate.getMinutes() + ":" + lastDate.getSeconds();

      Logger.log(datetime + " [" + threads[i].getFirstMessageSubject() + "]");

      //既読にする。
      threads[i].markRead();
    }

    start += count;

  } while(count >= max);  
}

1回では終わらなかったので(470件→182件に。288件既読にできた)、2回実行しました。

GmailThread#markRead()が裏でAPIを実行しているようなので、かなり遅いのだろうと思われます。一括で既読にするAPIもなさそうなのでこれなら、Google I/O2014の直前に公開されたGmailAPIを利用した方が早く終わったかもしれません。

結論

メールはちゃんと読もう…。

Disclaimer

  • この記事は個人的なものです。私の雇用者とは全く関係はありません。(一応つけておきます)

参考資料

https://support.google.com/mail/answer/7190?hl=ja