Respuesta breve: Empieza por el error completo, no solo por el módulo rojo:
The operation failed with an error. [400] Invalid requests[0]...
El sufijo después de requests[0] es la parte útil. Nombra la operación, campo o índice que Google rechazó. El 0 es el primer elemento del array de solicitudes de Google, no un número de módulo de Make ni una fila de spreadsheet.
Reduce el cuerpo fallido a una solicitud contra un archivo desechable. No repitas el lote completo de producción mientras cambias varios campos a la vez.
1. Identifica cuál de los tres endpoints estás llamando
Estos caminos se parecen, pero admiten cuerpos distintos:
| Trabajo | Sufijo del endpoint de Google | Cuerpo superior |
|---|---|---|
| Sustituir texto o editar un Google Doc | /v1/documents/DOCUMENT_ID:batchUpdate | requests con operaciones de Docs |
| Cambiar estructura, formato o celdas tipadas de Sheets | /v4/spreadsheets/SPREADSHEET_ID:batchUpdate | requests con operaciones de Sheets |
| Escribir valores en rangos de Sheets | /v4/spreadsheets/SPREADSHEET_ID/values:batchUpdate | valueInputOption y data |
Referencias oficiales: Docs batchUpdate, Sheets batchUpdate, Sheets values.batchUpdate.
Para valores ordinarios en A2:B2, utiliza el endpoint values. Para userEnteredValue tipado o formato, utiliza un lote requests de Sheets. Para texto de documento, usa una solicitud de Docs. Los cuerpos no son intercambiables.
2. Comprueba la URL base del módulo de Make
Para Docs, utiliza Google Docs › Make an API Call. Su URL es relativa a https://docs.googleapis.com/, así que introduce:
/v1/documents/DOCUMENT_ID:batchUpdate
Para Sheets, utiliza Google Sheets › Make an API Call. Su URL es relativa a https://sheets.googleapis.com/v4/, así que introduce una de estas rutas:
/spreadsheets/SPREADSHEET_ID:batchUpdate
/spreadsheets/SPREADSHEET_ID/values:batchUpdate
Selecciona POST en Method y envía JSON con Content-Type: application/json. La conexión de la aplicación proporciona autorización; no pegues un bearer token ajeno. Las bases y conexiones están documentadas en Google Docs y Google Sheets.
Sustituye los IDs en mayúsculas por IDs reales de archivos de prueba. Revisa la entrada expandida en la ejecución fallida: el campo configurado puede parecer correcto mientras su valor mapeado está vacío o pertenece a otro archivo.
3. Comprueba una sustitución literal en Docs
Crea un Doc desechable con NAME_SLOT. Usa este cuerpo sin respuestas mapeadas:
{
"requests": [
{
"replaceAllText": {
"containsText": {
"text": "NAME_SLOT",
"matchCase": true
},
"replaceText": "Jamie Quinn"
}
}
]
}
Lee el documento guardado después de la solicitud. El nombre ficticio debe sustituir el marcador. NAME_SLOT es texto sencillo deliberadamente; el ejemplo no depende de que Make interprete {{...}} como sintaxis de plantilla.
Sustituye el nombre literal por una respuesta mapeada solo cuando funcione la solicitud. Si la versión literal funciona y la mapeada falla, compara los JSON finales. Una respuesta con comillas o saltos de línea puede romper JSON construido manualmente.
Usa JSON › Create JSON con una estructura que corresponda al cuerpo; consulta Make JSON. Tener sintaxis JSON válida no demuestra que los campos de operación de Google sean válidos.
4. Comprueba por separado una escritura de valores en Sheets
Crea un spreadsheet desechable con una pestaña Intake. Usa /values:batchUpdate y este cuerpo:
{
"valueInputOption": "RAW",
"data": [
{
"range": "'Intake'!A2:B2",
"values": [["Jamie Quinn", 1234.56]]
}
]
}
El nombre es una cadena JSON y el importe es un número JSON. El rango usa el título de la pestaña. Conserva data como array y values como array de filas. No envuelvas el cuerpo en requests ni añadas un replaceAllText de Docs.
Inspecciona A2 y B2 después del llamado. Una respuesta exitosa contra el spreadsheet equivocado sigue siendo una prueba fallida para tu escenario.
5. Comprueba celdas tipadas y máscaras de campos
Para Sheets updateCells, usa el endpoint estructural batchUpdate. El ejemplo escribe dos celdas desde A2:
{
"requests": [
{
"updateCells": {
"start": {
"sheetId": 12345,
"rowIndex": 1,
"columnIndex": 0
},
"rows": [
{
"values": [
{"userEnteredValue": {"stringValue": "Jamie Quinn"}},
{"userEnteredValue": {"numberValue": 1234.56}}
]
}
],
"fields": "userEnteredValue"
}
}
]
}
12345 es un ID de pestaña ilustrativo; reemplázalo por el sheetId numérico real. El ID del archivo spreadsheet es otro identificador.
La referencia de solicitudes Sheets define start o range y la máscara relativa a CellData. La referencia de tipos define numberValue numérico e índices desde cero. A2 es índice de fila 1 y columna 0.
Mantén la prueba pequeña. Un range amplio con datos insuficientes puede borrar campos cubiertos por la máscara en el área restante. No uses fields: "*" para ocultar dudas sobre qué campos quieres modificar.
Errores comunes y corrección
El campo pertenece a otra API
Una operación Docs no funciona dentro de un lote requests de Sheets. Compara el nombre rechazado con la referencia del endpoint llamado. Reconstruye el cuerpo válido más pequeño para ese endpoint.
numberValue contiene texto formateado
"numberValue": "€1.234,56" es una cadena, no un número JSON. Analiza el importe según un formato declarado antes de serializarlo. Envía 1234.56 como número solo si es el valor previsto y conserva la moneda aparte. Consulta Invalid number en respuestas de formularios.
El ID de pestaña es incorrecto
Lee los metadatos del spreadsheet y relaciona el título con el sheetId numérico. La posición visual de la pestaña no es su identificador. Si se recreó, actualiza los metadatos en lugar de reutilizar el ID antiguo.
Un índice está fuera del documento actual
Para operaciones basadas en índices, recupera primero la estructura actual. Comprueba replaceAllText para marcadores sencillos antes de añadir ediciones por índice.
El documento tiene varias pestañas
La guía de pestañas de Docs explica que replaceAllText puede afectar a todas si no se indica un criterio de pestañas. Limita la sustitución si el marcador aparece en otras partes.
La revisión exigida está desactualizada
Si envías writeControl.requiredRevisionId, compárala con la revisión actual. Docs puede rechazar una revisión obligatoria antigua. Lee de nuevo; quitar protección de concurrencia sin revisar contenido no es una corrección.
Retry sigue fallando
Repetir una entrada mal formada no corrige su esquema. Conserva la entrada, corrige una causa y prueba un archivo desechable. No omitas la escritura para dar después el documento por actualizado.
Créditos y efecto de un lote fallido
Un módulo ordinario de llamada API ejecutado da una estimación de un crédito. Leer y escribir son dos. Varias subsolicitudes dentro de una llamada siguen siendo una ejecución de módulo de Make. Comprueba el historial; consulta Make Credits.
Los lotes requests de Docs y Sheets validan antes de aplicar. Un miembro inválido impide los cambios de ese lote. No deshace un documento creado ni una fila añadida por un módulo anterior de Make. Inspecciona esos resultados antes de repetir todo el escenario.
Pruebas
- Guarda el sufijo completo del error y la entrada expandida.
- Confirma API, ruta, método e ID del archivo.
- Envía una solicitud literal a un archivo de prueba.
- Lee el destino y verifica exactamente el texto o las celdas cambiadas.
- Sustituye un literal por una respuesta mapeada y compara el cuerpo.
- Prueba puntuación y el formato numérico declarado.
- Añade las demás solicitudes una a una y verifica cada cambio.
Detente cuando falle la primera solicitud recién añadida. No reordenes el lote solo para cambiar el índice del error.
Usa una captura más sencilla cuando corresponda
Si necesitas recoger leads de formularios en Sheets y avisar por Slack, empieza con la plantilla gratuita Lead Capture → Sheets + Slack. Es un flujo de captura separado, no un parche para un cuerpo batchUpdate arbitrario.
¿Todavía sin cuenta? Crea una cuenta gratuita de Make: affiliate link. Flowpaja puede recibir una comisión sin coste adicional para ti.