> ## Documentation Index
> Fetch the complete documentation index at: https://docs.jelou.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Google Sheets

> Registra, consulta y actualiza datos de Google Sheets desde tus flujos conversacionales en Brain Studio.

**Google Sheets** es una herramienta accesible para equipos que necesitan datos estructurados sin montar una base de datos. A diferencia de Supabase (que conecta con PostgreSQL y lógica de negocio) o de un CRM (que impone un modelo predefinido), Sheets es flexible, compartible y familiar para cualquier persona del equipo.

En **Brain Studio**, la integración permite que tus flujos lean, escriban y transformen datos en hojas en tiempo real: registrar leads, actualizar estados, consolidar reportes y orquestar procesos donde la hoja funciona como panel de control operativo.

## Qué habilita Google Sheets

Al conectar **Google Sheets**, puedes:

* **Registrar eventos del negocio en hojas compartidas** — leads, citas, pagos o documentos que quedan estructurados desde la conversación
* **Consultar datos existentes antes de responder** — buscar una fila por ID, leer un rango o verificar un estado para que el agente no invente
* **Actualizar estados y columnas en tiempo real** — marcar como procesado, agregar timestamp o cambiar un valor según lo que ocurre en el flujo
* **Gobernar la estructura del documento** — formato condicional, validación de datos y protección de rangos para mantener la calidad de la hoja
* **Orquestar procesos entre integraciones** — usar la hoja como cola de tareas donde cada fila es un caso pendiente que el flujo procesa y marca como hecho

***

## Instalación

### Requisitos previos

1. Una **cuenta de Google** con acceso a **Google Sheets** y **Google Drive**.

### Cómo conectarla

La forma más directa es usar [**Jelou Agent**](/guides/getting-started/jelou-agent): describe lo que necesitas y el agente conecta **Google Sheets** automáticamente dentro del flujo.

Si prefieres instalar manualmente, sigue estos pasos en el **Marketplace**. La conexión usa **OAuth de Google**; no necesitas copiar credenciales.

<Steps>
  <Step title="Abrir el Marketplace">
    En Brain Studio, abre **Marketplace** desde el menú lateral.
  </Step>

  <Step title="Buscar Google Sheets">
    Encuentra **Google Sheets** en el catálogo y haz clic en **Conectar**.
  </Step>

  <Step title="Autorizar acceso con Google">
    Se abrirá una ventana de autorización segura de Google. Inicia sesión si hace falta y acepta los permisos solicitados.
  </Step>

  <Step title="Confirmar la instalación">
    Al volver a Brain Studio, deja finalizar el asistente hasta que la integración aparezca como **conectada**.

    <Check>
      En el **Marketplace**, Google Sheets debe mostrarse como conectada. Desde el **Canvas** puedes añadir su nodo, y en **AI Agent** → **Herramientas** puedes activarla.
    </Check>
  </Step>
</Steps>

***

## Tools disponibles

A alto nivel, las acciones se agrupan así:

* **Consultar** — obtener celdas, rangos, filas, pestañas y metadatos del libro.
* **Crear y estructurar** — crear libros/pestañas, insertar filas/columnas y mover dimensiones.
* **Actualizar datos** — agregar, editar, limpiar o hacer upsert de filas y celdas.
* **Gobierno y calidad** — validación, formato condicional, protección, comentarios y notas.

La integración expone 31 tools en Brain Studio; a continuación, cada una con propósito, inputs y ejemplo.

<AccordionGroup>
  <Accordion title="Crear columna">
    Inserta una **nueva columna** en una pestaña (suele hacerse con `InsertDimension` o peticiones equivalentes en `batchUpdate`).

    **Inputs:**

    * **spreadsheetId** (string) — ID del libro.
    * **sheetId** / **sheetName** (string) — Pestaña.
    * **startIndex** (number) — Índice donde insertar la columna.
    * **endIndex** (opcional, number) — Si se insertan varias columnas.

    **Ejemplo:**

    ```json theme={null}
    {
      "spreadsheetId": "1AbCdEfGhIjKlMnOpQrStUvWxYz",
      "sheetName": "Datos",
      "startIndex": 2,
      "dimension": "COLUMNS"
    }
    ```

    [Documentación de Google: `spreadsheets.values.batchUpdate`](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/batchUpdate) · [Solicitudes de hoja](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/batchUpdate)
  </Accordion>

  <Accordion title="Agregar regla de formato condicional">
    Añade una **regla de formato condicional** (escala de colores, `BOOLEAN`, fórmula personalizada, etc.).

    **Inputs:**

    * **spreadsheetId** (string) — ID del libro.
    * **sheetId** (number) — ID de la pestaña.
    * **rule** (objeto) — Definición de la regla (`ranges`, `booleanRule`, `gradientRule`, etc.).

    **Ejemplo:**

    ```json theme={null}
    {
      "spreadsheetId": "1AbCdEfGhIjKlMnOpQrStUvWxYz",
      "sheetId": 0,
      "rule": {
        "ranges": [{ "sheetId": 0, "startRowIndex": 1, "endRowIndex": 100, "startColumnIndex": 0, "endColumnIndex": 1 }],
        "booleanRule": {
          "condition": { "type": "NUMBER_GREATER", "values": [{ "userEnteredValue": "0" }] },
          "format": { "backgroundColor": { "red": 0.8, "green": 1, "blue": 0.8 } }
        }
      }
    }
    ```

    [Documentación de Google: `AddConditionalFormatRuleRequest`](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#AddConditionalFormatRuleRequest)
  </Accordion>

  <Accordion title="Agregar varias filas">
    **Anexa** varias filas de datos al final de una tabla (o rango) con `values.append`.

    **Inputs:**

    * **spreadsheetId** (string) — ID del libro.
    * **range** (string) — Rango base (p. ej. `Hoja1!A:C`).
    * **values** (array 2D) — Filas a añadir.
    * **valueInputOption** (opcional, enum: `RAW` | `USER_ENTERED`) — Por defecto `USER_ENTERED`.

    **Ejemplo:**

    ```json theme={null}
    {
      "spreadsheetId": "1AbCdEfGhIjKlMnOpQrStUvWxYz",
      "range": "Ventas!A:C",
      "values": [["2025-01", "Cliente A", 1500], ["2025-02", "Cliente B", 2200]],
      "valueInputOption": "USER_ENTERED"
    }
    ```

    [Documentación de Google: `spreadsheets.values.append`](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/append)
  </Accordion>

  <Accordion title="Agregar rango protegido">
    Añade un **rango protegido** con permisos de edición (`AddProtectedRange`).

    **Inputs:**

    * **spreadsheetId** (string) — ID del libro.
    * **range** (objeto) — Rango a proteger.
    * **editors** (opcional, objeto) — Usuarios o dominios con permiso de edición.

    **Ejemplo:**

    ```json theme={null}
    {
      "spreadsheetId": "1AbCdEfGhIjKlMnOpQrStUvWxYz",
      "range": {
        "sheetId": 0,
        "startRowIndex": 0,
        "endRowIndex": 1,
        "startColumnIndex": 0,
        "endColumnIndex": 5
      },
      "description": "Cabeceras"
    }
    ```

    [Documentación de Google: `AddProtectedRangeRequest`](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#AddProtectedRangeRequest)
  </Accordion>

  <Accordion title="Agregar una fila única">
    Añade **una fila** de datos; opcionalmente en un **índice** (p. ej. fila 2 tras cabeceras) desplazando el resto.

    **Inputs:**

    * **spreadsheetId** (string) — ID del libro.
    * **range** (string) — Rango destino o tabla.
    * **values** (array) — Una fila de valores.
    * **insertDataOption** (opcional, enum) — `INSERT_ROWS` u opciones de `append`.

    **Ejemplo:**

    ```json theme={null}
    {
      "spreadsheetId": "1AbCdEfGhIjKlMnOpQrStUvWxYz",
      "range": "Datos!A:D",
      "values": [["ID-99", "Nuevo", "2025-03-23", true]],
      "valueInputOption": "USER_ENTERED"
    }
    ```

    [Documentación de Google: `spreadsheets.values.append`](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/append)
  </Accordion>

  <Accordion title="Celda clara">
    Elimina el **contenido** de una celda concreta (`values.clear` sobre el rango A1 de una celda).

    **Inputs:**

    * **spreadsheetId** (string) — ID del libro.
    * **range** (string) — Celda en notación A1 (p. ej. `Hoja1!B5`).

    **Ejemplo:**

    ```json theme={null}
    {
      "spreadsheetId": "1AbCdEfGhIjKlMnOpQrStUvWxYz",
      "range": "Resumen!C10"
    }
    ```

    [Documentación de Google: `spreadsheets.values.clear`](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/clear)
  </Accordion>

  <Accordion title="Limpiar filas">
    Borra el **contenido** de una o varias filas; las filas pueden quedar vacías según la implementación.

    **Inputs:**

    * **spreadsheetId** (string) — ID del libro.
    * **range** (string) — Rango de filas (p. ej. `Hoja1!A5:Z20`).

    **Ejemplo:**

    ```json theme={null}
    {
      "spreadsheetId": "1AbCdEfGhIjKlMnOpQrStUvWxYz",
      "range": "Import!A2:Z100"
    }
    ```

    [Documentación de Google: `spreadsheets.values.clear`](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/clear)
  </Accordion>

  <Accordion title="Copiar hoja de cálculo">
    Copia una **pestaña** a otro libro de Sheets (`sheets.copyTo`).

    **Inputs:**

    * **spreadsheetId** (string) — ID del libro origen.
    * **sheetId** (number) — ID de la pestaña a copiar.
    * **destinationSpreadsheetId** (string) — ID del libro destino.

    **Ejemplo:**

    ```json theme={null}
    {
      "spreadsheetId": "1SrcBookId",
      "sheetId": 123456789,
      "destinationSpreadsheetId": "1DstBookId"
    }
    ```

    [Documentación de Google: `spreadsheets.sheets.copyTo`](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.sheets/copyTo)
  </Accordion>

  <Accordion title="Crear hoja de cálculo">
    Crea un **libro** nuevo en blanco o puede **duplicar** un libro existente según parámetros de la tool (`spreadsheets.create`).

    **Inputs:**

    * **title** (string) — Título del libro.
    * **sheets** (opcional, array) — Pestañas iniciales con `title`.
    * **sourceSpreadsheetId** (opcional, string) — Si la tool admite duplicar desde otro ID.

    **Ejemplo:**

    ```json theme={null}
    {
      "title": "Presupuesto 2025",
      "sheets": [{ "title": "Enero" }, { "title": "Febrero" }]
    }
    ```

    [Documentación de Google: `spreadsheets.create`](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/create)
  </Accordion>

  <Accordion title="Crear Hoja de Cálculo">
    Crea una **pestaña nueva** en un libro con título (suele enviarse `AddSheetRequest` dentro de `batchUpdate`).

    **Inputs:**

    * **spreadsheetId** (string) — ID del libro.
    * **title** (string) — Nombre de la nueva pestaña.

    **Ejemplo:**

    ```json theme={null}
    {
      "spreadsheetId": "1AbCdEfGhIjKlMnOpQrStUvWxYz",
      "title": "Backup Q1"
    }
    ```

    [Documentación de Google: `AddSheetRequest`](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#AddSheetRequest) · [`batchUpdate`](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/batchUpdate)
  </Accordion>

  <Accordion title="Eliminar regla de formato condicional">
    Elimina una regla de formato condicional por **índice**.

    **Inputs:**

    * **spreadsheetId** (string) — ID del libro.
    * **sheetId** (number) — ID de pestaña.
    * **index** (number) — Índice de la regla a eliminar.

    **Ejemplo:**

    ```json theme={null}
    {
      "spreadsheetId": "1AbCdEfGhIjKlMnOpQrStUvWxYz",
      "sheetId": 0,
      "index": 0
    }
    ```

    [Documentación de Google: `DeleteConditionalFormatRuleRequest`](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#DeleteConditionalFormatRuleRequest)
  </Accordion>

  <Accordion title="Eliminar Filas">
    **Elimina** filas del documento (`DeleteDimension` en filas).

    **Inputs:**

    * **spreadsheetId** (string) — ID del libro.
    * **sheetId** (number) — Pestaña.
    * **startIndex** (number) — Primera fila a eliminar (0-based).
    * **endIndex** (number) — Fila final (exclusiva).

    **Ejemplo:**

    ```json theme={null}
    {
      "spreadsheetId": "1AbCdEfGhIjKlMnOpQrStUvWxYz",
      "sheetId": 0,
      "dimension": "ROWS",
      "startIndex": 5,
      "endIndex": 8
    }
    ```

    [Documentación de Google: `DeleteDimensionRequest`](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#deletedimensionrequest)
  </Accordion>

  <Accordion title="Eliminar hoja">
    Elimina una **pestaña** del libro (`DeleteSheetRequest` vía `batchUpdate`).

    **Inputs:**

    * **spreadsheetId** (string) — ID del libro.
    * **sheetId** (number) — ID de la pestaña a eliminar.

    **Ejemplo:**

    ```json theme={null}
    {
      "spreadsheetId": "1AbCdEfGhIjKlMnOpQrStUvWxYz",
      "sheetId": 987654321
    }
    ```

    [Documentación de Google: `DeleteSheetRequest`](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#DeleteSheetRequest)
  </Accordion>

  <Accordion title="Buscar Fila">
    Busca una o más **filas** donde una columna coincide con un valor (lectura con `values.get` / filtrado en el flujo).

    **Inputs:**

    * **spreadsheetId** (string) — ID del libro.
    * **range** (string) — Rango a escanear.
    * **column** (string o number) — Columna clave.
    * **value** (string) — Valor buscado.

    **Ejemplo:**

    ```json theme={null}
    {
      "spreadsheetId": "1AbCdEfGhIjKlMnOpQrStUvWxYz",
      "range": "Clientes!A2:D",
      "column": "A",
      "value": "CLI-1001"
    }
    ```

    [Documentación de Google: `spreadsheets.values.get`](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/get)
  </Accordion>

  <Accordion title="Obtener Celda">
    Obtiene el **valor** mostrado o introducido por el usuario de una celda (`values.get` en rango A1 de una celda).

    **Inputs:**

    * **spreadsheetId** (string) — ID del libro.
    * **range** (string) — Celda (p. ej. `Hoja1!B2`).

    **Ejemplo:**

    ```json theme={null}
    {
      "spreadsheetId": "1AbCdEfGhIjKlMnOpQrStUvWxYz",
      "range": "Totales!E4"
    }
    ```

    [Documentación de Google: `spreadsheets.values.get`](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/get)
  </Accordion>

  <Accordion title="Obtener usuario actual">
    Obtiene metadatos del usuario autenticado mediante **`about.get`** de Drive: nombre, correo, cuota, etc.

    **Inputs:**

    * **fields** (opcional, string) — Campos (`user`, `storageQuota`, …).

    **Ejemplo:**

    ```json theme={null}
    {
      "fields": "user,storageQuota"
    }
    ```

    [Documentación de Google: `about.get` (Drive)](https://developers.google.com/drive/api/v3/reference/about/get)
  </Accordion>

  <Accordion title="Obtener hoja de cálculo por ID">
    Devuelve el **recurso** del libro: pestañas, propiedades, nombres (`spreadsheets.get`).

    **Inputs:**

    * **spreadsheetId** (string) — ID del libro.
    * **ranges** (opcional, array de string) — Rangos para devolver también datos parciales si la tool lo permite.
    * **includeGridData** (opcional, boolean) — Incluir datos de cuadrícula.

    **Ejemplo:**

    ```json theme={null}
    {
      "spreadsheetId": "1AbCdEfGhIjKlMnOpQrStUvWxYz",
      "includeGridData": false
    }
    ```

    [Documentación de Google: `spreadsheets.get`](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/get)
  </Accordion>

  <Accordion title="Obtener valores en rango">
    Lee **todos los valores** de un rango en notación A1 (`values.get`).

    **Inputs:**

    * **spreadsheetId** (string) — ID del libro.
    * **range** (string) — Rango (p. ej. `Ventas!A1:F100`).
    * **majorDimension** (opcional, enum: `ROWS` | `COLUMNS`) — Orientación.

    **Ejemplo:**

    ```json theme={null}
    {
      "spreadsheetId": "1AbCdEfGhIjKlMnOpQrStUvWxYz",
      "range": "Inventario!A2:E500",
      "majorDimension": "ROWS"
    }
    ```

    [Documentación de Google: `spreadsheets.values.get`](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/get)
  </Accordion>

  <Accordion title="Insertar una nota anclada">
    Inserta una **nota** (comentario legacy de celda) en una celda (`SetCellNote` / peticiones en `batchUpdate`).

    **Inputs:**

    * **spreadsheetId** (string) — ID del libro.
    * **sheetId** (number) — Pestaña.
    * **row** (number) — Fila (0-based).
    * **column** (number) — Columna (0-based).
    * **note** (string) — Texto de la nota.

    **Ejemplo:**

    ```json theme={null}
    {
      "spreadsheetId": "1AbCdEfGhIjKlMnOpQrStUvWxYz",
      "sheetId": 0,
      "row": 3,
      "column": 1,
      "note": "Revisar con finanzas"
    }
    ```

    [Documentación de Google: `spreadsheets.batchUpdate`](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/batchUpdate)
  </Accordion>

  <Accordion title="Insertar comentario">
    Inserta un **comentario** en el archivo (API de comentarios de **Drive** sobre el recurso del spreadsheet).

    **Inputs:**

    * **fileId** (string) — ID del libro (mismo que spreadsheetId).
    * **content** (string) — Texto del comentario.
    * **anchor** (opcional, objeto) — Anclaje si la tool lo expone.

    **Ejemplo:**

    ```json theme={null}
    {
      "fileId": "1AbCdEfGhIjKlMnOpQrStUvWxYz",
      "content": "Comentario general sobre el modelo"
    }
    ```

    [Documentación de Google: `comments.create` (Drive)](https://developers.google.com/drive/api/v3/reference/comments/create)
  </Accordion>

  <Accordion title="Insertar Dimensión">
    Inserta **filas o columnas** vacías (`InsertDimension`).

    **Inputs:**

    * **spreadsheetId** (string) — ID del libro.
    * **sheetId** (number) — Pestaña.
    * **dimension** (enum: `ROWS` | `COLUMNS`) — Tipo.
    * **startIndex** / **endIndex** (number) — Posición e intervalo.

    **Ejemplo:**

    ```json theme={null}
    {
      "spreadsheetId": "1AbCdEfGhIjKlMnOpQrStUvWxYz",
      "sheetId": 0,
      "dimension": "ROWS",
      "startIndex": 2,
      "endIndex": 3
    }
    ```

    [Documentación de Google: `InsertDimensionRequest`](https://developers.google.com/workspace/sheets/api/reference/rest/v4/spreadsheets/request#InsertDimensionRequest)
  </Accordion>

  <Accordion title="Listar hojas de cálculo">
    Lista las **pestañas** de un libro (`spreadsheets.get` → `sheets[]`).

    **Inputs:**

    * **spreadsheetId** (string) — ID del libro.

    **Ejemplo:**

    ```json theme={null}
    {
      "spreadsheetId": "1AbCdEfGhIjKlMnOpQrStUvWxYz"
    }
    ```

    [Documentación de Google: `spreadsheets.get`](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/get)
  </Accordion>

  <Accordion title="Combinar celdas">
    **Fusiona** un rango rectangular (`MergeCells`).

    **Inputs:**

    * **spreadsheetId** (string) — ID del libro.
    * **range** (objeto) — `sheetId`, `startRowIndex`, `endRowIndex`, `startColumnIndex`, `endColumnIndex`.
    * **mergeType** (opcional, enum) — Tipo de fusión.

    **Ejemplo:**

    ```json theme={null}
    {
      "spreadsheetId": "1AbCdEfGhIjKlMnOpQrStUvWxYz",
      "range": {
        "sheetId": 0,
        "startRowIndex": 0,
        "endRowIndex": 1,
        "startColumnIndex": 0,
        "endColumnIndex": 4
      },
      "mergeType": "MERGE_ALL"
    }
    ```

    [Documentación de Google: `MergeCellsRequest`](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#MergeCellsRequest)
  </Accordion>

  <Accordion title="Mover Dimensión">
    **Mueve** un bloque de filas o columnas (`MoveDimension`).

    **Inputs:**

    * **spreadsheetId** (string) — ID del libro.
    * **sheetId** (number) — Pestaña.
    * **dimension** (enum: `ROWS` | `COLUMNS`) — Tipo.
    * **sourceIndex** / **destinationIndex** (number) — Origen y destino según la API.

    **Ejemplo:**

    ```json theme={null}
    {
      "spreadsheetId": "1AbCdEfGhIjKlMnOpQrStUvWxYz",
      "sheetId": 0,
      "dimension": "ROWS",
      "sourceIndex": 10,
      "destinationIndex": 2
    }
    ```

    [Documentación de Google: `MoveDimensionRequest`](https://developers.google.com/workspace/sheets/api/reference/rest/v4/spreadsheets/request#MoveDimensionRequest)
  </Accordion>

  <Accordion title="Configurar validación de datos">
    Añade **validación de datos** (listas, números, fechas, casillas) con `SetDataValidation`.

    **Inputs:**

    * **spreadsheetId** (string) — ID del libro.
    * **range** (objeto) — Rango objetivo.
    * **rule** (objeto) — Regla (`condition`, `showCustomUi`, etc.).

    **Ejemplo:**

    ```json theme={null}
    {
      "spreadsheetId": "1AbCdEfGhIjKlMnOpQrStUvWxYz",
      "range": { "sheetId": 0, "startRowIndex": 1, "endRowIndex": 100, "startColumnIndex": 2, "endColumnIndex": 3 },
      "rule": {
        "condition": { "type": "ONE_OF_LIST", "values": [{ "userEnteredValue": "Sí" }, { "userEnteredValue": "No" }] },
        "strict": true,
        "showCustomUi": true
      }
    }
    ```

    [Documentación de Google: `SetDataValidationRequest`](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#SetDataValidationRequest)
  </Accordion>

  <Accordion title="Actualizar Celda">
    Escribe el valor de **una celda** (`values.update` en rango de una celda).

    **Inputs:**

    * **spreadsheetId** (string) — ID del libro.
    * **range** (string) — Celda A1.
    * **values** (array 2D de 1×1) — Valor.
    * **valueInputOption** (opcional, enum) — `USER_ENTERED` por defecto.

    **Ejemplo:**

    ```json theme={null}
    {
      "spreadsheetId": "1AbCdEfGhIjKlMnOpQrStUvWxYz",
      "range": "Control!B1",
      "values": [["Actualizado"]],
      "valueInputOption": "USER_ENTERED"
    }
    ```

    [Documentación de Google: `spreadsheets.values.update`](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/update)
  </Accordion>

  <Accordion title="Actualizar regla de formato condicional">
    Modifica una regla de formato condicional existente (`UpdateConditionalFormatRule`).

    **Inputs:**

    * **spreadsheetId** (string) — ID del libro.
    * **sheetId** (number) — Pestaña.
    * **index** (number) — Índice de la regla.
    * **rule** (objeto) — Nueva definición.

    **Ejemplo:**

    ```json theme={null}
    {
      "spreadsheetId": "1AbCdEfGhIjKlMnOpQrStUvWxYz",
      "sheetId": 0,
      "index": 0,
      "rule": { "ranges": [], "booleanRule": {} }
    }
    ```

    [Documentación de Google: `UpdateConditionalFormatRuleRequest`](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#UpdateConditionalFormatRuleRequest)
  </Accordion>

  <Accordion title="Actualizar Formato">
    Actualiza **formato** de celdas (fuente, colores, bordes, números) con `RepeatCell` / `UpdateCells` en `batchUpdate`.

    **Inputs:**

    * **spreadsheetId** (string) — ID del libro.
    * **range** (objeto) — Rango.
    * **format** (objeto) — `userEnteredFormat` (texto, fondo, bordes).

    **Ejemplo:**

    ```json theme={null}
    {
      "spreadsheetId": "1AbCdEfGhIjKlMnOpQrStUvWxYz",
      "range": { "sheetId": 0, "startRowIndex": 0, "endRowIndex": 1, "startColumnIndex": 0, "endColumnIndex": 5 },
      "format": {
        "userEnteredFormat": {
          "textFormat": { "bold": true },
          "backgroundColor": { "red": 0.9, "green": 0.9, "blue": 0.9 }
        }
      }
    }
    ```

    [Documentación de Google: formato (ejemplos)](https://developers.google.com/workspace/sheets/api/samples/formatting)
  </Accordion>

  <Accordion title="Actualizar varias filas">
    Actualiza un **bloque de filas** con `values.update` en un rango rectangular.

    **Inputs:**

    * **spreadsheetId** (string) — ID del libro.
    * **range** (string) — Rango (p. ej. `Hoja1!A2:D10`).
    * **values** (array 2D) — Matriz de valores.
    * **valueInputOption** (opcional, enum) — `USER_ENTERED`.

    **Ejemplo:**

    ```json theme={null}
    {
      "spreadsheetId": "1AbCdEfGhIjKlMnOpQrStUvWxYz",
      "range": "Datos!A2:C5",
      "values": [["a", "b", "c"], ["d", "e", "f"]],
      "valueInputOption": "USER_ENTERED"
    }
    ```

    [Documentación de Google: `spreadsheets.values.update`](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/update)
  </Accordion>

  <Accordion title="Actualizar fila">
    Actualiza **una fila** concreta (un rango de una fila).

    **Inputs:**

    * **spreadsheetId** (string) — ID del libro.
    * **range** (string) — P. ej. `Hoja1!A5:Z5`.
    * **values** (array 2D de una fila) — Valores.

    **Ejemplo:**

    ```json theme={null}
    {
      "spreadsheetId": "1AbCdEfGhIjKlMnOpQrStUvWxYz",
      "range": "Pedidos!A10:E10",
      "values": [["PED-99", "Enviado", "2025-03-23", 0, "OK"]],
      "valueInputOption": "USER_ENTERED"
    }
    ```

    [Documentación de Google: `spreadsheets.values.update`](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/update)
  </Accordion>

  <Accordion title="Insertar o actualizar fila">
    **Inserta** una fila nueva o **actualiza** si ya existe según criterios (patrón `append` + lógica de negocio o `update`).

    **Inputs:**

    * **spreadsheetId** (string) — ID del libro.
    * **range** (string) — Tabla o rango.
    * **values** (array) — Fila de datos.
    * **keyColumn** (opcional, string) — Columna de clave para decidir upsert.

    **Ejemplo:**

    ```json theme={null}
    {
      "spreadsheetId": "1AbCdEfGhIjKlMnOpQrStUvWxYz",
      "range": "CRM!A:D",
      "keyColumn": "A",
      "values": [["CLI-001", "Ana", "activo", "2025-03-23"]]
    }
    ```

    [Documentación de Google: `spreadsheets.values.append`](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/append)
  </Accordion>
</AccordionGroup>

***

## Cómo usar en Brain

Una vez conectada, puedes usar **Google Sheets** en dos superficies:

### En AI Agent

Ideal cuando el usuario quiere consultar, insertar o actualizar filas en lenguaje natural.

<Steps>
  <Step title="Abre el nodo AI Agent">
    En el Canvas, selecciona o añade el nodo **AI Agent**.
  </Step>

  <Step title="Abre Herramientas">
    En el panel derecho, entra a la pestaña **Herramientas**.
  </Step>

  <Step title="Agrega Google Sheets">
    Usa **Agregar tool**, busca **Google Sheets** y actívala.
  </Step>

  <Step title="Configura las tools">
    Elige integración completa o activa solo las acciones que necesites. Ajusta el prompt para confirmar libro, pestaña y rango antes de escribir y para pedir validación si una operación puede sobrescribir datos.

    <Check>
      **Google Sheets** aparece en la lista de herramientas del agente y puedes abrir su configuración con el icono de ajustes.
    </Check>
  </Step>
</Steps>

El agente decidirá automáticamente cuándo leer o escribir en el libro según la conversación.

### En Canvas

Ideal cuando necesitas control total del flujo (por ejemplo: buscar fila → validar → insertar o actualizar → siguiente paso).

<Steps>
  <Step title="Arrastra Google Sheets al Canvas">
    En el panel lateral, abre **Marketplace** y arrastra **Google Sheets** al flujo.
  </Step>

  <Step title="Selecciona la tool">
    Con el nodo seleccionado, en **Tools** elige la acción (por ejemplo **Insertar o actualizar fila**).
  </Step>

  <Step title="Configura el cuerpo y la memoria">
    Completa el JSON del cuerpo de la petición y, si aplica, **Guardar respuesta** en una variable de memoria.
  </Step>

  <Step title="Conecta el flujo">
    Enlaza las salidas **Finalizó la tarea** y **Hubo un error** con los nodos siguientes.

    <Check>
      El nodo queda listo para ejecutarse en el orden definido por tu flujo.
    </Check>
  </Step>
</Steps>

**Ejemplo de configuración:**

El editor del nodo muestra un cuerpo JSON alineado con la tool **Insertar o actualizar fila**. Ajusta `spreadsheetId`, `range`, `keyColumn` y `values` según tu libro y columnas.

```json theme={null}
{
  "spreadsheetId": "{{$memory.spreadsheet_id}}",
  "range": "Leads!A:D",
  "keyColumn": "A",
  "values": [["{{$memory.lead_id}}", "{{$memory.nombre}}", "{{$memory.estado}}", "{{$memory.fecha}}"]]
}
```

***

## Casos de uso

<AccordionGroup>
  <Accordion title="Registro de leads en tiempo real desde WhatsApp">
    Cada interacción comercial deja la hoja actualizada sin que nadie tenga que transcribir datos manualmente.

    **Ejemplo concreto:** un equipo de ventas inbound recibe consultas por WhatsApp. El flujo busca si el lead ya existe por teléfono. Si no existe, inserta una fila con nombre, empresa, canal y fecha. Si ya existe, actualiza la columna de “última interacción”. El equipo comercial abre la hoja y ve todos los leads del día, sin duplicados ni huecos.

    **Ideal para:** ventas inbound, SDRs y agencias con alto volumen de chat que no tienen CRM formal.
  </Accordion>

  <Accordion title="Tablero operativo con estados sincronizados">
    Una fila por cliente con columnas de estado que se actualizan desde los flujos: cita agendada, pago confirmado, documento enviado. El equipo solo actúa sobre las excepciones.

    **Ejemplo concreto:** una empresa de implementación usa una hoja con columnas de estado por etapa. Cuando el flujo agenda una cita en Google Calendar, actualiza la columna “Cita” a “Confirmada”. Cuando se envía un documento por Gmail, actualiza “Documento” a “Enviado”. El manager abre la hoja y ve de un vistazo quién está bloqueado y quién avanza.

    **Ideal para:** operaciones, implementación y servicios con SLA que necesitan visibilidad sin montar un dashboard complejo.
  </Accordion>

  <Accordion title="Hoja como cola de tareas entre integraciones">
    Sheets puede funcionar como una cola auditable donde cada fila es un caso pendiente. El flujo lee las filas con estado “pendiente”, ejecuta las acciones en otras integraciones y escribe el resultado de vuelta.

    **Ejemplo concreto:** una empresa de backoffice tiene una hoja con facturas por emitir. Cada fila tiene cliente, monto y estado. El flujo lee las filas pendientes, emite la factura en Alegra o Facturama, y actualiza la columna de estado a “Emitida” con el timestamp. El equipo no técnico puede revisar el avance sin tocar la automatización.

    **Ideal para:** automatización mid-market, backoffice con varias APIs y equipos que necesitan un proceso auditable sin montar infraestructura.
  </Accordion>
</AccordionGroup>

***

## Integraciones que combinan bien con Google Sheets

<AccordionGroup>
  <Accordion title="Google Drive">
    Cuando el flujo sube o genera un archivo en Drive, puede registrar el `fileId`, el enlace y el estado del documento como columna en la hoja operativa. Todo queda trazado en un solo lugar.

    **Flujo combinado:** archivo subido a Drive → nueva columna en Sheets con enlace y fecha.

    [Documentación de Google Drive](/guides/integraciones/productividad/google-drive)
  </Accordion>

  <Accordion title="Gmail">
    Cada correo enviado o recibido relevante puede quedar como fila en Sheets: destinatario, asunto, fecha y estado. Útil como log de comunicaciones o seguimiento comercial.

    **Flujo combinado:** correo enviado vía Gmail → fila en Sheets con destinatario, asunto y timestamp.

    [Documentación de Gmail](/guides/integraciones/productividad/gmail)
  </Accordion>

  <Accordion title="Google Calendar">
    El flujo puede sincronizar citas con columnas de estado en la hoja: cita agendada, confirmada, cancelada o completada, con la fecha y hora del evento.

    **Flujo combinado:** evento creado en Google Calendar → columna “Cita” actualizada en Sheets con fecha y estado.

    [Documentación de Google Calendar](/guides/integraciones/agendamiento/google-calendar)
  </Accordion>

  <Accordion title="CRM (HubSpot / Pipedrive)">
    Para forecast, priorización o comités, el flujo puede exportar etapas del pipeline, leads recientes o tareas pendientes del CRM a una hoja compartida con management.

    **Flujo combinado:** consultar ofertas activas en HubSpot → actualizar hoja de forecast semanal en Sheets.

    [Documentación de HubSpot](/guides/integraciones/crm/hubspot)

    [Documentación de Pipedrive](/guides/integraciones/crm/pipedrive)
  </Accordion>
</AccordionGroup>

***

## Artículos relacionados

<CardGroup cols={2}>
  <Card title="Integraciones" href="/guides/integraciones/integraciones" icon="grid">
    Catálogo de integraciones disponibles en el Marketplace.
  </Card>

  <Card title="Cómo usar integraciones en Brain" href="/guides/integraciones/como-usar-integraciones-en-brain" icon="book-open">
    Flujo general para instalar y usar integraciones en Brain Studio.
  </Card>
</CardGroup>
