« Open Live Writerを使ってみる | トップページ | VPCL14AHJのディスプレイドライバをNVIDIA純正にしてみた »

2016年9月30日 (金)

Gmailを自動で整理するスクリプト使ってたら過負荷だよと注意された

皆さんはGmailのメールってどうやって整理してますか?
自分はメルマガやメーカーサイト登録用にGmail使っているので、定期的にニュースレターが届いて知らず知らずのうちにメールボックスがすごいことになってる。

今までは、Gmailのフィルタを利用して処理していたんだけど、Goolge Apps Scriptとよばれるスクリプトでプログラミングできることが分かった。(長いことGmail使ってきて今かよという自己突っ込みをしつつ...)

早速、メール削除スクリプトを作成してしばらく利用していたある日、以下のメールが届いていることに気が付いた。(英語苦手なので、スクリプトの命名が何となく変なのは許してね)

Google Apps Script 通知メール

「短時間にサービスgmailを実行した回数が多すぎます」とな。

“ごめんなさい。悪気はなかったんです。気付くの遅れたのは、新着メールに埋もれてたからです。すぐに直します。”と心の中で謝りつつ(誰に?)、スクリプト修正に取り掛かる。

Google Apps ScriptはJava Scriptベースの言語でとっつきやすかった。作成は、Google DriveにGoogleスプレッドシートを作って、「ツール」-「スクリプトエディタ」を起動してあげる。

Google Apps Script エディタ起動

メール削除(正確にはゴミ箱送り)は、

  1. メールの検索式をGmailApp.search()関数の引数として実行
  2. 検索結果がコレクションとして返される
  3. コレクション内の各オブジェクトに対してmoveToTrash()メソッドを実行してあげる

で処理される。

コードを書いたら、動作確認。問題なければ、スケジュール登録して利用。

Google Apps Script トリガー設定

スケジュール登録は「リソース」-「現在のプロジェクトのトリガー」から設定できる。

Google Apps Script スケジュール設定

現在使っているスクリプトの全文は以下のとおり。

function autoMailExpire() {
  var fromList1 = new Array();
  fromList1.push("user1@example.com");
  fromList1.push("user2@example.net");
  fromList1.push("user3@example.org");
  for ( var i = 0; i < fromList1.length; i++ ) {
    // 2日経過した既読メールは削除
    expireReadMail(fromList1[i], 2);
    // 35日経過した未読メールは削除
    expireUnreadMail(fromList1[i], 35);
  }
  var fromList2 = new Array();
  fromList2.push("news1@example.jp");
  fromList2.push("news2@example.co.jp");
  fromList2.push("news3@example.ne.jp");
  for ( var i = 0; i < fromList2.length; i++ ) {
    // 1日経過した既読メールは削除
    expireReadMail(fromList2[i], 1);
    // 7日経過した未読メールは削除
    expireUnreadMail(fromList2[i], 7);
  }
}

// 既読メールの削除(スター付きは除く)
function expireReadMail(from, delayDays) {
  var query = 'older_than:' + delayDays + 'd' + ' -is:starred is:read' + ' from:' + from;
  var deleteThreads = GmailApp.search(query);
  Utilities.sleep(1000);
  for ( var i = 0; i < deleteThreads.length; i++ ) {
    deleteThreads[i].moveToTrash();
    Utilities.sleep(100);
  }
}

// 未読メールの削除(スター付きは除く)
function expireUnreadMail(from, delayDays) {
  var query = 'older_than:' + delayDays + 'd' + ' -is:starred is:unread' + ' from:' + from;
  var deleteThreads = GmailApp.search(query);
  Utilities.sleep(1000);
  for ( var i = 0; i < deleteThreads.length; i++ ) {
    deleteThreads[i].moveToTrash();
    Utilities.sleep(100);
  }
}

指摘された箇所は、GmailApp.search()しているところ。
指摘箇所に加えて、念のため、削除実行後も若干のWait(Utilities.sleep()のところ)をおいてみた。

これでしばらく様子見だな。


« Open Live Writerを使ってみる | トップページ | VPCL14AHJのディスプレイドライバをNVIDIA純正にしてみた »

インターネット」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« Open Live Writerを使ってみる | トップページ | VPCL14AHJのディスプレイドライバをNVIDIA純正にしてみた »