Google Sheets node reference - all 60 operations, the credential it needs, and a worked example.
readRange, batchGet, batchGetByDataFilter, findRow, getLastRow, appendRow, batchAppend, updateRange, batchUpdateValues, batchUpdateValuesByDataFilter, clearRange, batchClear, batchClearByDataFilter, createSpreadsheet, getSheetMetadata, getSpreadsheetByDataFilter, updateSpreadsheetProperties, addSheet, deleteSheet, duplicateSheet, renameSheet, copySheetToSpreadsheet, deleteRow, deleteDimension, insertDimension, appendDimension, moveDimension, updateDimensionProperties, autoResizeDimensions, mergeCells, unmergeCells, insertRange, deleteRange, copyPaste, cutPaste, pasteData, trimWhitespace, randomizeRange, autoFill, findReplace, sortRange, deleteDuplicates, textToColumns, setBasicFilter, clearBasicFilter, formatCells, setDataValidation, clearDataValidation, addConditionalFormatRule, deleteConditionalFormatRule, addProtectedRange, deleteProtectedRange, addNamedRange, deleteNamedRange, createDeveloperMetadata, updateDeveloperMetadata, deleteDeveloperMetadata, getDeveloperMetadata, searchDeveloperMetadata, batchUpdateRaw.
Credential: Google service account JSON key - see Credentials.
Each operation below lists the scope it needs. Scopes are granted to the service account (and shared with the file). If a run fails with a permission error, the node names the missing scope in the error - grant it and re-run; you do not need to rebuild the workflow.
| Operation | What it does | Scope |
|---|
readRange | Read range | spreadsheets.readonly |
batchGet | Read multiple ranges | spreadsheets.readonly |
batchGetByDataFilter | Read ranges by data filter | spreadsheets.readonly |
findRow | Find row by value | spreadsheets.readonly |
getLastRow | Get last row | spreadsheets.readonly |
| Operation | What it does | Scope |
|---|
appendRow | Append row | spreadsheets |
batchAppend | Append rows | spreadsheets |
updateRange | Update range | spreadsheets |
batchUpdateValues | Update multiple ranges | spreadsheets |
batchUpdateValuesByDataFilter | Update ranges by data filter | spreadsheets |
| Operation | What it does | Scope |
|---|
clearRange | Clear range | spreadsheets |
batchClear | Clear multiple ranges | spreadsheets |
batchClearByDataFilter | Clear ranges by data filter | spreadsheets |
| Operation | What it does | Scope |
|---|
createSpreadsheet | Create spreadsheet | spreadsheets + drive |
getSheetMetadata | Get spreadsheet metadata | spreadsheets.readonly |
getSpreadsheetByDataFilter | Get spreadsheet by data filter | spreadsheets.readonly |
updateSpreadsheetProperties | Update spreadsheet properties | spreadsheets |
| Operation | What it does | Scope |
|---|
addSheet | Add sheet (tab) | spreadsheets |
deleteSheet | Delete sheet | spreadsheets |
duplicateSheet | Duplicate sheet | spreadsheets |
renameSheet | Rename / update sheet | spreadsheets |
copySheetToSpreadsheet | Copy sheet to another spreadsheet | spreadsheets |
| Operation | What it does | Scope |
|---|
deleteRow | Delete row | spreadsheets |
deleteDimension | Delete rows or columns | spreadsheets |
insertDimension | Insert rows or columns | spreadsheets |
appendDimension | Append rows or columns | spreadsheets |
moveDimension | Move rows or columns | spreadsheets |
updateDimensionProperties | Resize or hide rows/columns | spreadsheets |
autoResizeDimensions | Auto-resize columns | spreadsheets |
| Operation | What it does | Scope |
|---|
mergeCells | Merge cells | spreadsheets |
unmergeCells | Unmerge cells | spreadsheets |
insertRange | Insert cells | spreadsheets |
deleteRange | Delete cells | spreadsheets |
copyPaste | Copy & paste range | spreadsheets |
cutPaste | Cut & paste range | spreadsheets |
pasteData | Paste delimited data | spreadsheets |
trimWhitespace | Trim whitespace | spreadsheets |
randomizeRange | Randomize rows | spreadsheets |
autoFill | Auto-fill range | spreadsheets |
| Operation | What it does | Scope |
|---|
findReplace | Find & replace | spreadsheets |
sortRange | Sort range | spreadsheets |
deleteDuplicates | Remove duplicate rows | spreadsheets |
textToColumns | Split text to columns | spreadsheets |
setBasicFilter | Set filter | spreadsheets |
clearBasicFilter | Clear filter | spreadsheets |
| Operation | What it does | Scope |
|---|
formatCells | Format cells | spreadsheets |
setDataValidation | Set data validation | spreadsheets |
clearDataValidation | Clear data validation | spreadsheets |
addConditionalFormatRule | Add conditional format rule | spreadsheets |
deleteConditionalFormatRule | Delete conditional format rule | spreadsheets |
addProtectedRange | Protect range | spreadsheets |
deleteProtectedRange | Remove range protection | spreadsheets |
addNamedRange | Add named range | spreadsheets |
deleteNamedRange | Delete named range | spreadsheets |
| Operation | What it does | Scope |
|---|
createDeveloperMetadata | Create developer metadata | spreadsheets |
updateDeveloperMetadata | Update developer metadata | spreadsheets |
deleteDeveloperMetadata | Delete developer metadata | spreadsheets |
getDeveloperMetadata | Get developer metadata | spreadsheets.readonly |
searchDeveloperMetadata | Search developer metadata | spreadsheets.readonly |
| Operation | What it does | Scope |
|---|
batchUpdateRaw | Run raw batchUpdate requests | spreadsheets |
Look up a customer row in a shared ops sheet
A webhook fires with a customer email, and the workflow checks a sheet the ops team maintains by hand to see whether that customer already has a row. The sheet must be shared with the service account's client_email - the service account is a separate identity from your own Google account, so a sheet you can open is not automatically one this node can open.
Set Operation to findRow, then fill in:
| Field | Value | Notes |
|---|
spreadsheetId | 1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms | The long ID from the sheet's URL |
range | Customers!A:F | The range to scan, A1 notation |
searchValue | {{trigger.email}} | Matches the first row where any cell equals this exactly |
Sets {{lookup.found}} (true/false), {{lookup.rowIndex}} (0-based within the range, null when not found) and {{lookup.row}} (the matched row as an array of cells). A Branch node tests {{lookup.found}}; a later node reads a column with {{lookup.row.[2]}}.