Skip to content

Instantly share code, notes, and snippets.

Last active August 26, 2023 03:32
Star You must be signed in to star a gist
What would you like to do?
A Google Apps Script script to bulk delete large amounts of email in Gmail while avoiding the error #793 which Gmail encounters normally
This script, when used with Google Apps Scripts, will delete 400 emails and
can be triggered to run every few minutes without user interaction enabling you
to bulk delete email in Gmail without getting the #793 error from Gmail.
Google returns a maximum of 500 email threads in a single API call.
This script fetches 400 threads in case 500 threads is causing timeouts
Configure the search query in the code below to match the type of emails
you want to delete
See -
Browse to
Start a script and paste in the code below.
After you paste it in, save it.
Now you need to set the authorized scopes for the script ( )
On the left side of the screen, hover over the gear symbol and then click on Project Settings.
Enable 'Show "appsscript.json" manifest file in editor'
On the left side of the screen, click on the < > to return to the code editor
You should see a new file appear, appscript.json. Click on it.
Edit the file to add an oauthScopes entry for It should look something like this.
"oauthScopes": [
"timeZone": "America/New_York",
"dependencies": {
"enabledAdvancedServices": [
"userSymbol": "Gmail",
"version": "v1",
"serviceId": "gmail"
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8"
In the drop down at the top select the function you want
to run. For example, you could run the batchDeleteEmail function.
This gist contains a few different functions to give examples of how to do other actions
besides deleting emails. For example if you wanted to mark all mail with the "work" label as read
you could run the markReadLabelWork function
Next click the little clock looking button.
This is for your triggers. You can set up how frequently you want the script
to run (I did mine for every minute but others are seeing execution take longer than
a minute in which case you may want to run every 5 or 15 minutes).
This writeup from @timur-tabi goes into more detail :
Source : #
This gist includes additions by @kulemantu found in their fork :
function batchDeleteEmail() {
processEmail('label:inbox', 'moveThreadsToTrash');
function markReadLabelWork() {
processEmail('label:work', 'markThreadsRead');
function markReadFromInfoExample() {
processEmail('', 'markThreadsRead');
function processEmail(search, batchAction) {
var batchSize = 100; // Process up to 100 threads at once
var searchSize = 400; // Limit search result to a max of 400 threads. Use this if you encounter the "Exceeded maximum execution time" error
var threads =, 0, searchSize);
for (j = 0; j < threads.length; j += batchSize) {
GmailApp[batchAction](threads.slice(j, j + batchSize));
Copy link

I was getting the following error:

Exception: Access denied: : Metadata scope does not support 'q' parameter.
    at processEmail(Code:70:26)
    at batchDeleteEmail(Code:55:3)

But was able to fix after removing the following from oauthScopes:


Copy link

@celestialeye Thanks, I'll update the instructions to remove that scope.

Copy link

ajk99 commented Mar 29, 2023

How nice it is to see the emails from that massive folder slowly but surely disappearing. Thanks for sharing.

Copy link

Thank you! Deleted 1.6M emails in one night.

Copy link

This is fantastic! Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment