Budibase/budibase · error · Error
GSheets integration does not support "${json.operation}".
Error message
GSheets integration does not support "${json.operation}". What it means
query() is a switch over json.operation; if the operation string is not one of the supported Google Sheets operations (READ, CREATE_ROW, UPDATE_ROW, DELETE_ROW, CREATE_TABLE, UPDATE_TABLE, DELETE_TABLE, etc.), the default branch throws. It usually means the operation name is misspelled or an operation from a different integration (e.g. SQL) was sent to GSheets.
Source
Thrown at packages/server/src/integrations/googlesheets.ts:454
})
case Operation.CREATE_TABLE:
if (!json.table) {
throw new Error(
"attempted to create a table without specifying the table to create"
)
}
return this.createTable(json.table)
case Operation.UPDATE_TABLE:
if (!json.table) {
throw new Error(
"attempted to create a table without specifying the table to create"
)
}
return this.updateTable(json.table)
case Operation.DELETE_TABLE:
return this.deleteTable(json?.table?.name)
default:
throw new Error(
`GSheets integration does not support "${json.operation}".`
)
}
}
private buildRowObject(
headers: string[],
values: Record<string, string>,
rowNumber: number
) {
const rowObject: { rowNumber: number } & Row = {
rowNumber,
_id: rowNumber.toString(),
}
for (let i = 0; i < headers.length; i++) {
rowObject[headers[i]] = values[headers[i]]
}
return rowObjectView on GitHub (pinned to a81a902e9a)
Solutions
- Check the exact json.operation value being sent and match it to one of the supported Operation enum values for GSheets
- Log or inspect the outgoing query payload to catch typos or undefined operations
- Update Budibase if a newer version supports the operation you need
- If building payloads dynamically, validate the operation against the integration's supported list before calling query
Example fix
// before
await integration.query({ operation: 'DELETE_MANY' })
// after
await integration.query({ operation: Operation.READ, table: { name: 'Customers' } }) Defensive patterns
Strategy: type-guard
Validate before calling
import { Operation } from './types' // supported set for GSheets
const SUPPORTED = new Set(Object.values(Operation))
function assertSupportedOperation(json) {
if (!SUPPORTED.has(json.operation)) {
throw new Error(`Unsupported GSheets operation: ${json.operation}`)
}
} Type guard
function isSupportedOperation(op) {
return ['READ','CREATE_ROW','UPDATE_ROW','DELETE_ROW','CREATE_TABLE','UPDATE_TABLE','DELETE_TABLE'].includes(op)
} Try / catch
try {
await integration.query(json)
} catch (err) {
if (err.message.startsWith('GSheets integration does not support')) {
// log json.operation, correct or route the query to the right integration
} else throw err
} Prevention
- Import and use the Operation enum instead of raw strings
- Route queries to integrations based on datasource type, reusing SQL-style ops for GSheets fails
- Add a test enumerating all enum values against the GSheets switch
When it happens
Trigger: Calling query() with an operation value outside the switch cases — e.g. a typo like 'CREAT_TABLE', an unsupported verb like 'BULK_INSERT', or passing undefined operation.
Common situations: Reusing a query definition built for another integration; version drift where an operation was added to the platform but not yet supported by the GSheets integration; stringly-typed operation values from custom scripts.
Understand the failure class
Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.
Related errors
- attempted to create a table without specifying the table to
- Error getting status
- Unable to remove doc without a valid _id and _rev.
- Cannot store document without _id field.
- Configuration invalid. Must contain google clientID and clie
AI-assisted analysis of Budibase/budibase@a81a902e9a (2026-08-29).
Data as JSON: /api/errors/cb9324777a4b057a.
Report an issue: GitHub.