最近未読メールが増えてきたので、一括で既読にしたい。
最近、未読メールが溜まってきて困ったので、どうにかしようと考えた。ただ、ラベルが付いたものを何度か一括処理したもの、かなりの量が残っていて、なにかおかしい…。
ということで、Google Apps Scriptでラベルがついていない未読メールを調べてみよう!
作ってみました。最後にメールを受信した時間とメールのSubjectの一覧をメールで通知するコードです。(本当は、メールへのURLを短縮して本文に付けたかったのですが、短時間にAPIを実行すると「Rate Limit Exceeded」例外で止まってしまう。)
ポイントはGmailApp#search()に指定する引数で、Gmailで検索するのと同じようにキーワードを指定する事ができます。
コメントアウトしていますが、URLShortener APIをGASから実行するコードも含まれています。
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);
}
実行する前に承認を。
URLShortenerは、APIも有効にしてください。
※ただし、URLShortenerは使ってないので、試す方は不要です。(コードを削除すれば承認も要求されません)
実行結果
確認すると、「ラベルなし未読メール」は470件ほどありました。(結構見逃したのか…。)
では、実際に既読にしてやる!
実際のコードです。先ほどのものとほとんど変わりません。
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
- この記事は個人的なものです。私の雇用者とは全く関係はありません。(一応つけておきます)
参考資料