14
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-09-04

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

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

ということで、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

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

参考資料

14
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?