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.
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.
- 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) ormyapps.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:
| Personal | Work or school | |
|---|---|---|
| Get rows, Find rows, List sheets, List tables | Yes — HostWebhook downloads the file and reads it | Yes |
| Read range | Values only — not as text or formulas | Yes |
| Append, update and delete rows; tables; add and delete sheets; write and clear ranges | No — refused before anything is sent to Microsoft | Yes |
| Find workbooks | Yes | Yes |
| Create workbook | Yes, without “Make it a table” | Yes |
| Sheet, table and column pickers | Yes | Yes |
| The trigger | Yes | Yes |
| AI toolkit | The reading tools; the writing ones answer with the refusal | Every 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.
| Group | Operation | What it does | Workbook |
|---|---|---|---|
| Rows | Append row | Add one or more rows at the end of a table, or under the last used row of a sheet. | writes |
| Rows | Update row | Change the columns you name in the row — or every row — where a column matches a value. | writes |
| Rows | Append or update row | Update the matching row, or add it when there is none. Keeps a sheet in sync without duplicates. | writes |
| Rows | Get rows | Rows as objects keyed by the column names, a page at a time. | reads |
| Rows | Find rows | The rows whose column equals — or contains — a value. | reads |
| Rows | Delete rows | The matching row, or every matching row. The rows below move up. | deletes |
| Tables | List tables | The Excel tables in the workbook: name, sheet, range and column names. | reads |
| Tables | Create table | Turn a range, headers included, into an Excel table. | writes |
| Tables | Delete table | Turn a table back into plain cells, or delete it with its contents. | deletes |
| Sheets & ranges | List sheets | The sheets of the workbook, in order. | reads |
| Sheets & ranges | Add sheet | A new sheet, optionally with column names in row 1. | writes |
| Sheets & ranges | Delete sheet | A sheet and everything in it. | deletes |
| Sheets & ranges | Read range | Cells by A1 range — or the whole used range — as rows, or as objects. | reads |
| Sheets & ranges | Write range | Values into cells from a start cell, or into an exact range. | writes |
| Sheets & ranges | Clear range | The contents, the formats, or both, of a range. | clears |
| Workbooks | Find workbooks | Excel files in the OneDrive by name, or the ones in a folder. | reads |
| Workbooks | Create workbook | A 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.
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
.xlsxand.xlsmopen — Microsoft's Excel API doesn't open the old.xls. The macros of an.xlsmare 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.
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:
[
{ "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.
= — 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: 0and 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
actionsays which:updatedorappended. 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.
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.
{
"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, or2026-10-01T09:30:00when 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 asvalues, one array per row; with First row is the header, also as objects inrows, and the next node runs once per row. - Write range — a Start cell or range (
B2, orB2:D4of 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:D1for 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 —
.xlsxis 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 (
Sheet1if 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 inrenamedFrom; replace overwrites the existing file — the way to rewrite a daily report. Nothing is ever replaced unless you pick replace.
{
"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”.
| Tool | Arguments | Starts |
|---|---|---|
| list_excel_worksheets | workbook_id | available |
| list_excel_tables | workbook_id · worksheet? | available |
| read_excel_range | workbook_id · worksheet · address? · values_as? · first_row_headers? | available |
| get_excel_rows | workbook_id · worksheet? · table? · header_row? · start_row? · limit? | available |
| find_excel_rows | workbook_id · worksheet? · table? · header_row? · match_column · match_value · match_mode? · limit? | available |
| append_excel_rows | workbook_id · worksheet? · table? · header_row? · values? · rows? | available |
| update_excel_rows | workbook_id · worksheet? · table? · header_row? · match_column · match_value · values · update_all? | available |
| append_or_update_excel_row | workbook_id · worksheet? · table? · header_row? · match_column · match_value · values | available |
| delete_excel_rows | workbook_id · worksheet? · table? · header_row? · match_column · match_value · delete_all? | blocked |
| add_excel_worksheet | workbook_id · name · headers? | available |
| delete_excel_worksheet | workbook_id · worksheet | blocked |
| create_excel_table | workbook_id · worksheet · address · no_headers? · name? | available |
| delete_excel_table | workbook_id · table · delete_data? | blocked |
| write_excel_range | workbook_id · worksheet · address · values | blocked |
| clear_excel_range | workbook_id · worksheet · address · apply_to? | blocked |
| find_excel_workbooks | search? · folder_id? · limit? | available |
| create_excel_workbook | name · 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_worksheetanddelete_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; andclear_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_rowsandappend_or_update_excel_rowoverwrite 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_idis refused before anything is sent, and so arefind_excel_workbooksandcreate_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
notesfield; a write that would change more — includingupdate_allordelete_allmatching more than 100 rows — is refused without writing anything. - No replacing files.
create_excel_workbookcan 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
notesfield 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
operation in their payload that names another tool is refused.{ "operation": "find_excel_rows", "worksheet": "Orders", "match_column": "Email", "match_value": "ana@example.com" }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.
- 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"
}eventTypeisrow_added,row_updatedorrow_deleted. A changed row also bringspreviousRowandchangedColumns; a deleted one, the row as it was.- Over the batch size, one event with
eventType: "batch",rowCountand the entries above inrows— the next node runs once per row. modifiedBy.emailis 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
| What | Up to |
|---|---|
| Workbooks read by downloading them — on personal accounts, and by the trigger on any account | 25 MB per file |
| Get rows and Find rows — rows returned | 100 by default, 1,000 at most |
| Rows searched by Find, Update, Append or update and Delete rows | 50,000 |
| Append row and Create workbook — rows in Rows (JSON) | 500 |
| Update every match / Delete every match — rows that match | 500; more, and nothing is written |
| Read range, Write range, Clear range | 10,000 cells |
| List tables | 50 tables |
| Find workbooks | 25 by default, 100 at most |
| Column pickers | 200 columns |
| AI toolkit | 200 rows per read, 2,000 cells per range, 100 rows per write |
| Trigger | Checks 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.