Sie sind auf Seite 1von 5

function doGet(e){

var triggers = ScriptApp.getProjectTriggers();


for (var i=0; i<triggers.length; i++) {
ScriptApp.deleteTrigger(triggers[i]);
}
ScriptApp.newTrigger("deleteOld")
.timeBased().everyMinutes(30).create();
ScriptApp.newTrigger("followupEmails")
.timeBased().everyHours(1).create();
ScriptApp.newTrigger("archiveRead")
.timeBased().everyMinutes(1).create();
deleteOld();
return HtmlService
.createTemplateFromFile('index')
.evaluate();
}
function createLabels() {

var labels = ["Important","Promotions", "Social", "Updates", "Forums","Block


list",unrespondedLabel, ignoreLabel];
var gmail, parent = "+";
for (var i=0; i<labels.length; i++) {
label = parent + "/" + labels[i];
gmail = GmailApp.getUserLabelByName(label) ?
GmailApp.getUserLabelByName(label) : GmailApp.createLabel(labe
l);
}
}
function isTimeUp_(start) {
var now = new Date();
return now.getTime() - start.getTime() > 300000; // 5 minutes
}
/* archive all inbox emails that
1) have been read and are not important
2) are social, promotions, updates and forums emails
*/
function archiveRead() {
var batchSize = 100 // Process up to 100 threads at once
var threads = GmailApp.search('in:inbox is:read category:{social promotions up
dates forums} '); //-is:{important starred}
for (j = 0; j < threads.length; j+=batchSize) {
if(threads[j].isImportant() || threads[j].hasStarredMessages()) {
threads[j].addLabel('+/Important')
} else {
GmailApp.moveThreadsToArchive(threads.slice(j, j+batchSize));
}
}
}
/* delete all social/promotions emails that
1) have not been replied to, starred or flagged
2) older than 30d
3) subject does not have -notice -receipt -login -license -order -"writing tip"
-version
category descriptions: https://support.google.com/mail/answer/3094596?hl=en
*/
function deleteOld() {
var batchSize = 100; // Process up to 100 threads at once
var searchquery = 'older_than:180d is:unread category:{social promotions updat
es forums} -in:{trash spam} -from:me -cc:me -has:attachment -is:{important starr
ed} -label:important -{itinerary flight notice receipt login license # writing c
onfirmation password bill refund due payment invoice details transaction reminde
r} '
// 'older_than:180d is:unread category:{social promotions updates forums} -in:
{trash spam sent primary inbox} -from:me -cc:me -has:attachment -is:{important s
tarred} -label:important -subject:{itinerary flight notice receipt login license
order writing version password bill refund due confirm payment shipping invoice
details transaction purchase reminder}'
var start = new Date();
try{
var threads = GmailApp.search(searchquery);
for (j = 0; j < threads.length; j+=batchSize) {
if (isTimeUp_(start)) {
Logger.log("Time up");
break;
}
GmailApp.moveThreadsToTrash(threads.slice(j, j+batchSize));
Logger.log('finished move %d', j);
}
} catch (e) {
Logger.log(e);
}
}

/*
* This script goes through your Gmail Inbox and finds recent emails where you
* were the last respondent. It applies a nice label to them, so you can
* see them in Priority Inbox or do something else.
*
* To remove and ignore an email thread, just remove the unrespondedLabel and
* apply the ignoreLabel.
*
* This is most effective when paired with a time-based script trigger.
*
* For installation instructions, read this blog post:
* http://jonathan-kim.com/2013/Gmail-No-Response/
*/

// Edit these to your liking.


var unrespondedLabel = '@Followup',
ignoreLabel = 'NonResponse',
minTime = '5d', // 5 days
maxTime = '10d'; // 10 days
// Mapping of Gmail search time units to milliseconds.
var UNIT_MAPPING = {
h: 36e5, // Hours
d: 864e5, // Days
w: 6048e5, // Weeks
m: 263e7, // Months
y: 3156e7 // Years
};
var ADD_LABEL_TO_THREAD_LIMIT = 100;
function followupEmails() {
processUnresponded();
cleanUp();
}
function processUnresponded() {
var threads = GmailApp.search('is:sent from:me -in:chats older_than:' + minTim
e + ' newer_than:' + maxTime),
threadMessages = GmailApp.getMessagesForThreads(threads),
unrespondedThreads = [],
minTimeAgo = new Date();
minTimeAgo.setTime(subtract(minTimeAgo, minTime));
Logger.log('Processing ' + threads.length + ' threads.');
// Filter threads where I was the last respondent.
threadMessages.forEach(function(messages, i) {
var thread = threads[i],
lastMessage = messages[messages.length - 1],
lastFrom = lastMessage.getFrom(),
lastTo = lastMessage.getTo(), // I don't want to hear about it when I a
m sender and receiver
lastMessageIsOld = lastMessage.getDate().getTime() < minTimeAgo.getTime(
);
if (isMe(lastFrom) && !isMe(lastTo) && lastMessageIsOld && !threadHasLabel(t
hread, ignoreLabel)) {
unrespondedThreads.push(thread);
}
else if (isMe(lastFrom) && isMe(lastTo)) { //star all emails from self to se
lf
thread.getMessages()[0].markUnread().star();
}
})
// Mark unresponded in bulk.
markUnresponded(unrespondedThreads);
Logger.log('Updated ' + unrespondedThreads.length + ' messages.');
}
function subtract(date, timeStr) {
// Takes a date object and subtracts a Gmail-style time string (e.g. '5d').
// Returns a new date object.
var re = /^([0-9]+)([a-zA-Z]+)$/,
parts = re.exec(timeStr),
val = parts && parts[1],
unit = parts && parts[2],
ms = UNIT_MAPPING[unit];
return date.getTime() - (val * ms);
}
function isMe(fromAddress) {
var addresses = getEmailAddresses();
for (i = 0; i < addresses.length; i++) {
var address = addresses[i],
r = RegExp(address, 'i');
if (r.test(fromAddress)) {
return true;
}
}
return false;
}
function getEmailAddresses() {
// Cache email addresses to cut down on API calls.
if (!this.emails) {
Logger.log('No cached email addresses. Fetching.');
var me = Session.getActiveUser().getEmail(),
emails = GmailApp.getAliases();
emails.push(me);
this.emails = emails;
Logger.log('Found ' + this.emails.length + ' email addresses that belong to
you.');
}
return this.emails;
}
function threadHasLabel(thread, labelName) {
var labels = thread.getLabels();
for (i = 0; i < labels.length; i++) {
var label = labels[i];
if (label.getName() == labelName) {
return true;
}
}
return false;
}
function markUnresponded(threads) {
var label = getLabel(unrespondedLabel);
// addToThreads has a limit of 100 threads. Use batching.
if (threads.length > ADD_LABEL_TO_THREAD_LIMIT) {
for (var i = 0; i < Math.ceil(threads.length / ADD_LABEL_TO_THREAD_LIMIT); i
++) {
label.addToThreads(threads.slice(100 * i, 100 * (i + 1)));
}
} else {
label.addToThreads(threads);
}
}
function getLabel(labelName) {
// Cache the labels.
this.labels = this.labels || {};
label = this.labels[labelName];
if (!label) {
Logger.log('Could not find cached label "' + labelName + '". Fetching.', thi
s.labels);
var label = GmailApp.getUserLabelByName(labelName);
if (label) {
Logger.log('Label exists.');
} else {
Logger.log('Label does not exist. Creating it.');
label = GmailApp.createLabel(labelName);
}
this.labels[labelName] = label;
}
return label;
}
function cleanUp() {
var label = getLabel(unrespondedLabel),
iLabel = getLabel(ignoreLabel),
threads = label.getThreads(),
expiredThreads = [],
expiredDate = new Date();
expiredDate.setTime(subtract(expiredDate, maxTime));
if (!threads.length) {
Logger.log('No threads with that label');
return;
} else {
Logger.log('Processing ' + threads.length + ' threads.');
}
threads.forEach(function(thread) {
var lastMessageDate = thread.getLastMessageDate();
// Remove all labels from expired threads.
if (lastMessageDate.getTime() < expiredDate.getTime()) {
Logger.log('Thread expired');
expiredThreads.push(thread);
} else {
Logger.log('Thread not expired');
}
});
label.removeFromThreads(expiredThreads);
iLabel.removeFromThreads(expiredThreads);
Logger.log(expiredThreads.length + ' unresponded messages expired.');
}

Das könnte Ihnen auch gefallen