Excel

Put an Excel workbook in a flow: save each order, lead or form answer as a row, keep a sheet in sync with one row per customer, read a price list for the next node, write a report into a range or a brand-new workbook — with the action node — and fire a flow when someone adds, changes or deletes a row with the trigger. The action node can also be handed to an AI Node as an AI toolkit. It works on the .xlsx and .xlsm files in the connected account's OneDrive.

⚠Writing needs a work or school account. Microsoft's Excel API doesn't change workbooks in a personal OneDrive (outlook.com, hotmail.com). With a personal account HostWebhook reads them, runs the trigger and creates new workbooks, but refuses to change one — see Personal and work accounts.

Connect Excel

Click Connect Excel — in the node's credential picker or in Settings → Credentials — and sign in with Microsoft. A work or school account and a personal account (outlook.com, hotmail.com, live.com) both connect. One credential is one account and its OneDrive; the node acts as that account. Microsoft asks for one permission, Have full access to your files: the Excel API asks for it even to read a workbook, and finding workbooks and creating new ones use it too.

That reaches the account's own files. Workbooks other people shared with the account, and the ones in SharePoint sites, can't be opened by this node.

ℹOnly Excel. It is its own connection: the OneDrive, Outlook and Outlook Calendar credentials don't work here, and this one doesn't work in them. Each Microsoft 365 service is connected on its own, with its own consent.
  • Work accounts. Some organizations don't let their people approve apps on their own: Microsoft then shows Need admin approval, and an admin approves HostWebhook once, in Microsoft Entra.
  • Revoking. Remove HostWebhook from account.microsoft.com → Privacy → Apps and services (personal) or myapps.microsoft.com (work), and the credential stops working; Reconnect it from Settings → Credentials.

Personal and work accounts

Microsoft documents that its Excel API only works on workbooks in a work or school OneDrive — in its words, “only the files stored in business platform are supported by Excel REST APIs” (Working with Excel in Microsoft Graph). On a personal account, Excel refuses to open the workbook. So HostWebhook does this:

 PersonalWork or school
Get rows, Find rows, List sheets, List tablesYes — HostWebhook downloads the file and reads itYes
Read rangeValues only — not as text or formulasYes
Append, update and delete rows; tables; add and delete sheets; write and clear rangesNo — refused before anything is sent to MicrosoftYes
Find workbooksYesYes
Create workbookYes, without “Make it a table”Yes
Sheet, table and column pickersYesYes
The triggerYesYes
AI toolkitThe reading tools; the writing ones answer with the refusalEvery tool

On a personal account, the reading operations download the file (up to 25 MB) and read it, and the trigger always works that way. Writing is refused with Microsoft's Excel API can't change workbooks stored in a personal OneDrive (outlook.com, hotmail.com). HostWebhook can read them; to write, connect a work or school Microsoft 365 account. HostWebhook doesn't write by uploading a changed copy of the file instead: that would overwrite whatever someone is editing in Excel for the web at the same moment.

The credential's card in Settings says when an account is personal, and the node says it too when its operation writes. Reconnecting doesn't change it, and the credential is not marked as rejected: it is the account kind, not the connection.


The action node

Seventeen operations, in four groups. A new node starts with none picked; pick one and its fields appear.

GroupOperationWhat it doesWorkbook
RowsAppend rowAdd one or more rows at the end of a table, or under the last used row of a sheet.writes
RowsUpdate rowChange the columns you name in the row — or every row — where a column matches a value.writes
RowsAppend or update rowUpdate the matching row, or add it when there is none. Keeps a sheet in sync without duplicates.writes
RowsGet rowsRows as objects keyed by the column names, a page at a time.reads
RowsFind rowsThe rows whose column equals — or contains — a value.reads
RowsDelete rowsThe matching row, or every matching row. The rows below move up.deletes
TablesList tablesThe Excel tables in the workbook: name, sheet, range and column names.reads
TablesCreate tableTurn a range, headers included, into an Excel table.writes
TablesDelete tableTurn a table back into plain cells, or delete it with its contents.deletes
Sheets & rangesList sheetsThe sheets of the workbook, in order.reads
Sheets & rangesAdd sheetA new sheet, optionally with column names in row 1.writes
Sheets & rangesDelete sheetA sheet and everything in it.deletes
Sheets & rangesRead rangeCells by A1 range — or the whole used range — as rows, or as objects.reads
Sheets & rangesWrite rangeValues into cells from a start cell, or into an exact range.writes
Sheets & rangesClear rangeThe contents, the formats, or both, of a range.clears
WorkbooksFind workbooksExcel files in the OneDrive by name, or the ones in a folder.reads
WorkbooksCreate workbookA new .xlsx file, optionally with column names, first rows and a table.writes

Every text field takes a template: {{payload.email}} from a form, {{payload.keyValue}} for the row that fired the Excel trigger.

⚠The operations that write change the workbook for real on every run — Run test included. Point the first tests at a copy.

Picking the workbook

Workbook is picked from the account's OneDrive with the same picker as the OneDrive node, showing only .xlsx and .xlsm files: open folders to go down, use the path at the top to go back up, or search. To take it from the flow, choose Type a path, an ID or a template under the list: an ID, a path from the top of OneDrive like /Reports/Sales.xlsx, or a template.

Sheet, Table and the column fields are then picked from the workbook itself — hidden sheets are marked — with Refresh next to each label to reload after a change in Excel. Under each list you can type a name instead; with a workbook that is a template, the lists can't be loaded, so you type the sheet name.

  • Changing the credential forgets a workbook picked from the other account — its ID doesn't exist in another OneDrive. Changing the workbook empties the sheet, the table and the columns; changing the sheet or the table empties the columns.
  • Only .xlsx and .xlsm open — Microsoft's Excel API doesn't open the old .xls. The macros of an .xlsm are never run.
  • An ID or a path that can't be a OneDrive file — one that climbs with .., or has characters a file name can't have — is refused before anything is sent to Microsoft.

A sheet or a table

The row operations work on one of two things:

  • A table — an Excel table (Insert → Table in Excel, or Create table). Its header row holds the column names and rows are read and written inside it. When a table is picked, it is used and the sheet doesn't matter.
  • A sheet whose Header row holds the column names — row 1 unless you say otherwise. The data is every row under it, down to the last row with a value.

With neither picked, the node stops with Pick a sheet or a table.

ℹUse a table to add rows. Excel adds rows to a table in a single step, so two runs adding at the same moment each get their own row, and a calculated column fills its formula down by itself. On a plain sheet, HostWebhook finds the last used row and then writes under it — two steps, so two flows adding to the same sheet at the same instant can land on the same row. And on a sheet, a stray value typed far below the data moves where the next row goes: it goes under that value.

Columns and values

The column names are the header row's text, trimmed. An empty header is called by its letter (Column C) and a repeated one gets a number (Email (2)).

Columns is where the operations that write say what goes where: Add column lists the header row's names not used yet, and each one takes a value or a template. A column you don't add is left as it is — an update doesn't blank it, and a calculated column of a table keeps its formula. A column that isn't in the header row fails with the ones that are: Column "Emial" is not in the header row (row 1) of Orders. Columns: Order, Customer, Email, Amount.

Append row can also take Rows (JSON) — an array of objects keyed by column name, up to 500 rows in one call; when it is filled in, Columns isn't used:

jsonRows (JSON)
[
  { "Order": 1042, "Customer": "Ana García", "Amount": 12.5 },
  { "Order": 1043, "Customer": "Sam Rivera", "Amount": 40 }
]

A sheet with nothing in its header row can't take rows by column name: write the names there, pick a table, or use Write range.

Write as text

Off — the default — values are written as if typed in Excel: =1+1 becomes a formula and 007 becomes the number 7. On, every text value is stored as text: no formulas, and leading zeros stay.

⚠Values from outside? A template that writes what a form, an email or a webhook sent is written as a formula when that text starts with = — and a formula can fetch a URL or build a link the moment someone opens the workbook. Turn on Write as text for data you don't control. The AI toolkit is protected by default (see Allow formulas).

Finding the row

Update row, Append or update row, Find rows and Delete rows look for rows by Match column (picked from the header row) and Match value ({{payload.email}}). The whole cell is compared, ignoring upper and lower case and the spaces at the ends; two numbers are compared as numbers, so 42.0 finds a cell with 42; a date cell compares as 2026-10-01, and a true/false one as TRUE / FALSE. Find rows can also match cells that contain the value. Up to 50,000 rows are searched; in a longer sheet or table, Update row, Find rows and Delete rows look only there and say so with a note in the output, and Append or update row adds nothing when it found no match there (see below).

  • Update row changes the first matching row, or every one with Update every match. No match is not an error: it returns matched: 0 and adds nothing — that is what Append or update row is for.
  • Append or update row updates the first match, or adds the row at the end when there is none. The output's action says which: updated or appended. In a sheet or table of more than 50,000 rows with no match in the first 50,000, the row may be further down, so it writes nothing rather than add a duplicate: Searched the first 50,000 rows of Clients without finding "ana@example.com" in Email. It may be further down, so nothing was written — adding it could duplicate it.
  • Delete rows deletes the first match, or every one with Delete every match, from the bottom up; the rows under each one move up. There is no recycle bin for rows — the workbook's version history in OneDrive is the way back.
ℹAt most 500 rows per run. With Update every match or Delete every match, the matches are counted before anything is written; more than 500 and nothing is changed: 612 rows match "x" in Email; the node changes at most 500 rows in one run. Narrow the match value.

Reading rows

Get rows returns the rows as objects keyed by the column names, a page at a time: Start at row (1 is the first row under the headers) and How many (100 by default, up to 1,000). nextStartRow is where the next page starts, or null at the end. The next node runs once per row; each one carries _rowNumber, its row number in the sheet, as Excel shows it.

jsonGet rows — output
{
  "workbookId": "01ABCDEF2GHIJKLMNOPQ",
  "worksheet": "Orders",
  "table": null,
  "headers": ["Order", "Customer", "Amount", "Date", "Paid"],
  "rows": [
    { "_rowNumber": 2, "Order": 1042, "Customer": "Ana García", "Amount": 12.5, "Date": "2026-10-01", "Paid": true },
    { "_rowNumber": 3, "Order": 1043, "Customer": "Sam Rivera", "Amount": 40, "Date": "2026-10-01", "Paid": false }
  ],
  "returned": 2,
  "totalRows": 2,
  "nextStartRow": null
}

Find rows returns the matching rows the same way, with matched and how many rows it searched.

Numbers, dates and empty cells

  • Numbers and true/false come back as JSON numbers and booleans; an empty cell as ""; a cell with an error as its text, #N/A.
  • A cell formatted as a date comes back as 2026-10-01, or 2026-10-01T09:30:00 when it has a time — with no time zone, because Excel has none.
  • Workbooks that use the 1904 date system (some old Mac workbooks) are read right on personal accounts. On work accounts Microsoft doesn't say which system a workbook uses, and HostWebhook assumes the usual one: dates in such a workbook come back four years and a day early.

Ranges

  • Read range — a Sheet and a Range like A1:D20; empty, the used range of the sheet. Read as values (the default), text as Excel shows it, or formulas (text and formulas on work accounts). The cells come back as values, one array per row; with First row is the header, also as objects in rows, and the next node runs once per row.
  • Write range — a Start cell or range (B2, or B2:D4 of the exact size) and Values, a JSON array of rows: [["Ana", 3], ["Sam", 5]]. One single value fills the whole range; shorter rows leave their missing cells as they are. Values that don't fit the range given fail with both sizes: Values are 3×2 but the range B2:D4 is 3×3. It overwrites what is there, headers and formulas included. Write as text applies.
  • Clear range — the contents (the default), the formats or all of a range.

The three work on up to 10,000 cells at a time — That range has 25,000 cells; the node reads at most 10,000 at a time. Narrow the range. — and need a range with both ends: a whole column (A:A) or a whole row (3:3) is refused.

Tables and sheets

  • Create table — a Sheet and a Range with the headers included, A1:D1 for an empty table with four columns. Turn on The range has no header row and Excel adds one, moving the data down a row. Table name is optional: no spaces, and it can't start with a number. A range that overlaps another table fails with Excel's message.
  • Delete table — by default the table is turned back into a plain range and every cell keeps its value. With Also delete its cells on, the table is deleted with its contents.
  • Add sheet — a Sheet name of up to 31 characters, without : \ / ? * [ ], and optionally Column names, comma-separated, written in row 1.
  • Delete sheet — the sheet and everything in it, tables included. There is no recycle bin for it; the workbook's version history in OneDrive is the way back. Excel doesn't let the last visible sheet go.
  • List tables (optionally only one sheet's) and List sheets return one entry per table or sheet, and the next node runs once per entry.

A trigger watching a sheet or a table that is deleted stops firing and says so on its page.

Finding and creating workbooks

Find workbooks looks for Excel files whose name contains the text — upper or lower case and accents don't matter — in the whole OneDrive, or only in a Folder and its subfolders. With the name empty, it lists the workbooks in the folder (or at the top). Up to 100 results; 25 by default. Microsoft's search also looks inside files, but only names count here: a workbook that merely mentions the word inside isn't returned. Microsoft indexes new files on its own schedule, so a search can miss one created a few minutes ago. Files shared with the account aren't included.

Create workbook makes a new .xlsx:

  • File name — .xlsx is added if missing. It can't contain " * : < > ? / \ | or start or end with a space, and names OneDrive reserves (CON, NUL, desktop.ini…) are refused before anything is uploaded. Folder empty means the top of OneDrive.
  • First sheet name (Sheet1 if empty), Column names (comma-separated) and Rows (JSON), up to 500. Without Column names, the keys of the first row become the headers.
  • Make it a table — the headers and rows become an Excel table. Work and school accounts only: on a personal account it is refused before uploading.
  • If the file exists — fail (the default) stops with A file named "Report.xlsx" already exists in that folder.; rename creates Report (2).xlsx (then (3), up to (20)) and says so in renamedFrom; replace overwrites the existing file — the way to rewrite a daily report. Nothing is ever replaced unless you pick replace.
jsonCreate workbook — output
{
  "workbook": {
    "id": "01ABCDEF2GHIJKLMNOPQ",
    "name": "Report (2).xlsx",
    "webUrl": "https://…",
    "path": "/Reports/Report (2).xlsx"
  },
  "worksheet": "Sheet1",
  "table": null,
  "headers": ["Order", "Customer", "Amount"],
  "rowsWritten": 2,
  "renamedFrom": "Report.xlsx"
}

Both work on personal accounts. {{payload.workbook.id}} is the Workbook of the next Excel step.


AI toolkit mode

Once Excel is connected, the node asks for a Mode. AI toolkit turns it into seventeen tools that an AI Node — or an MCP client, through one of your MCP servers — calls by name: “add this order to the sheet”, “what's the price of SKU 2201?”, “mark Ana's row as paid”.

ToolArgumentsStarts
list_excel_worksheetsworkbook_idavailable
list_excel_tablesworkbook_id · worksheet?available
read_excel_rangeworkbook_id · worksheet · address? · values_as? · first_row_headers?available
get_excel_rowsworkbook_id · worksheet? · table? · header_row? · start_row? · limit?available
find_excel_rowsworkbook_id · worksheet? · table? · header_row? · match_column · match_value · match_mode? · limit?available
append_excel_rowsworkbook_id · worksheet? · table? · header_row? · values? · rows?available
update_excel_rowsworkbook_id · worksheet? · table? · header_row? · match_column · match_value · values · update_all?available
append_or_update_excel_rowworkbook_id · worksheet? · table? · header_row? · match_column · match_value · valuesavailable
delete_excel_rowsworkbook_id · worksheet? · table? · header_row? · match_column · match_value · delete_all?blocked
add_excel_worksheetworkbook_id · name · headers?available
delete_excel_worksheetworkbook_id · worksheetblocked
create_excel_tableworkbook_id · worksheet · address · no_headers? · name?available
delete_excel_tableworkbook_id · table · delete_data?blocked
write_excel_rangeworkbook_id · worksheet · address · valuesblocked
clear_excel_rangeworkbook_id · worksheet · address · apply_to?blocked
find_excel_workbookssearch? · folder_id? · limit?available
create_excel_workbookname · folder_id? · worksheet_name? · headers? · rows? · as_table? · if_exists?available

Row values go as JSON: values is one row keyed by column name, {"Customer": "Ana", "Amount": 12}, and rows an array of them; in write_excel_range, values is an array of rows. With a default workbook, sheet or table (below), workbook_id, worksheet and table become optional and the model is told which ones they are. The model's arguments are used as written: a {{payload…}} in them is not filled in.

What you control

  • Five tools start blocked. delete_excel_rows, delete_excel_worksheet and delete_excel_table, because what they remove has no recycle bin; write_excel_range, because it overwrites any range blindly — headers and formulas included — while the row tools only touch the columns they name; and clear_excel_range, which empties cells. Unblock the ones the agent should have in the node's tool list. Any other tool can be blocked the same way — appending, for an agent that should only read.
  • Destructive, not blocked. update_excel_rows and append_or_update_excel_row overwrite cells, so the AI Node counts them as destructive (its Block destructive tool calls stops them), but they start available: they only touch the columns they name, on the rows that match.
  • Which workbooks. By default the agent only works on this node's workbook — any other workbook_id is refused before anything is sent, and so are find_excel_workbooks and create_excel_workbook. Open it to any workbook in the account in the toolkit's Settings.
  • Default workbook, sheet and table. Set them in Settings; left empty, the ones of the single operation are used when they are fixed values, not templates. Limited to the node's workbook and with none set anywhere, every call fails with Pick the workbook in the node's AI toolkit settings.
  • Fixed limits. 200 rows per read, 2,000 cells per range and 100 rows per write. A read that would return more is cut, with a notes field; a write that would change more — including update_all or delete_all matching more than 100 rows — is refused without writing anything.
  • No replacing files. create_excel_workbook can fail or rename when the name is taken, never replace.
  • Characters per call sent to the model. 20,000 by default. Lists that don't fit are cut whole rows, sheets or workbooks at a time, with a notes field saying how many were left out.
  • Personal accounts. The reading tools work; the writing ones answer with Microsoft's refusal, and the model reads it and tells the user.

Allow formulas

The model writes text that often comes from outside — an email, a form, a chat message — and it can be talked into things. If it could decide that a cell is a formula, a message carrying =HYPERLINK("https://…") would end up as a live formula in your workbook. So, with Allow formulas off (the default), text the AI writes that starts with =, +, - or @ is stored as text, never run as a formula; numbers and true/false it sends as JSON are written as they are. There is no argument for the model to change this: only you can, by turning Allow formulas on in the toolkit's Settings.

Testing a tool

⚠Only a tool call picks the tool. In AI toolkit mode, only an AI Node, an MCP client or a voice agent chooses which tool the node runs. Run Test, a flow or a webhook run the operation saved on the node: an operation in their payload that names another tool is refused.
✦To try a tool, call it from an AI Node or from an MCP client. Its arguments look like this:
jsonA tool call
{ "operation": "find_excel_rows", "worksheet": "Orders", "match_column": "Email", "match_value": "ana@example.com" }
⚠A node in toolkit mode is not part of the pipeline. Events arriving through connections made before you switched are refused — the node only runs the tool it is asked for.

The trigger

Pick an Excel credential and the workbook — with the same picker as the node — and then, in order:

  • Watch a table or Watch a sheet — nothing is picked for you. For a sheet, also its Header row (row 1 if empty).
  • Fires on — a row added, a row changed, a row deleted, or any of them. None is ticked for you, and activating without one says so.
  • Key column — the column that tells one row from another, picked from the header row, or left to HostWebhook (see Key column). Changed and deleted rows need one, picked or detected.
  • Watched columns — optional: only a change in these columns counts as a changed row. Empty, any column.
  • A batch size — when one check finds more than this many rows (10 if empty), they arrive as one event with all of them (see the payload). 0: never batch.
  • How often to check — every 5 minutes if empty, which is also the fastest; once an hour at the slowest.
  • Backfill on activate — with rows added among the events, every row already there fires once as added when you click Activate. Each activation with it on sends them all again.

Activating checks that the workbook is there, is an .xlsx or .xlsm of up to 25 MB, and has that sheet or table — if not, it lists the ones it has. Personal and work accounts both work, and nothing is installed in your OneDrive.

How it fires

Microsoft doesn't notify about changes inside a workbook, so the trigger checks it. Each check asks OneDrive for the file's version — a small request — and stops there if it didn't change. When it did, HostWebhook downloads the workbook, reads only the watched sheet or table, compares it with what it saw last time and fires once per row that was added, changed or deleted.

ℹUsually five to six minutes. Excel for the web saves while someone is still typing, so a workbook saved less than 30 seconds ago is left for the next check — rows don't fire half written. With the default check every 5 minutes, a row fires within about 5 to 6 minutes of the last edit.
  • It sees what Excel saved: a formula arrives as its result.
  • Each change is delivered once. Two changes to the same row in two versions of the file are two runs.
  • If Microsoft is busy or the download fails halfway, the next check tries again and the change still fires. If the file itself is the problem — deleted, over 25 MB, not readable, the sheet or table gone — the trigger's page shows the error and the trigger keeps checking, so it picks up again once the workbook is fixed. A revoked connection asks to reconnect the Excel account, and the changes made meanwhile fire after you do.
  • A sheet with more rows than your plan's limit for spreadsheet triggers (the same one as Google Sheets) can't be activated, and stops firing with that error if it grows past it.

Key column

To say a row changed or was deleted, the trigger has to recognise it between two checks — by a column whose value is that row's own: an order number, an email, an ID. Pick it if you know it. Left to HostWebhook, it chooses a column that is mostly filled in, mostly unique and keeps its values between checks — preferring names like id, email or sku — and leaves out the columns that this flow's own Excel nodes write in that sheet. The trigger's page shows the one it chose.

It keeps checking the choice: if the column it picked starts being filled in on rows that were already there, it drops it rather than fire those rows again. Without a key column only added rows can fire — the ones below the last row it had seen.

No loops

A flow that adds a row to the same sheet its trigger watches would fire itself forever. Activating refuses it: This flow adds rows to the same sheet the trigger watches — every run would trigger it again. Watch another sheet or table, or write somewhere else. That is when rows added is among the events and an Excel node of the flow appends, or appends or updates, in the same workbook and the same sheet or table. It is the same workbook whether it was picked from the list or typed as a path: activating asks OneDrive which file a typed path is, so a typed /sales/orders.xlsx is the Orders.xlsx of the Sales folder picked from the list. An Excel node connected with a different Microsoft account works in that account's OneDrive, so it is never the workbook the trigger watches, whatever its name.

  • Updating the rows it watches — marking a row as processed — is a normal pattern and isn't refused. But if the flow writes a different value every run (a date, {{$now}}) in a watched column, every run fires it again: the trigger's page warns about it. Leave those columns out of Watched columns.
  • An Excel node the AI Node uses as a tool — in AI toolkit mode, or a regular Excel node in the AI Node's Tools — runs when the model decides, so it doesn't block activating. When it could write to what the trigger watches — its workbook is that one, or its toolkit is open to any workbook — the trigger's page warns about it instead.
  • A typed path OneDrive didn't answer for while activating isn't skipped: the trigger activates and its page warns that the path may be the workbook it watches.

What the trigger sends downstream

One event per row. In row and previousRow a number arrives as a number and TRUE or FALSE as a boolean — 12.5, true — as they do from the Google Sheets trigger. Dates arrive as text, "2026-10-01", and a code with leading zeros stays text. rowRaw and keyValue are always text. Triggers created before October 2026 keep sending every value as text:

{
  "_meta": { "iterable": false, "count": 1 },
  "id": "01ABCDEF2GHIJKLMNOPQ:Orders:12:row_added:2026-10-01T15:12:44Z",
  "eventType": "row_added",
  "workbookId": "01ABCDEF2GHIJKLMNOPQ",
  "workbookName": "Orders.xlsx",
  "workbookUrl": "https://…",
  "worksheet": "Orders",
  "table": null,
  "rowNumber": 12,
  "row": { "Order": 1042, "Customer": "Ana García", "Date": "2026-10-01" },
  "rowRaw": ["1042", "Ana García", "2026-10-01"],
  "previousRow": null,
  "changedColumns": null,
  "keyColumn": "Order",
  "keyValue": "1042",
  "modifiedBy": { "name": "Ana García", "email": null },
  "modifiedTime": "2026-10-01T15:12:44Z"
}
  • eventType is row_added, row_updated or row_deleted. A changed row also brings previousRow and changedColumns; a deleted one, the row as it was.
  • Over the batch size, one event with eventType: "batch", rowCount and the entries above in rows — the next node runs once per row.
  • modifiedBy.email is often empty on personal accounts: Microsoft only gives the name.

To update that same row with the action node, pick the key column as Match column and use {{payload.keyValue}} as Match value — and write in a column you don't watch (see No loops).

Trying it out

The trigger's Test push reads the workbook and shows what a delivery will look like, without running the flow: the changes still waiting since the last check, if there are any — without using them up — or else the last rows, shaped as added rows. It also says which header row, key column and watched columns it is using. To see a real one, activate the trigger, add a row in Excel and wait a minute or two.


Good to know

Sizes and counts

WhatUp to
Workbooks read by downloading them — on personal accounts, and by the trigger on any account25 MB per file
Get rows and Find rows — rows returned100 by default, 1,000 at most
Rows searched by Find, Update, Append or update and Delete rows50,000
Append row and Create workbook — rows in Rows (JSON)500
Update every match / Delete every match — rows that match500; more, and nothing is written
Read range, Write range, Clear range10,000 cells
List tables50 tables
Find workbooks25 by default, 100 at most
Column pickers200 columns
AI toolkit200 rows per read, 2,000 cells per range, 100 rows per write
TriggerChecks every 5 minutes by default (also the fastest), once an hour at the slowest
File types.xlsx and .xlsm (Create workbook makes .xlsx)

A workbook over 25 MB is refused by its size, before anything is downloaded. One that is smaller but unpacks into a huge sheet can be refused with This workbook is too large or uses a format the node can't read.

When it fails

  • The workbook isn't there — Excel could not find the workbook — it may have been deleted or moved. Pick it again. A sheet or table that isn't there fails with the names of the ones that are.
  • Excel can't open it with this account — on a work account, the file isn't in this account's own OneDrive (shared with it, or in SharePoint). Reconnecting doesn't help; use the account that owns the file.
  • The workbook is busy — Excel is still saving another change. If nothing was written yet, the run is retried.
  • Too much data in one call — send fewer rows or a smaller range.
  • Reconnect — the account revoked HostWebhook or the sign-in expired: reconnect the credential in Settings → Credentials.
  • Busy or throttled. Microsoft limits how fast one account can be called. When it answers that it is busy, the node waits the time it asks for (up to ten seconds) and tries that call again; if Microsoft is still busy and nothing has been written yet, the run is retried up to twice more before it gives up with Microsoft's message.
  • Excel didn't confirm a change. When a call that changes the workbook times out or gets no answer, it may or may not have been saved. The node doesn't repeat it — that could add the row twice, or delete or change the next matching row — and fails with Excel didn't confirm the change — it may have been applied; check the workbook before running it again. If part of a change was saved and a later call is refused, it says so instead: Excel applied part of this change and then answered HTTP 429; the rest was not applied.
  • A timeout while adding rows to a table is the one exception: Microsoft asks for that request to be repeated, and the node repeats it once. In the rare case the first attempt did go in, the rows appear twice — never more: if the repeat times out too, the run fails with the message above.