Qué necesitas
- Una cuenta de Make.com
- Datos que contengan una lista, como un pedido con varias líneas, un conjunto de filas de Google Sheets o los adjuntos de un email
- Conexiones a Google Sheets y Gmail si quieres seguir el ejemplo
La idea en un párrafo
Make pasa los datos entre módulos en forma de bundles. La mayoría de los módulos reciben un bundle y devuelven un bundle. Un iterador recibe un bundle que contiene un array y convierte cada elemento en su propio bundle: entra uno, salen muchos. Un agregador hace lo contrario: recibe muchos bundles y los une en uno: entran muchos, sale uno. Todo lo que hay entre ambos se ejecuta una vez por elemento, así que la posición de estos módulos decide cuántas veces se ejecuta un módulo y cuántos créditos gastas.
Paso a paso: monta un escenario que use los dos
El ejemplo: llega un pedido con varias líneas. Quieres una fila en Google Sheets por cada artículo y, después, un único email al cliente con el total y una lista de lo que ha pedido.
1. Consigue datos que contengan un array
Empieza con un trigger que entregue un pedido, como Webhooks – Custom webhook, o con un HTTP – Make a request que devuelva JSON. Un payload de ejemplo tiene este aspecto:
{"order_id": "A-1001", "email": "[email protected]",
"items": [{"name": "Desk lamp", "qty": 2, "price": 19.5},
{"name": "Cable", "qty": 3, "price": 4}]}
Después de un Run once, Make muestra items como un array en la salida.
2. Añade Flow Control – Iterator
En el campo Array, mapea items. Haz Run once y mira la salida: ahora ves un bundle por artículo, cada uno con name, qty y price. El contador de la burbuja del módulo muestra dos bundles. Todo lo que añadas a partir de aquí se ejecutará dos veces para este pedido.
3. Haz algo por cada elemento
Añade Google Sheets – Add a Row. Mapea Order ID desde el trigger (sigue disponible, porque está antes en el escenario) y Name, Qty y Price desde el iterador. Se añaden dos filas.
4. Cierra el bucle con un agregador
Ahora necesitas de nuevo un único resultado. Añade Tools – Numeric aggregator. Pon el iterador como Source module. En Function elige Sum y en Value usa:
{{2.qty * 2.price}}
El agregador espera a recibir todos los bundles de su origen y luego emite un bundle con el total. Usa Tools – Text aggregator de la misma forma para la lista de artículos. Source module: el iterador. Text: {{2.qty}} x {{2.name}}, con un salto de línea como separador de filas.
5. Usa el resultado agregado
Después del agregador, añade Gmail – Send an email. To es {{1.email}} del trigger. En Body contents puedes usar el resultado del agregador, por ejemplo «Tu total: {{4.result}}». Como el agregador ha producido un solo bundle, Gmail se ejecuta una vez, no dos.
6. Aprende cuándo no necesitas un iterador
Make tiene funciones que trabajan directamente con arrays. Si solo necesitas el número de elementos: {{length(1.items)}}. Para unir nombres en una línea: {{join(map(1.items; "name"); ", ")}}. Para sumar un campo: {{sum(map(1.items; "price"))}} (esto suma los precios tal cual, no cantidad por precio). Estas funciones se ejecutan dentro de un módulo que ya tienes, sin bucle y sin créditos extra. Usa un iterador cuando cada elemento necesite su propia acción de módulo, como su propia fila, su propia subida de archivo o su propio mensaje de Slack.
Guía rápida: ¿qué herramienta uso?
| Quieres… | Usa |
|---|---|
| Hacer algo una vez por cada elemento de una lista | Iterator |
| Convertir muchos bundles en una sola lista | Array aggregator |
| Crear un único bloque de texto, como el cuerpo de un email | Text aggregator |
| Sumar o contar valores | Numeric aggregator |
| Solo leer o transformar un array en un punto concreto | map(), join(), sum() y length() |
El Iterator y el Array aggregator están en Flow Control; el Text aggregator y el Numeric aggregator, en Tools.
Errores frecuentes y cómo solucionarlos
Recibes un email por cada elemento en lugar de uno en total. El módulo de Gmail está dentro del bucle: entre el iterador y el agregador, o después del iterador sin ningún agregador. Añade el agregador y coloca Gmail detrás.
Solo se guarda el último elemento, o el agregador devuelve un único valor. Normalmente el Source module está mal configurado, o la agregación la está haciendo un módulo Set variable que se sobrescribe a sí mismo en cada pasada. Asegúrate de que el Source module del agregador sea el iterador o la búsqueda que genera los bundles.
El iterador no devuelve nada o avisa de que esperaba un array. El campo que has mapeado no es un array: es texto, un único objeto o está vacío. Revisa la salida del módulo anterior. Si tienes un texto separado por comas, divídelo primero (por ejemplo con la función split()) e itera sobre el resultado.
El escenario sigue adelante aunque la búsqueda no haya encontrado nada. Es lo esperado cuando un agregador va detrás de la búsqueda: por defecto emite un bundle aunque no le llegue ninguno, lo que resulta útil para gestionar los casos de «no encontrado». Si prefieres que se detenga, activa Stop processing after an empty aggregation en los ajustes avanzados del agregador, o añade un filtro después, por ejemplo para cuando el texto agregado esté vacío.
Después del agregador no ves los datos de los elementos anteriores. Tras la agregación tienes el resultado agregado y todo lo que venga de módulos anteriores al bucle. Los valores de cada elemento dentro del bucle desaparecen, salvo que los hayas agregado en un array.
El consumo de créditos es mucho mayor de lo esperado. Cada módulo después de un iterador se ejecuta una vez por elemento. Una lista de 100 filas que pasa por cuatro módulos gasta muchos más créditos que el mismo trabajo hecho con map() dentro de un solo módulo. La pestaña History muestra las cifras reales de cada ejecución.