Ce dont vous avez besoin
- Un compte Make.com
- Des données qui contiennent une liste, par exemple une commande avec plusieurs lignes d'articles, un ensemble de lignes Google Sheets ou les pièces jointes d'un e-mail
- Des connexions Google Sheets et Gmail si vous voulez suivre l'exemple
Le principe en un paragraphe
Make fait circuler les données entre les modules sous forme de bundles. La plupart des modules reçoivent un bundle et en renvoient un. Un itérateur reçoit un bundle contenant un array et transforme chaque élément en un bundle distinct : un en entrée, plusieurs en sortie. Un agrégateur fait l'inverse : il reçoit plusieurs bundles et les fusionne en un seul : plusieurs en entrée, un en sortie. Tout ce qui se trouve entre les deux s'exécute une fois par élément ; la position de ces modules détermine donc combien de fois un module s'exécute, et combien de crédits vous consommez.
Étape par étape : construire un scénario qui utilise les deux
L'exemple : une commande arrive avec plusieurs lignes d'articles. Vous voulez une ligne dans Google Sheets par article, puis un seul e-mail au client avec le total et la liste de ce qu'il a commandé.
1. Récupérez des données qui contiennent un array
Commencez par un déclencheur qui fournit une commande, comme Webhooks – Custom webhook, ou par un HTTP – Make a request qui renvoie du JSON. Voici à quoi ressemble un exemple de payload :
{"order_id": "A-1001", "email": "[email protected]",
"items": [{"name": "Desk lamp", "qty": 2, "price": 19.5},
{"name": "Cable", "qty": 3, "price": 4}]}
Après un Run once, Make affiche items comme un array dans la sortie.
2. Ajoutez Flow Control – Iterator
Dans le champ Array, mappez items. Lancez Run once et regardez la sortie : vous voyez maintenant un bundle par article, chacun avec name, qty et price. Le compteur dans la bulle du module indique deux bundles. Tout ce que vous ajoutez à partir de là s'exécutera deux fois pour cette commande.
3. Effectuez une action par élément
Ajoutez Google Sheets – Add a Row. Mappez Order ID depuis le déclencheur (toujours disponible, puisqu'il se trouve plus tôt dans le scénario), ainsi que Name, Qty et Price depuis l'itérateur. Deux lignes sont ajoutées.
4. Fermez la boucle avec un agrégateur
Vous avez maintenant à nouveau besoin d'un résultat unique. Ajoutez Tools – Numeric aggregator. Définissez l'itérateur comme Source module. Pour Function, choisissez Sum, et pour Value, utilisez :
{{2.qty * 2.price}}
L'agrégateur attend tous les bundles de sa source, puis émet un bundle avec le total. Utilisez Tools – Text aggregator de la même façon pour la liste des articles. Source module : l'itérateur. Text : {{2.qty}} x {{2.name}}, avec un saut de ligne comme séparateur de lignes.
5. Utilisez le résultat agrégé
Après l'agrégateur, ajoutez Gmail – Send an email. To est {{1.email}}, issu du déclencheur. Dans Body contents, vous pouvez utiliser le résultat de l'agrégateur, par exemple « Votre total : {{4.result}} ». Comme l'agrégateur a produit un seul bundle, Gmail s'exécute une fois, et non deux.
6. Sachez quand vous n'avez pas du tout besoin d'itérateur
Make propose des fonctions qui travaillent directement sur les arrays. Si vous avez seulement besoin du nombre d'éléments : {{length(1.items)}}. Pour réunir les noms sur une ligne : {{join(map(1.items; "name"); ", ")}}. Pour additionner un champ : {{sum(map(1.items; "price"))}} (cela additionne les prix tels quels, et non la quantité multipliée par le prix). Ces fonctions s'exécutent dans un module que vous avez déjà, sans boucle et sans crédits supplémentaires. Utilisez un itérateur quand chaque élément nécessite sa propre action de module, comme sa propre ligne, son propre envoi de fichier ou son propre message Slack.
Mémo : quel outil choisir ?
| Vous voulez… | Utilisez |
|---|---|
| Effectuer une action une fois par élément d'une liste | Iterator |
| Transformer plusieurs bundles en une seule liste | Array aggregator |
| Construire un seul bloc de texte, comme le corps d'un e-mail | Text aggregator |
| Additionner ou compter des valeurs | Numeric aggregator |
| Simplement lire ou remodeler un array à un seul endroit | map(), join(), sum() et length() |
L'Iterator et l'Array aggregator se trouvent dans Flow Control ; le Text aggregator et le Numeric aggregator, dans Tools.
Erreurs fréquentes et solutions
Vous recevez un e-mail par élément au lieu d'un seul au total. Le module Gmail se trouve dans la boucle : entre l'itérateur et l'agrégateur, ou après l'itérateur sans aucun agrégateur. Ajoutez l'agrégateur et placez Gmail après lui.
Seul le dernier élément est enregistré, ou l'agrégateur ne renvoie qu'une seule valeur. En général, le Source module est mal réglé, ou l'agrégation est faite par un module Set variable qui s'écrase lui-même à chaque passage. Vérifiez que le Source module de l'agrégateur est bien l'itérateur ou la recherche qui produit les bundles.
L'itérateur ne renvoie rien ou indique qu'il attendait un array. Le champ que vous avez mappé n'est pas un array : c'est du texte, un objet unique ou une valeur vide. Vérifiez la sortie du module précédent. Si vous avez un texte séparé par des virgules, découpez-le d'abord (par exemple avec la fonction split()) et itérez sur le résultat.
Le scénario continue alors que la recherche n'a rien trouvé. C'est normal quand un agrégateur suit la recherche : par défaut, il renvoie un bundle même si aucun bundle ne lui parvient, ce qui est pratique pour gérer les cas « introuvable ». Pour arrêter le scénario à la place, activez Stop processing after an empty aggregation dans les paramètres avancés de l'agrégateur, ou ajoutez un filtre après lui, par exemple lorsque le texte agrégé est vide.
Vous ne voyez plus les données des éléments après l'agrégateur. Après l'agrégation, vous disposez du résultat agrégé et de tout ce qui provient des modules situés avant la boucle. Les valeurs propres à chaque élément dans la boucle ont disparu, sauf si vous les avez agrégées dans un array.
La consommation de crédits est bien plus élevée que prévu. Chaque module placé après un itérateur s'exécute une fois par élément. Une liste de 100 lignes qui traverse quatre modules consomme beaucoup plus de crédits que le même travail réalisé avec map() dans un seul module. L'onglet History affiche les chiffres réels de chaque exécution.