# API de JavaScript

Varios bloques del chatbot ejecutan tu código JavaScript. El código hace cálculos, procesa las respuestas de servicios externos, cambia las variables y etiquetas del contacto, envía mensajes y decide hacia dónde sigue el flujo. Esta sección es una referencia para quien escribe ese código.

## Dónde se ejecuta el código

| Dónde | Cuándo se inicia el código | Qué puede usar además de las funciones |
|---|---|---|
| El bloque [«Intérprete de JavaScript»](https://support.jetbot24.ru/es/chatbots/blocks/developer/javascript) | El contacto ha llegado al bloque | Los datos del contacto |
| El bloque [«Solicitud HTTP»](https://support.jetbot24.ru/es/chatbots/blocks/developer/http), el campo «Procesar la respuesta con JavaScript» | El servidor ha respondido a la solicitud | Los datos del contacto y la respuesta del servidor `response` |
| El bloque [«Webhook entrante»](https://support.jetbot24.ru/es/chatbots/blocks/developer/incoming-webhook) | Ha llegado una solicitud a la dirección del bloque | La solicitud `request` y los datos del contacto, una vez que el código encuentra al contacto |
| El bloque [«Leer filas de Google Sheets»](https://support.jetbot24.ru/es/chatbots/blocks/lists/google-sheet-reader), el campo «JavaScript para procesar la tabla» | El bloque ha encontrado filas en la hoja | Los datos del contacto y las filas encontradas, `sheet.data` |

Qué contienen estos datos se describe en la página [«Variables integradas»](https://support.jetbot24.ru/es/api/javascript/builtins). Las funciones son las mismas en todos los bloques:

| Página | Funciones |
|---|---|
| [Variables](https://support.jetbot24.ru/es/api/javascript/variables) | `getContactVariable`, `setContactVariable`, `deleteContactVariable`, `getGlobalVariable`, `setGlobalVariable`, `deleteGlobalVariable` |
| [Etiquetas](https://support.jetbot24.ru/es/api/javascript/tags) | `getContactTags`, `hasContactTag`, `setContactTag`, `deleteContactTag` |
| [Mensajes y saltos](https://support.jetbot24.ru/es/api/javascript/messages) | `sendMessage`, `goToBlock`, `disableContinue` |
| [Elegir un contacto](https://support.jetbot24.ru/es/api/javascript/contact) | `setContactById` y otras, solo en el bloque «Webhook entrante» |
| [Firmas y Base64](https://support.jetbot24.ru/es/api/javascript/crypto) | `hash_hmac`, `base64_encode`, `base64_decode` |

## Cómo se ejecuta el código

1. El código se ejecuta entero en un servidor aparte. Las funciones no cambian al contacto de inmediato; anotan qué hacer: qué variables y etiquetas escribir, qué mensajes enviar, a qué bloque ir.
2. El código terminó sin error: el bot escribe las variables y etiquetas del contacto y las variables globales del bot y luego, en el orden de las llamadas, envía los mensajes y lleva al contacto al bloque de `goToBlock`. Después se activa la conexión «Continuar», salvo que el código la haya desactivado.
3. El código terminó con un error: no se aplica nada, ni siquiera lo que el código llamó antes del error.

Dentro de una misma ejecución, las funciones de lectura ya ven lo que el código escribió antes: después de `setContactVariable('bouquet', 'Rosas')`, una llamada a `getContactVariable('bouquet')` devuelve `'Rosas'`, aunque la variable todavía no se haya escrito en el contacto.

El código se inicia de nuevo cada vez que se pasa por el bloque. Las variables normales de JavaScript (`var`) no se conservan entre ejecuciones: escribe lo que haya que recordar en las variables del contacto o en las variables globales del bot.

## Lenguaje

El código se ejecuta como JavaScript del estándar ES5. De los estándares más recientes falta lo siguiente:

- `let` y `const`: declara las variables con `var`;
- funciones flecha: escribe `function (x) { return x * 2; }`;
- plantillas literales entre comillas invertidas: une las cadenas con `+`;
- clases, desestructuración, `Promise`, `async`/`await`, `setTimeout`;
- métodos de estándares más recientes: `includes`, `startsWith`, `padStart`, `find`, `Object.assign`, `Array.from` y similares. Usa `indexOf` en lugar de `includes` y `startsWith`.

Todo lo de ES5 está disponible: `JSON.parse` y `JSON.stringify`, `Math`, `Date`, los métodos de cadenas y arrays `split`, `replace`, `trim`, `map`, `filter`, `forEach`, `reduce`, `indexOf`, `sort`. La directiva `'use strict'` no hace daño, pero no activa el modo estricto.

El código no puede hacer solicitudes de red: `fetch`, `XMLHttpRequest` y `require` no están disponibles. Para las solicitudes, usa el bloque «Solicitud HTTP».

### Fechas

`Date` cuenta el tiempo en la zona horaria del servidor, así que para los cálculos usa los métodos `UTC`: `getUTCHours()`, `getUTCDate()`. `Date` no interpreta una cadena como `2026-01-31 12:00:00` (así es `created_at`): reemplaza el espacio por `T` y añade `Z`:

```js
var created = new Date(created_at.replace(' ', 'T') + 'Z');
var days = Math.floor((new Date() - created) / 86400000);
```

### Expresiones regulares

Las expresiones regulares se ejecutan con el motor RE2, y algunas funciones de JavaScript no funcionan en él. El código con uno de estos patrones se detiene con el error `Invalid regular expression`:

| Patrón | Qué es |
|---|---|
| `(?=...)`, `(?!...)` | Búsqueda hacia delante (lookahead) |
| `(?<=...)`, `(?<!...)` | Búsqueda hacia atrás (lookbehind) |
| `\1`, `\2` | Referencias inversas a un grupo |

`\w`, `\b` y `\d` solo entienden letras latinas sin acento y dígitos: `/\w+/` no encontrará una palabra escrita en cirílico o con letras acentuadas, como «canción». Para esas letras, enuméralas explícitamente: `/[a-záéíóúüñ]+/i`.

## Límites

| Qué | Límite |
|---|---|
| Longitud del código | 16 384 caracteres en cada campo de código |
| Tiempo de ejecución | 5 segundos. El código que no termina a tiempo se detiene con el error `Script execution time exceeded` |
| `sendMessage` | 10 mensajes por ejecución |
| `goToBlock` | Una llamada por ejecución |
| Funciones de búsqueda de contacto | Una llamada por solicitud, solo en el bloque «Webhook entrante» |

## Errores y depuración

Lo que pasó durante una ejecución se muestra en el «Registro de ejecución» de la configuración del bloque: el código fuente, el valor de la última expresión, las acciones realizadas y el texto del error.

El valor de la última expresión es la principal herramienta de depuración. Añade el nombre de una variable o una expresión al final del código y su valor aparecerá en el registro. Convierte antes un objeto o un array en cadena; si no, el registro muestra `[object Object]`:

```js
var bouquet = { name: 'Rosas', count: 7 };
JSON.stringify(bouquet);
```

`console.log` no provoca un error, pero no escribe nada en el registro.

Adónde va un error depende del bloque:

| Bloque | Qué pasa con un error |
|---|---|
| «Intérprete de JavaScript» | El texto del error se envía al contacto en el chat y se activa la conexión «Continuar» |
| «Solicitud HTTP» | El texto del error se envía al contacto en el chat y la conexión «Continuar» no se activa |
| «Leer filas de Google Sheets» | El texto del error se envía al contacto en el chat y la conexión «Continuar» no se activa |
| «Webhook entrante» | No se envía nada al contacto; el bloque responde a la solicitud con el código `422` y el texto del error |

En un mensaje de error de sintaxis, el número de línea es uno más que en el editor: el error `Line 4:5 Unexpected identifier` significa la línea cuatro menos uno, es decir, la línea tres.

También puedes provocar un error a propósito: `throw new Error('Sin precio')` detiene el código, y no se guarda nada de lo que hizo. En los bloques que envían el texto del error al chat, el contacto ve `Error: Sin precio`.

> [!TIP]
> Prueba el código en la vista previa del bot, con el botón «Probar el bot» del constructor. Así el error lo ves tú y no tus clientes.
