Skip to content

Instantly share code, notes, and snippets.

@JesperDramsch
Last active October 23, 2021 23:45
Show Gist options
  • Save JesperDramsch/c132feca1651d83b926c0580dd195a1e to your computer and use it in GitHub Desktop.
Save JesperDramsch/c132feca1651d83b926c0580dd195a1e to your computer and use it in GitHub Desktop.
Automatically Update GMail Filter When Assigning Label
function Intialize() {
return;
}
function Install() {
ScriptApp.newTrigger("updateFilter")
.timeBased().everyMinutes(10).create();
}
function updateFilter (toAddress, labelName) {
// Get all Filters
var my_filters = Gmail.Users.Settings.Filters.list('me').filter;
// Get Labelname
var my_label = GmailApp.getUserLabelByName('To Sort');
// Iterate through filters
for (var i=0; i<my_filters.length; i++) {
// Get query
var my_query = my_filters[i].criteria.query;
// If Query has _Auto_ progress
if (my_query && my_query.includes("_Auto_")){
var auto_label = my_query.split("}")[0].split("Auto_")[1].replaceAll("__", " ").replaceAll("_", "");
console.log("Scanning " + auto_label);
// Search for label
var threads = GmailApp.search('label:' + auto_label +' label:to-sort');
if (threads.length == 0) {
console.log("Did not update " + auto_label + ". Nothing to sort.");
continue;
}
// Get Senders
var filter_senders = my_query.split("from:(")[1].split(")")[0].split(" OR ");
//Iterate Through Threads
for (var ii = 0; ii < threads.length; ii++) {
// Get Sender
try {
var sender = threads[ii].getMessages()[0].getFrom().split("<")[1].replace(">", "");
} catch(err) {
var sender = threads[ii].getMessages()[0].getFrom();
console.log(err + sender + ". Email was raw email.");
}
// Add Sender to Array if not exist
filter_senders.indexOf(sender) === -1 ? filter_senders.push(sender) : console.log(sender + " already exists");
// Remove "To Sort" label
threads[ii].removeLabel(my_label);
}
// Generate the string of senders for filter
var filter_string = filter_senders.join(" OR ");
// If the filter is too long GMail gets upsetty
while (filter_string.length > 1450) {
console.log("Filter for " + auto_label + " was a bit long. Splitting into two.")
var backup_string = filter_string.slice(0, 1400);
var next_string = filter_string.slice(1400);
var filter_string_index = next_string.indexOf('OR');
var backup_string = backup_string + next_string.slice(0, filter_string_index-1);
var filter_string = next_string.slice(filter_string_index+3);
var backup_query = my_query.replace("_Auto_", "_Backup_").split("from:(")[0] + "from:(" + backup_string + ")";
my_filters[i].criteria.query = backup_query;
Gmail.Users.Settings.Filters.create(my_filters[i], 'me');
}
// console.log(filter_string);
var new_query = my_query.split("from:(")[0] + "from:(" + filter_string + ")";
// Remove old filter
try {
Gmail.Users.Settings.Filters.remove("me", my_filters[i].id);
} catch(err) {
console.log("Could not delete filter. " + err.message);
}
my_filters[i].criteria.query = new_query;
try {
Utilities.sleep(500);
Gmail.Users.Settings.Filters.create(my_filters[i], 'me');
} catch(err) {
Utilities.sleep(500);
my_filters[i].criteria.query = new_query + " OR {E_r_r__o_r " + auto_label + err.message.replace(" ", "") + "}";
Gmail.Users.Settings.Filters.create(my_filters[i], 'me');
}
console.log("Updated " + auto_label);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment