Was Sie brauchen
- Ein Make.com-Konto
- Daten, die eine Liste enthalten, etwa eine Bestellung mit Positionen, mehrere Zeilen aus Google Sheets oder die Anhänge einer E-Mail
- Verbindungen zu Google Sheets und Gmail, wenn Sie das Beispiel nachbauen möchten
Das Prinzip in einem Absatz
Make reicht Daten in Form von Bundles von Modul zu Modul weiter. Die meisten Module nehmen ein Bundle entgegen und geben ein Bundle zurück. Ein Iterator nimmt ein Bundle, das ein Array enthält, und macht aus jedem Element ein eigenes Bundle: eins rein, viele raus. Ein Aggregator macht das Gegenteil: Er nimmt viele Bundles und führt sie zu einem zusammen: viele rein, eins raus. Alles dazwischen läuft einmal pro Element. Die Position dieser Module entscheidet also darüber, wie oft ein Modul läuft und wie viele Credits Sie verbrauchen.
Schritt für Schritt: ein Szenario mit beiden bauen
Das Beispiel: Eine Bestellung mit mehreren Positionen geht ein. Sie möchten pro Position eine Zeile in Google Sheets und anschließend eine einzige E-Mail an den Kunden mit der Gesamtsumme und einer Liste der bestellten Artikel.
1. Daten holen, die ein Array enthalten
Beginnen Sie mit einem Trigger, der eine Bestellung liefert, etwa Webhooks – Custom webhook, oder mit HTTP – Make a request, das JSON zurückgibt. Eine Beispiel-Payload sieht so aus:
{"order_id": "A-1001", "email": "[email protected]",
"items": [{"name": "Desk lamp", "qty": 2, "price": 19.5},
{"name": "Cable", "qty": 3, "price": 4}]}
Nach einem Run once zeigt Make items in der Ausgabe als Array an.
2. Flow Control – Iterator hinzufügen
Mappen Sie im Feld Array items. Klicken Sie auf Run once und sehen Sie sich die Ausgabe an: Jetzt gibt es ein Bundle pro Position, jeweils mit name, qty und price. Die Zahl in der Bubble des Moduls zeigt zwei Bundles. Alles, was Sie ab hier hinzufügen, läuft für diese Bestellung zweimal.
3. Pro Element etwas tun
Fügen Sie Google Sheets – Add a Row hinzu. Mappen Sie Order ID aus dem Trigger (weiterhin verfügbar, da er früher im Szenario liegt) sowie Name, Qty und Price aus dem Iterator. Es werden zwei Zeilen hinzugefügt.
4. Die Schleife mit einem Aggregator schließen
Jetzt brauchen Sie wieder ein einzelnes Ergebnis. Fügen Sie Tools – Numeric aggregator hinzu. Setzen Sie das Source module auf den Iterator. Wählen Sie bei Function den Wert Sum und verwenden Sie bei Value:
{{2.qty * 2.price}}
Der Aggregator wartet auf alle Bundles aus seiner Quelle und gibt dann ein Bundle mit der Summe aus. Für die Artikelliste verwenden Sie Tools – Text aggregator auf dieselbe Weise. Source module: der Iterator. Text: {{2.qty}} x {{2.name}}, mit einem Zeilenumbruch als Zeilentrenner.
5. Das aggregierte Ergebnis verwenden
Fügen Sie nach dem Aggregator Gmail – Send an email hinzu. To ist {{1.email}} aus dem Trigger. Im Body contents können Sie das Ergebnis des Aggregators verwenden, zum Beispiel „Ihre Gesamtsumme: {{4.result}}“. Da der Aggregator ein einziges Bundle erzeugt hat, läuft Gmail einmal statt zweimal.
6. Erkennen, wann Sie gar keinen Iterator brauchen
Make bietet Funktionen, die direkt mit Arrays arbeiten. Brauchen Sie nur die Anzahl der Elemente: {{length(1.items)}}. Um Namen in einer Zeile zu verbinden: {{join(map(1.items; "name"); ", ")}}. Um ein Feld zu addieren: {{sum(map(1.items; "price"))}} (das summiert die Preise so, wie sie sind, nicht Menge mal Preis). Diese Funktionen laufen in einem Modul, das Sie ohnehin haben, ohne Schleife und ohne zusätzliche Credits. Einen Iterator brauchen Sie, wenn jedes Element eine eigene Modulaktion benötigt, etwa eine eigene Zeile, einen eigenen Datei-Upload oder eine eigene Slack-Nachricht.
Kurzübersicht: welches Werkzeug?
| Sie möchten … | Verwenden Sie |
|---|---|
| für jedes Element einer Liste einmal etwas tun | Iterator |
| viele Bundles in eine Liste umwandeln | Array aggregator |
| einen zusammenhängenden Textblock erstellen, etwa einen E-Mail-Text | Text aggregator |
| Werte addieren oder zählen | Numeric aggregator |
| ein Array nur an einer Stelle auslesen oder umformen | map(), join(), sum() und length() |
Iterator und Array aggregator finden Sie unter Flow Control, Text aggregator und Numeric aggregator unter Tools.
Häufige Fehler und Lösungen
Sie erhalten eine E-Mail pro Element statt einer einzigen. Das Gmail-Modul liegt innerhalb der Schleife: zwischen Iterator und Aggregator oder hinter dem Iterator ganz ohne Aggregator. Fügen Sie den Aggregator hinzu und setzen Sie Gmail dahinter.
Nur das letzte Element wird gespeichert, oder der Aggregator liefert nur einen Wert. Meist ist das Source module falsch eingestellt, oder die Aggregation läuft über ein Set-variable-Modul, das sich bei jedem Durchlauf selbst überschreibt. Stellen Sie sicher, dass das Source module des Aggregators der Iterator oder die Suche ist, die die Bundles erzeugt.
Der Iterator gibt nichts aus oder meldet, dass er ein Array erwartet hat. Das gemappte Feld ist kein Array, sondern Text, ein einzelnes Objekt oder leer. Prüfen Sie die Ausgabe des vorherigen Moduls. Haben Sie kommagetrennten Text, teilen Sie ihn zuerst auf (zum Beispiel mit der Funktion split()) und iterieren Sie über das Ergebnis.
Das Szenario läuft weiter, obwohl die Suche nichts gefunden hat. Das ist zu erwarten, wenn ein Aggregator auf die Suche folgt: Standardmäßig gibt er auch dann ein Bundle aus, wenn keine Bundles bei ihm ankommen. Das ist praktisch, um „nicht gefunden“-Fälle zu behandeln. Soll das Szenario stattdessen anhalten, aktivieren Sie Stop processing after an empty aggregation in den erweiterten Einstellungen des Aggregators oder fügen Sie danach einen Filter hinzu, zum Beispiel für den Fall, dass der aggregierte Text leer ist.
Nach dem Aggregator sehen Sie die Daten der einzelnen Elemente nicht mehr. Nach der Aggregation haben Sie das aggregierte Ergebnis und alles aus Modulen vor der Schleife. Werte einzelner Elemente aus der Schleife sind weg, es sei denn, Sie haben sie zu einem Array aggregiert.
Der Credit-Verbrauch ist viel höher als erwartet. Jedes Modul nach einem Iterator läuft einmal pro Element. Eine Liste mit 100 Zeilen, die durch vier Module läuft, verbraucht deutlich mehr Credits als dieselbe Aufgabe mit map() innerhalb eines einzigen Moduls. Der Tab History zeigt die tatsächlichen Zahlen für jeden Lauf.