„Apply to each“ in Power Automate: die Schleife verstehen, steuern und vermeiden
„Auf alle anwenden“ verarbeitet Listen Element für Element und entsteht oft ungewollt. Wie die Schleife funktioniert, warum sie bremst und wann sie weg kann.
Filter Array und Select ersetzen Apply to each beim Filtern und Umformen von Arrays und laufen deutlich schneller.
Filter Array und Select ersetzen Apply to each überall dort, wo ein Array nur gefiltert oder umgeformt werden soll. Beide Aktionen laufen als ein einziger Schritt, unabhängig davon, ob das Array fünf oder fünftausend Einträge enthält. Eine Schleife erzeugt dagegen pro Element eigene Aktionsausführungen.
Dieser Beitrag zeigt die Codeansicht beider Aktionen, die passenden Ausdrücke und die Stellen, an denen eine Schleife trotzdem die richtige Wahl bleibt. Zu den Grenzen von Apply to each selbst finden Sie mehr im Beitrag zu den Power-Automate-Aktionslimits.
Apply to each führt jede enthaltene Aktion einmal pro Element aus und erzeugt dadurch Ausführungen, die beim reinen Filtern oder Umformen keinen Nutzen bringen. Bei 200 Bestellungen mit zwei Aktionen im Schleifenkörper sind das 400 Einzelausführungen. Alle zählen gegen das Aktionslimit Ihres Flows und werden im Flow-Verlauf einzeln protokolliert.
Microsoft empfiehlt für diesen Fall einen Filter- oder Auswahlvorgang statt einer Bedingung in einer Schleife. Das vereinfacht den Cloud Flow und verbessert die Leistung. Nachzulesen in der Übersicht zu den Datenvorgängen in Power Automate.
Kriterium | Apply to each | Filter Array | Select
Kriterium: Aufgabe · Apply to each: eine Aktion je Element ausführen · Filter Array: Anzahl der Objekte reduzieren · Select: Form der Objekte ändern
Kriterium: Aktionsausführungen · Apply to each: eine je Element und je enthaltener Aktion · Filter Array: genau eine, unabhängig von der Arraygröße · Select: genau eine, unabhängig von der Arraygröße
Kriterium: Ändert die Anzahl der Objekte · Apply to each: indirekt über Bedingungen · Filter Array: ja · Select: nein
Kriterium: Ändert die Struktur der Objekte · Apply to each: über enthaltene Aktionen · Filter Array: nein · Select: ja
Kriterium: Seiteneffekte je Element möglich · Apply to each: ja · Filter Array: nein · Select: nein
Kriterium: Einträge im Flow-Verlauf · Apply to each: einer je Durchlauf · Filter Array: genau einer · Select: genau einer
Die Aktion Array filtern reduziert ein Array auf die Objekte, die Ihren Kriterien entsprechen, und gibt ein neues Array zurück. Laut der offiziellen Dokumentation zu den Datenvorgängen gelten dabei zwei feste Einschränkungen.
offen findet kein Objekt mit dem Wert Offen.Für einen einzelnen Vergleich reicht die einfache Ansicht. Für kombinierte Bedingungen wechseln Sie in den erweiterten Modus und schreiben den Ausdruck selbst.
Modus | Eingabe | Geeignet für
Modus: Einfach · Eingabe: Feld, Operator und Wert über die Oberfläche · Geeignet für: ein einzelner Vergleich, etwa Status ist gleich Offen
Modus: Erweitert · Eingabe: ein Ausdruck mit @-Präfix · Geeignet für: mehrere Bedingungen, Und/Oder-Logik, Funktionen wie toLower
Select ändert die Form der Objekte in einem Array, ohne deren Anzahl zu verändern. Sie benennen Felder um, setzen neue Felder aus vorhandenen zusammen oder lassen nicht benötigte Felder weg.
Ein Beispiel aus der Microsoft-Dokumentation: Aus Objekten mit den Feldern first und last entsteht ein Array mit FirstName, FamilyName und einem zusätzlichen FullName. Das Ergebnis ist wieder ein Array und geht direkt an nachfolgende Aktionen weiter, etwa an Create CSV table.
Select reduziert damit nicht nur die Komplexität des Flows. Es verringert laut Microsoft auch die Nutzlastgröße, wenn die Daten anschließend an ein anderes System übergeben werden.
In der Praxis stehen beide Aktionen hintereinander, und in der Codeansicht des Designers sehen sie so aus. Der folgende Ausschnitt filtert die offenen Bestellungen aus einer SharePoint-Abfrage und übergibt nur drei Felder an den nächsten Schritt.
1{2 "Bestellungen_filtern": {3 "type": "Query",4 "inputs": {5 "from": "@body('Elemente_abrufen')?['value']",6 "where": "@equals(item()?['Status'], 'Offen')"7 },8 "runAfter": {9 "Elemente_abrufen": [ "Succeeded" ]10 }11 },12 "Felder_auswaehlen": {13 "type": "Select",14 "inputs": {15 "from": "@body('Bestellungen_filtern')",16 "select": {17 "Bestellnummer": "@item()?['Title']",18 "Kunde": "@item()?['Kundenname']",19 "Betrag": "@item()?['Betrag']"20 }21 },22 "runAfter": {23 "Bestellungen_filtern": [ "Succeeded" ]24 }25 }26}Filter Array heißt im Hintergrund Query, Select heißt Select. Leerzeichen in Aktionsnamen werden zu Unterstrichen. Die Schemas beider Aktionen stehen in der Schemareferenz zu Trigger- und Aktionstypen.
Diese Ausdrücke brauchen Sie im erweiterten Modus am häufigsten:
1Zwei Bedingungen mit Und verknüpfen:2@and(equals(item()?['Status'], 'Offen'), greater(item()?['Betrag'], 1000))3
4Vergleich ohne Beachtung der Groß- und Kleinschreibung:5@equals(toLower(item()?['Status']), 'offen')6
7Anzahl der Treffer für eine nachfolgende Bedingung:8@length(body('Bestellungen_filtern'))9
10Prüfen, ob der Filter überhaupt etwas gefunden hat:11@empty(body('Bestellungen_filtern'))Das Fragezeichen in item()?['Status'] ist kein Tippfehler. Es greift auf das Feld zu, ohne den Flow abzubrechen, wenn das Feld in einem Objekt fehlt.
Apply to each bleibt richtig, sobald pro Element ein eigener Seiteneffekt nötig ist. Das gilt für eine E-Mail je Bestellung, für einen Datensatz in einem System ohne Batch-Endpunkt und für den Aufruf eines Unterflows.
Auch wenn die Verarbeitung eines Elements vom Ergebnis des vorherigen abhängt, ist eine Schleife die einfachere Lösung.
Arbeiten Sie direkt mit Dataverse, gibt es eine dritte Option. Microsoft empfiehlt, Spalten und Zeilen bereits in der Quelle über die Optionen Spalten auswählen und Zeilen filtern einzugrenzen. Das reduziert die übertragene Datenmenge von vornherein.
Wo die Grenze für Ihr Setup liegt, lässt sich am besten am konkreten Flow einschätzen, etwa im Rahmen einer Power-Automate-Beratung.
Die meisten Probleme mit Filter Array und Select gehen auf fünf Ursachen zurück. Die folgende Tabelle nennt jeweils Symptom, Ursache, Lösung und die Stelle in der Herstellerdokumentation.
Symptom | Ursache | Lösung | Quelle
Symptom: Filter liefert ein leeres Array, obwohl passende Daten vorhanden sind · Ursache: Der Vergleichstext beachtet Groß- und Kleinschreibung · Lösung: Im erweiterten Modus @equals(toLower(item()?['Status']), 'offen') verwenden · Quelle: Datenvorgänge
Symptom: Filter Array findet nach einem HTTP-Aufruf keine Felder · Ursache: Ohne Parse JSON liest die Aktion nur den Antworttext, nicht die Struktur der Nutzlast · Lösung: Vor Filter Array eine Parse-JSON-Aktion einfügen und deren Ausgabe filtern · Quelle: Datenvorgänge in Logic Apps
Symptom: Die nachfolgende Aktion nimmt die Select-Ausgabe nicht an · Ursache: Select gibt immer ein Array zurück, die Zielaktion erwartet aber Text · Lösung: Select im Textmodus nutzen ("select": "@item()?['Title']") und mit join() verketten, oder das Array über Compose weitergeben · Quelle: Schemareferenz
Symptom: Der Flow bricht mit einem Vorlagenfehler ab, sobald ein Feld fehlt · Ursache: Direkter Zugriff über item()['Feld'] ohne Null-Absicherung · Lösung: Immer item()?['Feld'] schreiben · Quelle: Ausdrucksreferenz für Cloud Flows
Symptom: Nach Select stimmt die Anzahl der Datensätze nicht · Ursache: Select ändert die Form, nicht die Anzahl; gefiltert wurde nie · Lösung: Filter Array vorschalten und erst danach mit Select umformen · Quelle: Datenvorgänge
Filtern Sie zuerst und formen Sie danach um. Select verarbeitet dann weniger Objekte. Technisch funktioniert auch die umgekehrte Reihenfolge, sie ist aber unübersichtlicher.
Ja, jede der beiden Aktionen zählt einmal. Der Unterschied zu Apply to each: Sie laufen unabhängig von der Arraygröße immer als eine einzige Ausführung.
Nein. Filter Array verändert nur, wie viele Objekte im Ergebnis liegen, nicht deren Struktur. Für Felder umbenennen, ergänzen oder entfernen ist Select zuständig.
Die Aktion gibt ein leeres Array zurück, der Flow läuft ohne Fehler weiter. Prüfen Sie das Ergebnis bei Bedarf mit @empty() oder @length() in einer nachfolgenden Bedingung.
Bei wenigen Einträgen ist der Laufzeitgewinn gering. Der Vorteil liegt dann in der Übersichtlichkeit und Wartbarkeit, und der zahlt sich aus, sobald das Array im Betrieb wächst.
Gründer von NordFlux. Sieben Jahre Erfahrung von Web und SEO bis zur Automatisierung im Konzern-Maßstab, heute pragmatisch für den Mittelstand und mit deutscher Datenhoheit.
Zertifizierungen
„Auf alle anwenden“ verarbeitet Listen Element für Element und entsteht oft ungewollt. Wie die Schleife funktioniert, warum sie bremst und wann sie weg kann.
Apply-to-each-Limits und Paginierung in Power Automate: Wie die 100.000-Iterationsgrenze funktioniert und wie Sie sie umgehen.
Excel-Tabelle, Apply to each, Outlook: So verschickt Power Automate an jede Zeile Ihrer Liste eine persönliche E-Mail.
Filter Array und Select ersetzen viele Apply-to-each-Schleifen und sparen Aktionsverbrauch sowie Laufzeit, aber die richtige Wahl zwischen beiden Ansätzen erfordert Erfahrung mit der jeweiligen Flow-Logik. NordFlux optimiert bestehende Power-Automate-Flows auf Performance und baut neue Prozesse von Anfang an ressourcenschonend auf. Im ersten Gespräch prüfen wir Ihre Flows auf unnötige Schleifen und zeigen das Einsparpotenzial.