[GAS]Gmail指定ラベルの不要メール削除

2019/05/15

30日前より前のメールをラベル抽出して、ゴミ箱に移動するスクリプト GitHub: yoo16/gas_samples


function removeGmail() {
    var before_days = 30;
    var spreadsheet_id = 'スプレードシートID';
    var sheet = SpreadsheetApp.openById(spreadsheet_id).getActiveSheet();
    var values = sheet.getDataRange().getValues();
    for (var i = 0; i < values.length; i++) {
        removeMail(values[i], before_days);
    }
}

function removeMail(label, before_days) {
    var condition = 'older_than:' + before_days + 'd label:'+ label;
    var threads = GmailApp.search(condition);
    for (var i = 0; i < threads.length; i++) {
        threads[i].moveToTrash();
    }
    //TODO loop for all threads by label
    //var threads = GmailApp.search(condition, 0, 100);
    //GmailApp.moveThreadsToTrash(threads);
}

Google Apps Script : GmailApp Reference

GmailApp の機能はClass GmailAppを参照

Gmail検索ラベルは複数あるので、Googleスプレッドシートに記載して読み取る スプレッドシートの指定は、ファイル名検索でもできるが、あらかじめID取得しておいた方が楽


var sheet = SpreadsheetApp.openById(spreadsheet_id).getActiveSheet();

Gmail操作

GmailApp.search() メソッドで Gmailを検索できるが、引数は Gmail のブラウザ操作で現れるものと同じと考えて良い。


var threads = GmailApp.search('older_than:' + before_days + 'd label:'+ label);

ただし件数制限がある模様(threads.length を調べると500件)


    for (var i = 0; i < threads.length; i++) {
        threads[i].moveToTrash();
    }

1スレッドづつ削除するが、完全削除ではなくゴミ箱に移動する (完全削除メソッドは GAS では用意されていない)

Threadをまとめてゴミ箱に移動

上記だと forループで1スレッド毎にゴミ箱に移動するが、一括でゴミ箱移動する「GmailApp.moveThreadsToTrash()」がメソッドが存在する


var threads = GmailApp.search('older_than:' + before_days + 'd label:'+ label);
GmailApp.moveThreadsToTrash(threads);

ただし「この操作は最大 100 件のスレッドにのみ適用できます。」と表示され、100件までしか動作しないようなので、search() するときに件数を指定


var condition = 'older_than:' + before_days + 'd label:'+ label;
var threads = GmailApp.search(condition, 0, 100);
GmailApp.moveThreadsToTrash(threads);
これを、メールがなくなるまでループで回せば全削除はできそう

トリガー登録で定期実行

定期的にスクリプトを実行するには「編集 > 現在のプロジェクトのトリガー」から設定できる。 GAS Trigger

「トリガーを追加」でスケジュールを設定できる(詳細設定はわかりやすいので割愛) GAS Trigger