code.javascript ejecuta un script en un entorno aislado. Úsalo para transformar datos, validar, armar payloads o integrar fuentes que no cubre un HTTP simple.
Campos del paso
Contrato de ejecución
- La API resuelve plantillas en
input. - El sandbox recibe ese objeto como global
input. - Tu código debe asignar
output = .... - Ese
outputes la salida del paso (yresponse.bodyparacapture).
input y pasar datos entre pasos.
Pasar variables desde un paso anterior
Declara eninput lo que necesitas del trigger, de context o de steps.<n>.output. Luego léelo como input.* en el script.
- Asigna
output = { ... }. - En el paso siguiente usa
{{steps.N.output.<campo>}}, o - Declara
capturey lee{{context.<clave>}}.
Objetos y APIs disponibles
Zona horaria
- Trigger
cron:DateTime.now()usa latimezonedel trigger. - Otros triggers (p. ej. webhook): la zona efectiva es
UTC.
Buen ejemplo: normalizar y validar
Buen ejemplo: llamar una API con fetch
token, referencia y monto por input con plantillas; no los incrustes en code.
Reutilizar archivos de pasos anteriores
Consulta Archivos entre pasos para ver el contrato completo, límites y un ejemplo GNP → JavaScript. Los archivos de los pasos anteriores están disponibles automáticamente. No necesitas agregarlos alinput:
Para crear un JSON o XML:
Detener el flujo con workflow.stop
Llama workflow.stop(motivo?) para terminar la ejecución al acabar este paso. La
ejecución queda como exitosa y los pasos siguientes aparecen con estado
skipped (Omitido). El detalle de la ejecución muestra stoppedAtStepIndex y
stopReason.
workflow.stop()sólo marca la ejecución; el código sigue hasta terminar o hasta unreturn.- Para salir en ese momento usa
return valor: el valor que regreses es eloutputdel paso. Unreturn;vacío deja eloutputsin valor. - Para fallar el paso usa
throw new Error(...);workflow.stop()es para terminar sin error.
Enviar y leer correos con gmail
Declara gmailCredentialKey en el paso para habilitar el global gmail con esa
cuenta. Igual que Enviar correo con Gmail,
guardar o publicar una automatización con Gmail requiere permisos de
administrador y una cuenta conectada.
La cuenta va en gmailCredentialKey. El objeto de gmail.send() es solo el
mensaje: los campos, la respuesta en hilo y los adjuntos están en
Campos del mensaje. Las
plantillas {{...}} se resuelven en input; dentro de code lee input.*.
La comparación entre el paso y esta función está en
Elige la interfaz.
gmail.send(message) envía el mensaje del paso gmail.send. La cuenta queda
fuera de ese objeto. El correo enviado no vuelve a disparar
Nuevo correo en Gmail:
el trigger ignora los mensajes de la cuenta conectada.
Devuelve
{ messageId, threadId, idempotentReplay }. Guarda messageId si un
seguimiento posterior debe responder en el mismo hilo.
gmail.getThread(threadId) lee el hilo desde Gmail y devuelve
{ id, messages: [{ id, from, to, cc, subject, text, snippet, internalDate, attachmentNames }] },
del mensaje más antiguo al más reciente.
Analizar adjuntos con files.analyze
files.analyze({ storagePath, instructions?, schema? }) lee un adjunto de un
trigger Gmail y lo analiza con IA. Acepta PDF,
DOCX e imágenes (JPEG, PNG, WEBP, GIF) de hasta 25 MB.
- Sin
schemadevuelve{ text }con un resumen estructurado; conschema(un objeto JSON Schema contype: "object") devuelve{ data }. - También devuelve
filename,mimeTypeycached. El resultado se guarda: analizar otra vez el mismo archivo con las mismas instrucciones y esquema no vuelve a llamar al modelo.
Guardar un archivo en un tablero
files.open(ref) acepta tanto un WorkflowFileRef como el objeto de un adjunto
Gmail. El file handle puede guardar el binario real en un campo files; no
necesitas descargarlo, subir multipart ni usar una API key.
files, y que cumpla MIME, tamaño y
maxFiles. Si el paso se reintenta, devuelve el mismo archivo sin duplicarlo.
storagePathsólo acepta adjuntos Gmail del mismo tenant.
Ejemplo: responder a una aseguradora
Automatización con triggergmail_email_received. input recibe
{{trigger.body.message.threadId}}, {{trigger.body.message.id}},
{{trigger.body.message.from}}, {{trigger.body.message.attachments}} y tu API
key y tablero de solicitudes:
fetch.
En una automatización de seguimiento, guarda el messageId del primer
gmail.send y úsalo como replyToMessageId en cada seguimiento.
Buen ejemplo: fechas con DateTime
Malos ejemplos
No asignar output
output, el paso no deja un resultado útil para pasos siguientes ni para capture.
Usar require o APIs de sistema
require, process, ni acceso al sistema de archivos del runner. Usa input, fetch/axios, mysql o sftp.
Leer el trigger directo sin pasarlo por input
trigger no existe como global. Declara "referencia": "{{trigger.body.referencia}}" en input y usa input.referencia.
Mutar estado “global” entre pasos
output + capture/context o con el input del siguiente paso.
MySQL (opcional)
input (idealmente desde el body del webhook o un secreto que tú controles en tu integración). No hardcodees credenciales en code.
SFTP (opcional)
Límites prácticos
- El script corre con
"use strict". - Usa
throw new Error("...")para fallar el paso con un mensaje claro. - Los
console.*se recortan si son muy grandes; no uses logs para transportar el resultado final: usaoutput. - Prefiere pasos cortos y deterministas; deja esperas largas al paso Esperar.

