Skip to main content

Edit Google Sheets

Append rows, update cells, and add or remove rows and columns in a Google Sheet.

Overview

The Edit Google Sheets node performs structural and value edits against a Google Sheets spreadsheet using a connected Google account. Pick the operation you need from a single node — append data to the bottom, overwrite a range of cells, or insert/delete blank rows and columns.

Use it to:

  • Append new rows of data after each item processed by the workflow
  • Overwrite a specific range with computed values
  • Append objects to a table where keys map to the table's headers
  • Update specific rows in a table by ID column or by row number
  • Insert blank rows or columns ahead of writing
  • Delete a contiguous range of rows/columns, or specific row/column numbers

All operations batch automatically. Per-item parameters are evaluated for every input item, then collected and sent to Google Sheets in the minimum number of API calls (almost always one, regardless of how many input items the node receives). The Batch Size setting is irrelevant for this node.

For operations on Lido's own spreadsheets (worksheet management, grid resizing, etc.), use Edit Spreadsheet instead.

Parameters

ParameterDescriptionRequired
CredentialGoogle account credential (the Google Drive / googleDocs type used by the spreadsheet formulas)Yes
Spreadsheet URLGoogle Sheets URL to operate onYes
OperationWhich edit to perform (see below)Yes

Once Credential and Spreadsheet URL are filled in, every operation's Worksheet field becomes a populated dropdown (worksheet names are fetched live from the spreadsheet).

The googleDocs credential type uses Google's per-file (drive.file) scope. To reach a spreadsheet without going through the Google Picker each time, share the spreadsheet with files@lido.app with editor permissions — the node falls back to Lido's shared service account when the per-file scope can't reach the file.

Operations

Append Rows

Adds new rows after the last row of data in the worksheet (or in a specific table area if Start Cell is set). Maps to values.append. Across input items: rows targeting the same (worksheet, start cell) pair are concatenated and sent in one API call per unique pair (usually one).

ParameterDescriptionRequired
WorksheetWorksheet to append to (dropdown, populated from the spreadsheet)Yes
Start CellOptional cell within the worksheet whose data area Google should append after (e.g. B3). Leave blank to use the whole worksheetNo
Values2D array of cell values, one inner array per rowYes

Update Cells

Writes a 2D array of values starting at a single cell. Maps to values.batchUpdate; the size of the write area is inferred from the shape of Values (a 2x3 array starting at A1 writes A1:C2). Across input items: every (cell, values) pair is bundled into one batchUpdate call.

ParameterDescriptionRequiredDefault
WorksheetWorksheet to write to (dropdown)Yes
Start CellTop-left cell to start writing at (e.g. A1, B3)NoA1
Values2D array of cell values (rows of columns)Yes

Append to Table

Appends rows to a table whose first header is at the (Worksheet, Start Cell) pair. The node reads the header row, looks up each data key's column, and appends rows below the existing data. Across multiple input items, all rows are combined into a single values.append call.

ParameterDescriptionRequiredDefault
WorksheetWorksheet containing the table (dropdown)Yes
Start CellCell of the first header (e.g. A1, B3). Header row, header column, and data area are derived from itNoA1
DataA single object or an array of objects. Keys are matched to header names; unknown keys are ignoredYes

Example data per item:

[
{ "Name": "Alice", "Email": "alice@example.com", "Status": "active" },
{ "Name": "Bob", "Email": "bob@example.com", "Status": "pending" }
]

If the table headers are Name | Email | Status | Notes, two new rows are appended; the Notes column is left empty. With 100 input items each producing one such row, the node makes one values.append call with all 100 rows.

Update in Table

Updates rows in an existing table. Each input item updates one row, identified either by the value of an ID column or by an explicit row number expression. Only keys present on the input object are written; cells whose header isn't in the object are left untouched. Across all input items, updates are combined into a single values.batchUpdate call.

ParameterDescriptionRequiredDefault
WorksheetWorksheet containing the table (dropdown)Yes
Start CellCell of the first header (e.g. A1, B3)NoA1
DataA single object representing the row to update. Array data per item is rejected — split into multiple items if neededYes
Update ByID Column (default) or Row NumberYesidColumn

In ID Column mode:

ParameterDescriptionRequired
ID FieldHeader name to match on. The matching row is found by looking up the object's value in this header columnYes

In Row Number mode:

ParameterDescriptionRequired
Row Number1-based spreadsheet row number to update (expression). Use {{$item.spreadsheetRow}} (from Import Table) or any per-item fieldYes

Example item data (ID Column, ID Field = Email):

{ "Email": "alice@example.com", "Status": "verified" }

The first row with matching Email is updated; only Status changes. With 100 items each carrying one update, the node makes one batchUpdate call.

Insert Blank Rows

Maps to spreadsheets.batchUpdate with insertDimension. Across items: all insertions (across worksheets) are combined into one batchUpdate. Within each worksheet, ranges are applied highest-index-first so user-supplied 1-based indices remain stable across the batch.

ParameterDescriptionRequiredDefault
WorksheetTarget worksheet (dropdown)Yes
Row Index1-based row index where blank rows should be insertedYes
Number of RowsHow many blank rows to insertNo1

Delete Rows

Two selection modes — pick a contiguous range, or list specific row numbers. Maps to spreadsheets.batchUpdate with deleteDimension. Across items: all deletions (across worksheets) are combined into one batchUpdate, applied highest-index-first within each worksheet.

ParameterDescriptionRequiredDefault
WorksheetTarget worksheet (dropdown)Yes
Selection modeContiguous range (default) or Specific row numbersYesrange

In Contiguous range mode:

ParameterDescriptionRequiredDefault
Start Row Index1-based row index of the first row to deleteYes
Number of RowsHow many rows to deleteNo1

In Specific row numbers mode:

ParameterDescriptionRequired
Row NumbersArray of 1-based row numbers, e.g. [2, 5, 9]. Order doesn't matter; duplicates and gaps are handledYes

Consecutive numbers are merged into a single delete and applied in descending order so the indices you supply stay valid across the batch.

Insert Blank Columns

Same batchUpdate + insertDimension model as Insert Blank Rows. Across items: combined into one batchUpdate.

ParameterDescriptionRequiredDefault
WorksheetTarget worksheet (dropdown)Yes
Column Index1-based column index where blank columns should be insertedYes
Number of ColumnsHow many blank columns to insertNo1

Delete Columns

Same two-mode pattern as Delete Rows. Across items: combined into one batchUpdate.

ParameterDescriptionRequiredDefault
WorksheetTarget worksheet (dropdown)Yes
Selection modeContiguous range (default) or Specific column numbersYesrange

In Contiguous range mode:

ParameterDescriptionRequiredDefault
Start Column Index1-based column index of the first column to deleteYes
Number of ColumnsHow many columns to deleteNo1

In Specific column numbers mode:

ParameterDescriptionRequired
Column NumbersArray of 1-based column numbers, e.g. [2, 5, 9]. Order, duplicates, gaps all handledYes

Settings

SettingDescription
Execution ModeOnce per item (default) or OnceOnce only processes the first input item
Output ModeHow to output results when running once
Batch SizeIgnored — this node always combines all items into one Sheets API call
Stop on ErrorStop workflow on operation failure

Output

{
"status": {
"operation": "appendRows",
"success": true,
"message": "appendRows succeeded"
}
}

Access in expressions:

  • {{$item.data.status.operation}} — Which operation ran
  • {{$item.data.status.success}} — Whether it succeeded
  • {{$item.data.status.message}} — Operation summary

Examples

Append a Row per Processed Item

[Google Drive Trigger] → [Data Extractor] → [Edit Google Sheet (Append Rows)]

Configure Append Rows with:

  • Range: Sheet1
  • Values: [[ "{{$item.data.fileName}}", "{{$item.data.extractedTotal}}" ]]

Each item produces a new row at the bottom of Sheet1.

Overwrite a Header Row

[Manual Trigger] → [Edit Google Sheets (Update Cells)]
  • Worksheet: Sheet1
  • Start Cell: A1
  • Values: [[ "Name", "Email", "Status" ]]

Append Records by Header Name (one row per item, batched)

[Import Table] → [Process per row] → [Edit Google Sheets (Append to Table)]
  • Worksheet: Customers
  • Data: {{$item}} (one {Name, Email, Status} object per item)

100 input items become a single values.append call with 100 rows. Keys not in the table headers are ignored, so it's safe to pipe through extra fields.

Update Rows by ID

[Import Table] → [Filter] → [Edit Google Sheets (Update in Table, ID Column = "Email")]
  • Worksheet: Customers
  • Update By: ID Column
  • ID Field: Email
  • Data: {{$item}} (each item's data has Email plus the columns to overwrite)

One row updated per item; all updates batched into one values.batchUpdate call. Cells whose header isn't included in the data object are left alone — safe for partial updates.

Update Rows by Row Number

[Import Table (with row numbers)] → [Process...] → [Edit Google Sheets (Update in Table, Row Number = {{$item.spreadsheetRow}})]
  • Worksheet: Customers
  • Update By: Row Number
  • Row Number: {{$item.spreadsheetRow}} (or any per-item field)
  • Data: {{$item}} (the columns to overwrite)

Import Table attaches each row's spreadsheet row number; the Row Number expression evaluates per item, and all updates batch into one API call.

Make Room Before Bulk Insert

[Aggregate (count)] → [Edit Google Sheet (Insert Blank Rows)] → [Edit Google Sheet (Update Cells)]
  1. Count how many rows you need.
  2. Insert that many blank rows at the target index.
  3. Write data into the newly created range.

Delete Failed Rows

[Import Table] → [Filter (status = "error")] → [Aggregate] → [Edit Google Sheet (Delete Rows, Specific row numbers)]
  • Selection mode: Specific row numbers
  • Row Numbers: {{$item.data.failedRowNumbers}}

Failed row numbers don't have to be consecutive — any combination is handled.

Authentication

Requires a connected Google Drive (a.k.a. googleDocs) credential — the same credential type used by the APPENDTOGOOGLESHEET and UPDATECELLINGOOGLESHEET spreadsheet formulas. This credential uses Google's per-file drive.file OAuth scope, so it can only reach files the user has explicitly authorized. There are two ways to grant access to a sheet:

  1. Share with files@lido.app — give Lido's shared service account editor permissions on the spreadsheet. The node detects 404s and retries the call as the service account. Recommended for workflows that operate on many sheets.
  2. Pick via Google Picker — the picker grants per-file authorization for the duration of the credential.

Tips

  • Indices are 1-based to match what you see in the Google Sheets UI (row 1, column 1).
  • For Append Rows, the range can be just a worksheet name (e.g. Sheet1) — Google Sheets finds the last row of data automatically.
  • For Update Cells, the values 2D array shape must fit the range — extra rows/columns are ignored, missing ones leave existing cells unchanged.
  • For Append to Table and Update in Table, the headers are read from the spreadsheet at run time. Keys that don't match a header are ignored, so it's safe to pass through extra metadata.
  • Every operation batches across input items into one Sheets API call (Append Rows is one call per unique (worksheet, Start Cell) pair — usually one). 100 items → 1 HTTP round-trip, not 100. The Batch Size setting has no effect on this node.
  • All items must resolve to the same credential, spreadsheet URL, worksheet, and (for table operations) Start Cell. Per-item variation throws an error.
  • Update in Table requires exactly one row per item — array data is rejected. Split your data into multiple items if you need to update multiple rows.
  • Update in Table only writes the cells whose key is present in the data object — other cells in the row are not cleared. To explicitly clear a cell, include its header with an empty string.
  • Update in Table with ID Column mode requires every input item's data to include the ID field. Duplicates in the ID column resolve to the first matching row.
  • Start Cell's column part is meaningful for table operations: tables that don't start at column A are supported by setting e.g. B3.
  • The Worksheet dropdown calls the server with the same googleDocs pathway as the write operations, so it benefits from the same files@lido.app fallback.
  • Delete operations in Specific row numbers mode are batched into a single API call regardless of how scattered the indices are.
  • Each workflow item runs its own API call. For high-volume appending, consider aggregating items first and passing a single 2D array of values.