8. Juli 2022 von Alexander Zielinski
MS Power Automate für zusätzliche MS Planner Funktionen – Teil 1
Der MS Planner bietet nativ (noch) keine Möglichkeit, wiederkehrende Aufgaben anzulegen. In meinem Blog-Beitrag beschreibe ich, wie diese Anforderung zusammen mit Power Automate erfüllt wird, und erweitere den Flow anschließend um weitere Features.
Der Lösungsansatz besteht aus drei Komponenten:
- MS Planner
- Einer Liste in MS Teams beziehungsweise SharePoint
- Einem „Flow“ in MS Power Automate
Die drei Komponenten übernehmen folgende Aufgaben:
- In der SharePoint-/Teams-Liste werden die Daten für die wiederkehrenden Aufgaben gespeichert, die Attribute entsprechen daher denen, die im Planner für Aufgaben vorhanden sind.
- Der Power Automate Flow wird zeitgesteuert täglich ausgeführt und legt etwaige Aufgaben an.
- Der Planner wird auf erprobte Weise für die Aufgabenbearbeitung eingesetzt.
Die Basis-Funktionalität wird anschließend erweitert:
1. Erzeugung von Checklisten anhand der Aufgaben
2. Setzen der Kategorien mit einem http-Konnektor (wie das funktioniert, erkläre ich im zweiten Teil meines Blog-Beitrags)
Im Folgenden zeige ich euch zunächst eine lauffähige Basisversion des Lösungsansatzes, die für eine Reihe von Anwendungsszenarien ausreichen sollte. Diese Lösung wird im weiteren Verlauf um Lösungen für die Punkte eins bis drei erweitert. Ich beschränke mich dabei auf die wesentlichen Konnektoren.
Basis-Szenario
Erstellen der SharePoint-/Teams-Liste
Die SharePoint- und/oder Teams-Liste ist der Ausgangspunkt für die wiederkehrenden Aufgaben. Im weiteren Verlauf meines Beitrags nehme ich an, dass die Liste recurring tasks genannt wird. Die Liste der Basisversion hat folgenden Aufbau:
Attribut | Typ (dt. Bezeichnung) | Bedeutung |
Title | Eine Textzeile | Aufgabentitel im Planner |
Intervall | Ganze Zahl |
Ausführungsintervall in Tagen |
LastCreationDate | Datum und Uhrzeit (Nur Datum) |
Datum der letzten Aufgabenerstellung (Im Flow gesetzt) |
NextCreationDate | Datum und Uhrzeit (Nur Datum) |
Datum der nächsten Aufgabenerstellung (Im Flow berechnet) |
UserToAssign | Person oder Gruppe |
Ein oder mehrere User oder Gruppen aus dem ActiveDirectory |
Description | Mehrere Textzeilen (Nur Text) | Die Beschreibung der Aufgabe im Planner |
ProcessingTime | Ganze Zahl (Standardwert: 1) |
Dauer der Aufgabenausführung in Tagen |
Power Automate Flow
In der dieser Abbildung ist die Power Automate Flow dargestellt.
Abrufen der SharePoint-Daten
Der Flow beginnt mit dem Abrufen der fälligen Aufgaben des Tages aus der SharePoint-Liste. Die Websiteadresse hat das Format https://xxx.sharepoint.com/sites/<
NextCreationDate eq ‘utcNow()‘
Wir haben das Listenattribut NextCreationDate mit der Eigenschaft Nur Datum angelegt. Die Funktion utcNow() liefert standardmäßig einen vollständigen Timestamp. Der Vergleich beider Werte in Power Automate mit dem Operator eq führt zu einem Fehler, da die Operanden unterschiedliche Typen aufweisen. Die Lösung verbirgt sich hinter den drei Punkten in der Funktion beziehungsweise hinter einem Klick auf die Funktion: Hier habt ihr die Möglichkeit, das Ergebnis von utcNow zu formatieren. Das richtige Format für unseren Vergleich erhalten wir mit
utcNow(‘yyyy-MM-dd‘)
Zunächst brauchen wir nur eine Flow-Variable:
Flow-Variable
Flow-Variable | Typ | Bedeutung |
UserIDs | String |
E-Mail-Adressen der zugewiesenen User |
Aufgaben des aktuellen Tages erstellen
Das Anlegen der Aufgaben eines Tages wird mit einer For-Each-Schleife erledigt, der Power-Automate-Terminus hierfür ist Auf alle anwenden. Value ist das Ergebnis des Konnektors Elemente abrufen. Innerhalb von Auf alle anwenden wird eine weitere Schleife durchlaufen, in der die UserIDs zu einem String zusammengefügt werden.
Die beiden Zeitintervall-Konnektoren berechnen das Fälligkeitsdatum (anhand des Attributs processingtime) sowie das Datum, an dem die Aufgabe das nächste Mal ausgeführt werden soll (anhand von Intervall). Der Planner benötigt für die User einen String aus E-Mail-Adressen, separiert durch Semikolon. Der String wird in der Schleife Verantwortliche Nutzer zu Variablen hinzufügen gebildet. Die Planner-Aufgabe wird mit folgenden Einstellungen erzeugt:
Unter Gruppen-ID wird der Name des Teams-Raumes ausgewählt beziehungsweise sollte dieser vorbelegt sein. Die Plan-ID ist der Name des Planners in Teams. Als Projektleiter erstelle ich ein monatliches Reporting, daher setze ich in den Titel der Aufgabe den Titel aus der SharePoint-Liste zusammen mit dem Monat/Jahr. Falls ihr das so übernehmen möchtet, hier die Formatierung von
utcNow('MM/yy').
Aufgabe und SharePoint-Eintrag aktualisieren
Die Beschreibung wird mit Aufgabe aktualisieren hinzugefügt. Abschließend wird der Teams-Listeneintrag auf das zukünftige, zuvor berechnete Ausführungsdatum gesetzt und die letzte Ausführung auf das aktuelle Datum gesetzt.
Erweitertes Szenario
Überblick über die Veränderungen im erweiterten Flow
Für das erweiterte Szenario wird die SharePoint-Liste erweitert und es werden weitere Variablen im Flow benötigt. Erweiterung der SharePoint-Liste:
Attribut | Attribut | Bedeutung |
CheckListItems | Textfeld, mehrzeilig |
Checklisteinträge, mit Zeilenumbruch getrennt |
Zusätzliche Flow-Variablen:
Flow-Variable | Typ | Bedeutung |
ChecklistItems | Array | Array für Checklist-Einträge |
In der dieser Abbildung ist die äußere Schleife mit den Anpassungen für Checklisten dargestellt.
Checklist-Einträge erstellen
Checklist-Einträge lassen sich auf verschiedene Arten in der Teams-Liste speichern. Ich habe mich für eine einfach zu implementierende Variante entschieden: Ich habe ein mehrzeiliges Textfeld CheckListItems zur Liste hinzugefügt und füge hinter jedem Eintrag einen Zeilenumbruch ein. Vorher prüfe ich, ob das Attribut für ChecklistItems gefüllt ist, hierzu wird die Empty-Funktion genutzt:
empty(items('Auf_alle_anwenden')?['CheckListItems'])
Der False-Pfad der Bedingung ist leer. Im True-Pfad befindet sich der Konnektor Verfassen. Dieser zerlegt den String aus der SharePoint-Liste in ein Array. Hierzu wird, wie in vielen Programmiersprachen, die Funktion Split verwendet. Die Herausforderung hierbei ist, den Zeilenumbruch einzufügen, da ein Ascii/UTF8-Zeichen nicht zum gewünschten Ergebnis führt. Gelöst wird dies durch
decodeUriComponent('%0A')
Die vollständige Split-Funktion lautet bei mir wie folgt:
split(items('Auf_alle_anwenden')?['CheckListItems'],decodeUriComponent('%0A'))
Das soeben erzeugte Array wird nun durchlaufen, dabei die benötigte Struktur für die Checklist-Einträge erzeugt und im Array ChecklistItems abgelegt:
Die Kategorien werden später auf gleiche Weise gebildet.
Beim Aktualisieren der Aufgabe kann das erzeugte Array direkt hinzugefügt werden, dazu müsst ihr im Bereich der Prüfliste auf das Symbol mit „T“ klicken.
Die nützlichen Funktionen des Planners lassen sich mit Power Automate um weitere wertvolle Möglichkeiten erweitern. Power Automate unterstützt euch bei der Entwicklung mit diversen Hilfestellungen, so dass der Start sehr niederschwellig ist.
In diesem Blog-Beitrag habe ich existierende Bausteine aus Power Automate „legoartig“ zusammengestellt, um zwei Anforderungen an den Planner zu realisieren. Power Automate kann auch REST-APIs aufrufen und somit sind die möglichen Anwendungsfälle nicht auf die vorhandenen Power-Automate-Bausteine begrenzt. Im zweiten Teil meines Beitrags zeige ich euch, wie mit Power Automate die MS Graph API aufgerufen wird. Inhaltlich setze ich das Thema Planner fort und zeige eine Möglichkeit, Kategorien im Planner mit der Graph API anzulegen.