Portal Community
0-based indexing: StartIndex is 0-based. Row 1 (the header row in most sheets) is index 0. Row 2 (the first data row) is index 1. This differs from the 1-based row numbers used in sheet/clear and sheet/get. Always double-check your index calculation before executing.

When to Use

Configuration

FieldRequiredDescription
CredentialIdRequiredInteger ID referencing a stored Google credential in the BizFirst Credentials Manager.
SpreadsheetIdRequiredThe Google Sheets spreadsheet ID from the URL.
SheetNameRequiredExact name of the target tab. Case-sensitive.
DimensionOptionalEnum: Rows | Columns. Default Rows. Whether to delete rows or columns. Rows: removes the specified rows and shifts all rows below upward. Columns: removes the specified columns and shifts all columns to the right leftward.
StartIndexRequiredInteger. 0-based index of the first row or column to delete. Row 1 (Google Sheets row number 1) = index 0. Row 2 = index 1. Column A = index 0. Column B = index 1.
AmountRequiredInteger. Number of rows or columns to delete, starting from StartIndex. The deleted range covers StartIndex through StartIndex + Amount - 1 (inclusive). Must be at least 1.
Row index calculation: To delete row number N (in human/Sheets terms), set StartIndex = N - 1. To delete rows 5 through 8 (4 rows), set StartIndex = 4 (row 5 minus 1) and Amount = 4.

Validation Errors

Error CodeCause
VAL_MISSING_SPREADSHEET_IDSpreadsheetId is empty or whitespace.
VAL_MISSING_SHEET_NAMESheetName is empty or whitespace.
VAL_MISSING_START_INDEXStartIndex is not provided.
VAL_MISSING_AMOUNTAmount is not provided or is less than 1.
VAL_INVALID_START_INDEXStartIndex is negative.
VAL_RANGE_OUT_OF_BOUNDSThe specified range exceeds the number of rows or columns in the sheet.
SHEET_NOT_FOUNDThe specified SheetName does not exist in the spreadsheet.

Output Fields

FieldTypeDescription
dimensionstring"Rows" or "Columns" — echoed from the request.
startIndexintegerEchoed StartIndex from the request.
endIndexintegerComputed as StartIndex + Amount (exclusive end index, consistent with Google Sheets API range semantics).
deletedCountintegerNumber of rows or columns that were deleted. Equal to Amount.
sheetIdintegerInternal Google sheet ID of the tab that was modified.
spreadsheetIdstringEchoed spreadsheet ID.
statusstring"success".
resourcestringAlways "sheet".
operationstringAlways "deleteRowsOrColumns".

Sample Configuration

// Delete rows 5 through 7 (3 rows, 0-based index 4)
{
  "resource": "sheet",
  "operation": "deleteRowsOrColumns",
  "CredentialId": 12,
  "SpreadsheetId": "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms",
  "SheetName": "Active Tasks",
  "Dimension": "Rows",
  "StartIndex": 4,
  "Amount": 3
}

Sample Output

{
  "dimension": "Rows",
  "startIndex": 4,
  "endIndex": 7,
  "deletedCount": 3,
  "sheetId": 924830127,
  "spreadsheetId": "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms",
  "status": "success",
  "resource": "sheet",
  "operation": "deleteRowsOrColumns"
}

Expression Reference

Assuming this node is named deleteCompletedRows in the workflow:

ExpressionReturnsDescription
{{ $output.deleteCompletedRows.deletedCount }}integerNumber of rows (or columns) deleted.
{{ $output.deleteCompletedRows.dimension }}string"Rows" or "Columns" — echoed from config.
{{ $output.deleteCompletedRows.startIndex }}integer0-based start index that was used.
{{ $output.deleteCompletedRows.endIndex }}integerExclusive end index (startIndex + amount).
{{ $output.deleteCompletedRows.sheetId }}integerInternal Google sheet ID of the modified tab.

Node Policies & GuardRails

Workflow Examples

Example 1 — Remove Terminated Employee Row

// Trigger: Webhook from HRIS (employee terminated)
// Step 1: Find the employee's row number
// Node 1 — sheet/get (findEmployee)
{
  "resource": "sheet", "operation": "get",
  "CredentialId": 12,
  "SpreadsheetId": "{{ $env.HR_SHEET_ID }}",
  "SheetName": "Employees",
  "Filters": [{ "Column": "EmployeeId", "Operator": "Equals", "Value": "{{ $json.employeeId }}" }],
  "ReturnFirstMatch": true
}

// Node 2 — Code node: compute row index
// The row index in the sheet = HeaderRow(1) + FirstDataRow offset + position in results
// Assumes rows are ordered and we track rowIndex from the get response metadata
// Output: rowIndex (0-based)

// Node 3 — sheet/deleteRowsOrColumns (removeEmployee)
{
  "resource": "sheet", "operation": "deleteRowsOrColumns",
  "CredentialId": 12,
  "SpreadsheetId": "{{ $env.HR_SHEET_ID }}",
  "SheetName": "Employees",
  "Dimension": "Rows",
  "StartIndex": "{{ $output.computeIndex.rowIndex }}",
  "Amount": 1
}

Example 2 — Remove Extra CSV Header Rows

// Imported CSV data has 3 header/metadata rows before real data
// Delete rows 1-3 (indices 0, 1, 2 — but we delete in one call: StartIndex=0, Amount=3)
{
  "resource": "sheet", "operation": "deleteRowsOrColumns",
  "CredentialId": 15,
  "SpreadsheetId": "{{ $env.IMPORT_SHEET_ID }}",
  "SheetName": "Import Buffer",
  "Dimension": "Rows",
  "StartIndex": 0,
  "Amount": 3
}
// After this node: row 4 (old) becomes row 1 (new index 0)

Example 3 — Remove Deprecated Column

// Remove column D (index 3) — a deprecated "LegacyCode" field
{
  "resource": "sheet", "operation": "deleteRowsOrColumns",
  "CredentialId": 12,
  "SpreadsheetId": "{{ $env.PRODUCTS_SHEET_ID }}",
  "SheetName": "Products",
  "Dimension": "Columns",
  "StartIndex": 3,
  "Amount": 1
}
// Column E shifts to D, column F shifts to E, etc.