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

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

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

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

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

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

```js:コード.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](https://qiita-image-store.s3.amazonaws.com/0/11925/31350d9a-8144-244c-61c5-a874ea5fd043.png "許可のリクエスト.png")

![URLShortener承認.png](https://qiita-image-store.s3.amazonaws.com/0/11925/e55b9ab7-99fc-fd0c-4c85-0da00918911d.png "URLShortener承認.png")


URLShortenerは、APIも有効にしてください。
※ただし、URLShortenerは使ってないので、試す方は不要です。（コードを削除すれば承認も要求されません）
![URLShortenerAPI.png](https://qiita-image-store.s3.amazonaws.com/0/11925/91594ac8-f9ae-9a7a-c3e0-add9e214a5be.png "URLShortenerAPI.png")


![developerconsole.png](https://qiita-image-store.s3.amazonaws.com/0/11925/761e1e14-5e18-4781-b3f8-fe6135cea94d.png "developerconsole.png")


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

## では、実際に既読にしてやる！
実際のコードです。先ほどのものとほとんど変わりません。

```js:コード.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