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 rowObject

View on GitHub (pinned to a81a902e9a)

Solutions

  1. Check the exact json.operation value being sent and match it to one of the supported Operation enum values for GSheets
  2. Log or inspect the outgoing query payload to catch typos or undefined operations
  3. Update Budibase if a newer version supports the operation you need
  4. 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

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


AI-assisted analysis of Budibase/budibase@a81a902e9a (2026-08-29). Data as JSON: /api/errors/cb9324777a4b057a. Report an issue: GitHub.