
gmail_email_received para iniciar una automatización cuando llega un
mensaje nuevo a Gmail. Conecta primero la cuenta desde Configuración →
Credenciales.
Configuración
Cada trigger escucha una sola cuenta. Copia el ID desde Configuración →
Credenciales y úsalo al crear la definición por API.
Correos que no disparan el trigger
El trigger solo inicia una automatización cuando llega un correo de otra persona. Ignora el mensaje silabelIds incluye SENT, o si from es la
cuenta conectada (accountEmail), aunque el mensaje también esté en
INBOX.
Por eso un flujo que responde al remitente no se vuelve a disparar con el
correo que acaba de enviar. Un mensaje nuevo de otro remitente, en el mismo
hilo o en otro, sí inicia otra ejecución.
Datos disponibles en los pasos
Antes de cada paso,{{trigger.body...}} incluye el cuerpo, los adjuntos y el
hilo. Compara remitentes y asuntos contra estos valores.
accountEmail es el correo de la cuenta conectada, en texto plano.
connectionId repite credentialKey. occurredAt y message.internalDate
son milisegundos desde epoch. Si el mensaje trae internalDate, occurredAt
usa ese valor. eventId evita procesar dos veces el mismo mensaje: tres
partes separadas por :, la cuenta, credentialKey y message.id.
En el primer mensaje de un hilo,
message.id, message.threadId y
thread.id pueden ser el mismo valor. En una respuesta, threadId sigue
siendo el del primer mensaje y message.id cambia. Trátalos como
identificadores distintos que a veces coinciden.thread.messages trae cabeceras, text, html,
attachmentNames y attachments cuando existen. contentRef y
threadMessageCount solo están en el mensaje que disparó la automatización.
Si no hay archivos, attachments es [], attachmentNames es [] y
hasAttachments es false.
Metadatos que también pueden venir
Además de cabeceras, cuerpo y adjuntos, el mensaje puede incluir estos campos. Úsalos si los necesitas; si tu paso no depende de ellos, ignóralos. No sustituyen atext, html o thread.
El evento también incluye
tenantId. Déjalo fuera de la lógica del paso.
Lo que ves al consultar la ejecución
Los pasos leen el cuerpo y el hilo. La ejecución persistida no. Al consultar la ejecución,triggerEvent.body.message trae cabeceras, identificadores, etiquetas y
attachments. No incluye message.text, message.html ni thread. Esos
tres se cargan antes de resolver las plantillas de cada paso. El input
guardado del paso sí trae lo que la plantilla resolvió: si pediste
message.text o thread, aparecen ahí, no en triggerEvent. Si el paso no
los referencia, la ejecución consultada sigue sin cuerpo ni hilo.
Variables frecuentes
"{{trigger.body.thread.messages}}" entrega el arreglo completo y
"{{trigger.body.message.attachments}}" entrega [] cuando no hay archivos.
Normalizar el remitente
Extrae el email antes de compararmessage.from con una lista permitida.
cliente@ejemplo.com.
Para to y cc, el mismo patrón solo toma la primera dirección.
En el paso, declara el origen en input:
gmail.send acepta la cabecera completa en to. Normaliza cuando comparas o
filtras, no hace falta hacerlo solo para responder.
Probar sin procesar el buzón
Filtra por un prefijo del asunto, por el remitente ya normalizado, o por ambos. El correo que envía la cuenta conectada ya queda fuera del trigger; el filtro de asunto evita responder el resto del buzón. Si el correo no entra en la prueba, llamaworkflow.stop
y haz return: el método solo marca el alto; el script sigue hasta terminar
o hasta el return.
succeeded, con stopReason y los pasos siguientes en
skipped.
Ejemplo: notificar un correo recibido
from sale tal cual la cabecera. Normalízalo en un paso JavaScript previo si
el destino espera solo el email.
Adjuntos
Los archivos no se insertan como Base64 en el evento. Cada elemento deattachments contiene id, filename, mimeType, size y una referencia
privada storagePath. Algunos adjuntos inline también traen contentId. Con
storagePath puedes:
- Reenviar el archivo desde un paso Enviar correo con Gmail.
- Analizarlo con IA desde un paso JavaScript
con
files.analyze({ storagePath }). Acepta PDF, DOCX e imágenes de hasta25 MB.
message.hasAttachments o
message.attachments.length. El contenido puede estar en message.text o
message.html, en un adjunto, o en los dos. Revisa cada fuente por separado.
Seguir después del trigger
Una secuencia que cubre filtro, clasificación y adjuntos:- Paso JavaScript de alcance: asunto, remitente normalizado y
workflow.stopsi no aplica. - Criterio IA si hay que clasificar el texto (
message.textomessage.snippet) antes de actuar. files.analyze({ storagePath })cuandoattachmentstrae el documento.- Si no hay nada que procesar,
workflow.stopo Enviar correo con Gmail para pedir el archivo o acusar recibo.

