Skip to content

Instantly share code, notes, and snippets.

@schlos
Created June 18, 2017 11:11
Show Gist options
  • Save schlos/169a6e853753db395290804303d910a6 to your computer and use it in GitHub Desktop.
Save schlos/169a6e853753db395290804303d910a6 to your computer and use it in GitHub Desktop.
GMail Snooze Script
var LABEL = 'Snooze';
var MONTHS = 1;
var MARK_UNREAD = true;
var ADD_UNSNOOZED_LABEL = true;
function dailySnooze() {
var today;
var page;
var d = new Date();
var day = d.getDate();
var month = d.getMonth();
var year = d.getFullYear();
// Mails snoozed for today back to inbox
today = GmailApp.getUserLabelByName(getLabelName(day, month, year));
// It’s time to unsnooze it
unSnooze(today);
page = today.getThreads(0, 100);
if (page.length === 0) {
// Delete todays label
GmailApp.deleteLabel(today);
}
}
function twoSnooze() {
var label;
// Mails snoozed for 2pm back to inbox
label = GmailApp.getUserLabelByName(LABEL + '/2pm');
// It’s time to unsnooze it
unSnooze(label);
}
function fiveSnooze() {
var label;
// Mails snoozed for 5pm back to inbox
label = GmailApp.getUserLabelByName(LABEL + '/5pm');
// It’s time to unsnooze it
unSnooze(label);
}
function unSnooze(label) {
var page = null;
// Get threads in 'pages' of 100 at a time
while (!page || page.length == 100) {
page = label.getThreads(0, 100);
if (page.length > 0) {
// It’s time to unsnooze it
GmailApp.moveThreadsToInbox(page);
// Move the threads out of label
label.removeFromThreads(page);
if (MARK_UNREAD) {
GmailApp.markThreadsUnread(page);
}
if (ADD_UNSNOOZED_LABEL) {
GmailApp.getUserLabelByName('Unsnoozed')
.addToThreads(page);
}
}
}
}
function moveToDateFolder() {
snoozeTomorrow();
snoozeNextWeek();
}
function snoozeTomorrow() {
var label;
label = GmailApp.getUserLabelByName(LABEL + '/by/tomorrow');
var d = new Date();
d.setDate(d.getDate() + 1);
// Move to correct folder.
setSnooze(label, d);
}
function snoozeNextWeek() {
var label;
label = GmailApp.getUserLabelByName(LABEL + '/by/next-week');
var d = new Date();
var day = d.getDay();
var diff = d.getDate() - day + (day === 0 ? 1 : 8);
d.setDate(diff);
// Move to correct folder.
setSnooze(label, d);
}
function setSnooze(label, date) {
var page = null;
var day = date.getDate();
var month = date.getMonth();
var year = date.getFullYear();
var newlabel = GmailApp.getUserLabelByName(getLabelName(day, month, year));
// Get threads in 'pages' of 100 at a time
while (!page || page.length == 100) {
page = label.getThreads(0, 100);
if (page.length > 0) {
// Move the threads out of label
newlabel.addToThreads(page);
label.removeFromThreads(page);
}
}
}
function xMonthsLabels() {
var startday;
var endday;
var newmonth00;
var d = new Date();
var day = d.getDate();
var month = d.getMonth();
var year = d.getFullYear();
// Create the labels we’ll need for snoozing
GmailApp.createLabel(LABEL);
GmailApp.createLabel(LABEL + '/2pm');
GmailApp.createLabel(LABEL + '/5pm');
GmailApp.createLabel(LABEL + '/by');
GmailApp.createLabel(LABEL + '/by/tomorrow');
GmailApp.createLabel(LABEL + '/by/next-week');
GmailApp.createLabel(LABEL + '/date');
if (ADD_UNSNOOZED_LABEL) {
GmailApp.createLabel('Unsnoozed');
}
// Add Labels for x Months
for (var i = 0; i <= MONTHS; ++i) {
var newd = new Date(year, month + i, 1);
var newyear = newd.getFullYear();
var newmonth = newd.getMonth();
// Make month two-digit for sorting
if (newmonth < 10) {
newmonth00 = '0' + (newmonth + 1);
} else {
newmonth00 = newmonth + 1;
}
// If it's todays month, don't start
// with day 1 - but with tomorrow
if (i === 0) {
startday = day + 1;
} else {
startday = 1;
}
// If it's the last month, don't proceed
// till the months last day but the numbers
// we skipped in the first month
if (i === MONTHS) {
endday = Math.min(day, daysInMonth(newmonth, newyear));
} else {
endday = daysInMonth(newmonth, newyear);
}
for (var x = startday; x <= endday; x++) {
GmailApp.createLabel(getLabelName(x, newmonth, newyear));
}
}
}
function getLabelName(day, month, year) {
var month00;
var day00;
// Make month two-digit for sorting
if (month < 10) {
month00 = '0' + (month + 1);
} else {
month00 = month + 1;
}
// Make day two-digit for sorting
if (day < 10) {
day00 = '0' + day;
} else {
day00 = day;
}
return LABEL + '/date/' + year + month00 + day00;
}
function daysInMonth(month, year) {
return new Date(year, month + 1, 0).getDate();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment