Last active
February 24, 2025 17:09
-
-
Save JesperDramsch/c132feca1651d83b926c0580dd195a1e to your computer and use it in GitHub Desktop.
Automatically Update GMail Filter When Assigning Label
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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