-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathAutoDeleteGmailByLabel.gs
135 lines (119 loc) · 3.7 KB
/
AutoDeleteGmailByLabel.gs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/*
Provide a list of labels to purge, along with retention period (in days)
You may use asterisk (*) as a globbing char to match labels (e.g. matching
all nested labels under a common parent)
*/
var LABELS_TO_DELETE = {
"Label*": 30,
"Label/SubLabel": 7,
"Label/KeepLonger": 90,
"AnotherLabel": 14
};
/******************************************/
/*** DO NOT MODIFY CODE BELOW THIS LINE ***/
/******************************************/
/* Internals: functions provided to perform all the heavy work */
var DELETE_RULES = {};
function Initialize() {
DELETE_RULES = buildRules()
return;
}
function Install() {
/* Run uninstall first to avoid overlap */
Uninstall()
/* Initial trigger to start delete 2 min from now */
ScriptApp.newTrigger("Run")
.timeBased()
.at(new Date((new Date()).getTime() + 1000*60*2))
.create();
/* Scheduled trigger to purge mail daily */
ScriptApp.newTrigger("Run")
.timeBased()
.atHour(1)
.everyDays(1)
.create();
}
function Uninstall() {
var triggers = ScriptApp.getProjectTriggers();
for (var i=0; i<triggers.length; i++) {
ScriptApp.deleteTrigger(triggers[i]);
}
}
function buildRules() {
var keys = Object.keys(LABELS_TO_DELETE);
var rules = {};
var exacts = {};
var globs = {};
var patterns = {};
for (var i = 0; i < keys.length; i++) {
if (keys[i].indexOf('*') > -1) {
globs[keys[i].replace('*','')] = LABELS_TO_DELETE[keys[i]];
patterns[keys[i].replace('*','')] = new RegExp(keys[i].replace('*','.*'));
} else {
exacts[keys[i]] = LABELS_TO_DELETE[keys[i]];
}
}
var labels = GmailApp.getUserLabels();
for (var i = 0; i < labels.length; i++) {
var label = labels[i].getName()
if (label in exacts) {
rules[label] = exacts[label]
}
else {
for (var j in patterns) {
if (patterns[j].exec(label)) {
rules[label] = globs[j]
break
}
}
}
}
return rules
}
function Run() {
console.info("[" + (new Date()) + "] Running delete")
Initialize()
var anotherPass = false;
for (var label in DELETE_RULES) {
var total = 0;
var age = new Date();
age.setDate(age.getDate() - DELETE_RULES[label]);
var purgeDate = Utilities.formatDate(age, Session.getTimeZone(), "yyyy-MM-dd");
var search = "label:(" + label + ") before:" + purgeDate;
try {
// Search for mail, but limit to 1000 at a time
var threads = GmailApp.search(search, 0, 500);
for (var i = 0; i < threads.length; i++) {
var messages = GmailApp.getMessagesForThread(threads[i]);
for (var j = 0; j < messages.length; j++) {
var email = messages[j];
if (email.getDate() > age) {
// If the conversation is actually newer than our purgeDate remove it from the list
messages.splice(j, 1)
j = j - 1
}
}
// Move messages to trash
if (messages.length > 0) {
total += messages.length
GmailApp.moveMessagesToTrash(messages)
}
}
console.info(" [" + label + ":" + DELETE_RULES[label] + "] Trashed: " + total)
if (!anotherPass) {
threads = GmailApp.search(search, 0, 1);
if (threads.length > 0) {
// If we have more than 50 messages remaining, schedule another pass
anotherPass = true
}
}
} catch (e) { console.debug(" [" + label + ":" + DELETE_RULES[label] + "] Error: " + e) }
}
if (anotherPass) {
// Schedule another run for 2 minutes from now
ScriptApp.newTrigger("Run")
.timeBased()
.at(new Date((new Date()).getTime() + 1000*60*2))
.create();
}
}