View all app connections
View all AI automations
View all chatbots
View all lead automations
View all booking automations
View all payment automations
View all workflows
View all Shopify
View all WooCommerce
View all HubSpot
View all Salesforce
View all Stripe
View all Google Sheets
View all Slack
View all dental practice
View all law firm
View all medical practice
View all real estate
View all restaurant and food
View all home services
View all construction
See all: get more leads
See all: get paid faster
See all: save admin time
See all: support customers
See all: book more appointments
See all: sell more online
See all: hire and onboard
View all AI automations
View all AI automations
View all AI automations
View all AI automations
View all AI automations
View all AI automations
View all AI automations
Spreadsheets

Google Sheets automation limits.

API quotas, script runtimes, email caps and trigger rules that cause sheet-based automations to stall, and how to avoid them.

Reading time7 minutes
TopicSpreadsheets
Written byThe BoldBellows team

Key takeaways

  • Batch reads and writes. One request for a range beats a hundred for single cells.
  • Apps Script runs stop at 6 minutes, custom functions at 30 seconds, and daily mail and fetch quotas differ sharply by account type.
  • Simple triggers cannot send mail, and script edits do not fire onEdit.
  • Give rows stable IDs and keep reports separate from raw data.
  • Move to a database once volume and formulas outgrow the sheet.

Google Sheets is the most popular ‘database’ in small business, and for good reason: everyone knows it. It is also the place where automations quietly hit quotas. A script that handled ten rows now times out at ten thousand, a daily email report stops at 100 messages, and a custom function shows an error nobody can explain.

Here are the limits that matter most, what breaks when you reach them, and the design that keeps your sheet-based automation healthy.

The Sheets API quota

If you read and write through the Sheets API, you share a quota. As we read the documentation, you get about 300 read requests and 300 write requests per minute for each project, and about 60 of each per minute for each user. Those numbers sound generous until a loop writes one cell at a time.

  • Batch your writes. Send one request that updates a whole range instead of a hundred requests that each update a cell.
  • Read once, process in memory. Pull a range into a list, work on it, and write it back.
  • Back off on quota errors. Wait and retry, with growing gaps, instead of hammering the API.
Google Sheetcells, formulasApps Script6 min per runSheets API300 / min / projectTriggerstime + installableBatch + queuestay inside quotas
Batch reads and writes, keep scripts under their runtime limits and spread work across triggers.

Apps Script runtime limits

LimitTypical valueWhat it breaks
Single script run6 minutesLong loops over large sheets stop partway.
Custom function run30 secondsSlow lookups return an error instead of a value.
Daily trigger runtimeAbout 90 minutes (consumer accounts), about 6 hours (Workspace)A busy automation stops running late in the day.
Emails sent per dayAbout 100 (consumer), about 1,500 (Workspace)Reports and alerts stop going out.
URL fetch calls per dayAbout 20,000 (consumer), about 100,000 (Workspace)Integrations that call other services pause.

Quotas reset daily and differ by account type. Look up the current values for your account before you design around them.

Triggers: what runs, and what doesn’t

  • Simple triggers cannot send mail. A simple onEdit trigger runs with limited authorization, so it cannot call services that need permission, such as sending email. Use an installable trigger when you need those.
  • Script edits do not fire onEdit. If your script writes to a cell, that change does not run another onEdit trigger. Only human edits and some API changes do.
  • Triggers are not instant. Time-driven triggers run within a window, not at an exact second.
  • Several edits can arrive together. Pasting a block of cells triggers one event for the range. Your handler must loop over it.
Why the ‘no loop’ rule helps

Because a script’s own writes do not fire onEdit, an onEdit that updates a sibling column cannot trigger itself forever. If you need a follow-on action, call a function directly.

Spreadsheet size

A spreadsheet has an overall cell limit, and formulas that reference whole columns, volatile functions and many cross-sheet lookups make big sheets slow long before they reach it. If your sheet is the system of record, plan for what it will look like in a year. A database is better than a sheet once you pass tens of thousands of rows with many formulas.

A healthy sheet-based automation

  1. Give every row a stable ID in its own column.
  2. Keep raw data on one tab and reports on another, so formulas never fight with writes.
  3. Write in batches through the API, not cell by cell.
  4. Run long jobs as small time-driven chunks that store their progress.
  5. Send emails in a digest rather than one per row.
  6. Log errors to a tab where a person will see them.
  7. Protect formula columns so people and scripts cannot overwrite them.

A short checklist

  • Writes batched into ranges
  • Reads done once per run
  • Runtime under 6 minutes per run
  • Email volume under the daily limit, or digested
  • Installable trigger used when mail or other services are needed
  • Row IDs in a dedicated column
  • Errors logged to a visible tab
  • Quotas checked for the account type
Questions

Common questions.

Short answers to what readers ask most about this topic. Ask us if yours is missing.

What is the Google Sheets API quota?

As documented, about 300 read and 300 write requests per minute per project, and about 60 of each per minute per user. These figures decide how fast an automation can safely write rows, which is why we batch writes and queue bursts. Confirm the current numbers in Google’s documentation for your account.

How long can an Apps Script run?

Six minutes per run, and 30 seconds for custom functions. Anything that takes longer must be split into chunks that save their progress so the next run can continue. Knowing this limit early prevents the common failure of a script that works on ten rows and stops on ten thousand.

Why can’t my onEdit trigger send an email?

Simple triggers such as onEdit run with limited permission and cannot do things that need authorization, like sending email. Use an installable trigger instead, which runs with the permissions of the person who set it up. The guide explains how to switch and what to watch for.

Why does my script’s edit not trigger onEdit?

Edits made by a script do not fire onEdit triggers. Only edits by a person, and certain changes made through the API, do. If one script must react to another’s changes, call the next step directly or use a different trigger instead of relying on onEdit.

How many emails can Apps Script send each day?

About 100 on consumer accounts and about 1,500 on Workspace accounts, per the documentation. Hitting the limit stops sending until the quota resets, so a design that emails every row can fail on a busy day. Batch, summarize or use a proper email service if you expect volume.

Why does my script stop halfway?

It probably reached the six-minute run limit. Process the data in chunks, store progress after each chunk, and schedule the next run to continue where the last one stopped. That pattern turns a script that fails on large inputs into one that always finishes eventually.

Can I trigger a script every minute?

Time-driven triggers can run frequently, but each run counts toward your daily runtime quota. A script that runs every minute for even a few seconds can use a large share of the day. Check your quota first and prefer event-based triggers where possible.

What is the difference between consumer and Workspace quotas?

Workspace accounts have higher daily limits for runtime, email sending and URL fetches than free consumer accounts. The exact numbers change, so check the current table in Google’s documentation. If your automation is near a consumer limit, moving to Workspace can be the simplest fix.

When should I leave Sheets for a database?

When you have tens of thousands of rows, many cross-sheet formulas, or several systems writing at once. At that point Sheets becomes slow and conflicts become likely. A database handles volume and concurrent writes better, and a Sheet can still serve as a friendly view of the data.

Need this done properly?

We build automations that handle the awkward cases: duplicates, retries, limits and exceptions. Browse fixed prices or ask for a quote.

Fixed pricesReply within 24 hours