Skip to main content
Logo oficial de Gmail Usa 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 si labelIds 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.
message.from, message.to, message.cc y message.replyTo son la cabecera del correo. El valor habitual trae el nombre y el email juntos, como from en el ejemplo. Comparar el campo completo contra solo el email falla aunque el remitente sea el esperado. to y cc pueden listar varias direcciones separadas por coma. Si la cabecera no existe, el campo no viene.
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.
Cada elemento de 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 a text, 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

Si una plantilla ocupa todo el valor, conserva el tipo original. Por ejemplo, "{{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 comparar message.from con una lista permitida.
La cabecera con nombre y el email suelto quedan en 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, llama workflow.stop y haz return: el método solo marca el alto; el script sigue hasta terminar o hasta el return.
La ejecución queda en 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 de attachments contiene id, filename, mimeType, size y una referencia privada storagePath. Algunos adjuntos inline también traen contentId. Con storagePath puedes: Para saber si hay archivo, usa 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.
El contenido del correo puede incluir datos personales o sensibles. Envía cuerpos y adjuntos únicamente a destinos autorizados.

Seguir después del trigger

Una secuencia que cubre filtro, clasificación y adjuntos:
  1. Paso JavaScript de alcance: asunto, remitente normalizado y workflow.stop si no aplica.
  2. Criterio IA si hay que clasificar el texto (message.text o message.snippet) antes de actuar.
  3. files.analyze({ storagePath }) cuando attachments trae el documento.
  4. Si no hay nada que procesar, workflow.stop o Enviar correo con Gmail para pedir el archivo o acusar recibo.

Relacionado