FlowiseAI/Flowise · error · Error

Values must be a valid JSON array of value ranges

Error message

Values must be a valid JSON array of value ranges

What it means

Thrown by BatchUpdateValuesTool._call when JSON.parse(params.values) fails. Unlike update/append, BatchUpdateValuesSchema describes values as a JSON array of value-range objects ([{"range":"Sheet1!A1:B2","values":[[...]]}]), and the parsed result is placed under body.data for the values:batchUpdate endpoint. A parse failure here usually means the agent modeled the input as a single range instead of an array of {range, values} objects.

Source

Thrown at packages/components/nodes/tools/GoogleSheets/core.ts:582

            method: 'POST',
            headers: {}
        }
        super({
            ...toolInput,
            accessToken: args.accessToken
        })
        this.defaultParams = args.defaultParams || {}
    }

    async _call(arg: any): Promise<string> {
        const params = { ...arg, ...this.defaultParams }

        try {
            let valueRanges
            try {
                valueRanges = JSON.parse(params.values)
            } catch (error) {
                throw new Error('Values must be a valid JSON array of value ranges')
            }

            const body = {
                valueInputOption: params.valueInputOption || 'USER_ENTERED',
                data: valueRanges,
                includeValuesInResponse: params.includeValuesInResponse || false
            }

            const endpoint = `spreadsheets/${params.spreadsheetId}/values:batchUpdate`

            return await this.makeGoogleSheetsRequest({
                endpoint,
                method: 'POST',
                body,
                params
            })
        } catch (error) {
            return formatToolError(`Error batch updating values: ${error}`, params)

View on GitHub (pinned to abe4a8601a)

Solutions

  1. Ensure values is JSON.stringify([{range:'Sheet1!A1:B2', values:[['x','y']]}, ...]) — an array of value-range objects.
  2. Differentiate the prompt/schema from update_values: emphasize 'array of {range, values} objects'.
  3. Validate with Array.isArray(parsed) and parsed.every(r => r.range && Array.isArray(r.values)) after parsing.
  4. If only one range is needed, prefer update_values over batch_update_values to avoid the structural mismatch.

Example fix

// before — flat 2D array, wrong for batch
values: JSON.stringify([['a','b']])
// after — array of value-range objects
values: JSON.stringify([{ range: 'Sheet1!A1:B1', values: [['a','b']] }])
Defensive patterns

Strategy: validation

Validate before calling

function asValueRanges(input: unknown): string {
  const arr = typeof input === 'string' ? JSON.parse(input) : input
  if (!Array.isArray(arr) || !arr.every(r => r && typeof r === 'object' && 'range' in r && Array.isArray((r as any).values))) {
    throw new Error('batch values must be an array of { range, values[][] }')
  }
  return JSON.stringify(arr)
}

Type guard

interface ValueRange { range: string; values: unknown[][] }
function isValueRangeArray(v: unknown): v is ValueRange[] {
  return Array.isArray(v) && v.every(r => !!r && typeof r === 'object' && typeof (r as any).range === 'string' && Array.isArray((r as any).values))
}

Try / catch

try {
  return await batchUpdate.invoke({ ..., values: asValueRanges(input) })
} catch (e) {
  if (e instanceof Error && e.message === 'Values must be a valid JSON array of value ranges') {
    return wrapAsValueRanges(input) // auto-fix single range
  }
  throw e
}

Prevention

When it happens

Trigger: params.values is a 2D array (correct for update but wrong for batch), a single {range,values} object rather than an array of them, or a malformed multi-range JSON. The body.data field then receives a non-array, but the throw happens earlier at the parse step.

Common situations: Reusing an update_values prompt template for batch_update_values; agents concatenating range objects with commas without an enclosing array; trailing commas after the last element.

Related errors


AI-assisted analysis of FlowiseAI/Flowise@abe4a8601a (2026-08-12). Data as JSON: /api/errors/c6c2f287ce6f18ad. Report an issue: GitHub.