Skip to content

Instantly share code, notes, and snippets.

@orvn
Created June 20, 2023 01:53
Show Gist options
  • Save orvn/9e06304132f0671fc14ce4e212efe029 to your computer and use it in GitHub Desktop.
Save orvn/9e06304132f0671fc14ce4e212efe029 to your computer and use it in GitHub Desktop.
Aggregate Gmail unreads by sender using Google Apps Script
/**
*** Aggregate Gmail Unreads
***
*** A Google Apps Script for counting and sorting through unread emails
*** Works for both Gmail and Google Apps aka GSuite aka Google for Work aka Google Workspace
*** ES5 syntax must be used for .gs files, do not use ES6 or higher notation
***
*** Usage: go to script.google.com, create a new project, save and run this script, authenticate, and wait (< 6 minutes)
***
**/
// Enum for selecting the criteria to use when organizing senders
var SortOption = {
SENDER_NAME: 0,
FULL_EMAIL: 1,
DOMAIN: 2
};
// Optionally set the sort option here by replacing DOMAIN
var sortOption = SortOption.DOMAIN;
function countUnreadEmails() {
var query = 'is:unread';
var start = 0;
var max = 200;
var allUnreadThreads = [];
while (true) {
var threads = GmailApp.search(query, start, max);
if (threads.length === 0) {
break;
}
allUnreadThreads = allUnreadThreads.concat(threads);
start += max;
}
// allUnreadThreads should contain all the unread threads, fetched in chunks of 200
// this bypasses the usual limit from the GmailApp.search() method
var sendersCount = {};
var totalUnreads = 0;
for (var i = 0; i < allUnreadThreads.length; i++) {
var messages = allUnreadThreads[i].getMessages();
for (var j = 0; j < messages.length; j++) {
if (messages[j].isUnread()) {
var from = messages[j].getFrom();
var senderName = from.split("<")[0].trim();
var senderEmail = from;
var senderDomain = from.split("@")[1].split(">")[0];
var senderKey;
switch(sortOption) {
case SortOption.SENDER_NAME:
senderKey = senderName;
break;
case SortOption.FULL_EMAIL:
senderKey = senderEmail;
break;
case SortOption.DOMAIN:
senderKey = senderDomain;
break;
}
if (!sendersCount[senderKey]) {
sendersCount[senderKey] = 0;
}
sendersCount[senderKey]++;
totalUnreads++;
}
}
}
var sortable = [];
for (var sender in sendersCount) {
sortable.push([sender, sendersCount[sender]]);
}
sortable.sort(function(a, b) {
return b[1] - a[1];
});
Logger.log("Unread email count by sender:");
for (var i = 0; i < sortable.length; i++) {
Logger.log(sortable[i][0] + ": " + sortable[i][1]);
}
Logger.log("Total Unread Emails: " + totalUnreads);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment