The short answer. Five numbers cause almost every large-job failure in Google Sheets:
- 350 cells per AI generate action
- 30 seconds for a custom function
- 6 minutes for a script execution, on every plan
- 20,000 URL fetches per day, consumer; 100,000 on Workspace
- 10 million cells per spreadsheet, which you will almost never reach
Every limit below is one somebody has lost an afternoon to. They are collected here because in the moment they are indistinguishable: the sheet stops doing the thing, usually without an error, and the next hour goes on working out which wall you hit.
Processing limits, in the order you will meet them
| Limit | Value | Applies to | Raisable? |
|---|---|---|---|
| AI generate, per action | 350 cells | Google's built-in AI function | No |
| AI long-term generation limit | Undisclosed | Google's built-in AI function | No, resets in 24h |
| Custom function runtime | 30 seconds | =MYFUNC() called from a cell | No |
| Script runtime | 6 minutes | Menu items, triggers | No |
| Trigger runtime per day | 90 min / 6 hours | All time-driven triggers | Yes, with Workspace |
| URL fetches per day | 20,000 / 100,000 | Apps Script UrlFetchApp | Yes, with Workspace |
| URL fetch response size | 50 MB | Per individual call | No |
| Simultaneous executions | 30 per user | Apps Script | No |
| Cells per spreadsheet | 10 million | The document itself | No |
The three that cause most of the pain
350 cells, per generate action
Select a range containing AI functions, press Generate, and only the first 350 are produced. No warning, no marker on the 351st cell. If your column is long enough that you do not scroll to the bottom, it looks like it worked.
Full detail, including the separate lockout that stops Generate working at all: the 350-cell limit and the four ways past it.
30 seconds, for anything called from a cell
The gap that catches everyone: a custom function gets 30 seconds, the same code run from a menu gets 6 minutes. Twelve times the budget, decided entirely by how it was invoked. If your function makes a network call per row, calling it from a cell is not viable and no optimisation changes that.
6 minutes, and then a daily budget
The script wall. Chunking with PropertiesService and time-driven triggers is the standard answer and it works, with the caveat almost nobody mentions: it trades the 6-minute wall for a daily trigger budget of 90 minutes on consumer accounts and 6 hours on Workspace. Real relief, still finite.
Both covered in the Apps Script 6-minute limit.
The two IMPORTXML errors, which are not limits at all
They belong here because they are diagnosed at the same moment and confused with each other constantly.
Could not fetch urlmeans the page was never retrieved. Your XPath was never evaluated, so rewriting it cannot help. Usually the site is refusing requests from Google's servers. See what it means and what fixes it.Imported content is emptymeans the page was retrieved and your XPath matched nothing. Usually a/tbody/copied from DevTools that does not exist in the source HTML, or content that only appears after JavaScript runs. See the real causes.
One is a network problem you cannot fix from the spreadsheet. The other is a formula problem you can fix in a minute. Telling them apart first saves the afternoon.
Which limit am I hitting?
| Symptom | Limit | Read this |
|---|---|---|
| Part of a column filled, rest blank | 350-cell action cap | The 350-cell limit |
| Generate button does nothing | Long-term generation limit | Why the AI function is not working |
| AI function missing entirely | Not a limit: plan, admin, language | Why the AI function is not working |
| Works on one cell, fails filled down | 30-second custom function | The 6-minute limit |
| "Exceeded maximum execution time" | 6-minute script runtime | The 6-minute limit |
| Script stopped working today, no code change | Daily fetch or trigger quota | The 6-minute limit |
Could not fetch url | Not a limit: the site refused | Could not fetch url |
Imported content is empty | Not a limit: XPath matched nothing | Imported content is empty |
The pattern underneath all of them
Every limit on this page exists for the same reason. A spreadsheet is a document that recalculates in the foreground, attached to a browser tab, shared by everyone in an organisation. The limits are what stop one person's fill-down from consuming a shared service.
Which means they are not obstacles to be engineered around so much as a statement about what the tool is for. A spreadsheet is an excellent place to keep a list, look at results, and decide what to do next. It is a poor place to execute fifty thousand API calls, and the limits are Google saying so.
The move that resolves all of them at once is to keep the sheet and move the execution. That is what ReplyLabs does: the spreadsheet stays the interface, the batch runs on infrastructure built for batches, results come back into the cells with a per-row status, and you are charged only for rows that succeed. How many rows you can actually process works through the arithmetic for each approach.
The full set
- The 350-cell limit in Google Sheets AI
- Why the AI function is not working
- IMPORTXML: could not fetch url
- IMPORTXML: imported content is empty
- The Apps Script 6-minute limit
- How many rows can you run AI on?
- Chaining enrichment steps
- What 1,000 enriched leads cost
- What a normal coverage rate looks like
Limits sourced from Google's AI function documentation and the Apps Script quota reference, checked August 2026. Google states these are subject to change without notice.