Power Automate: Reminder vor Meetings in Teams Chat versenden
Als Scrum Master und Kanban Coach verbringe ich fast jeden Vormittag in Daily Stand-ups, Backlog Refinements und Replenishment Meetings. Schlecht vorbereitete Teilnehmer in diesen Meetings können den Ablauf häufig beeinträchtigen und die Produktivität des ganzen Team negativ beeinflussen. Dies kann dazu führen, dass wichtige Themen nicht besprochen werden, Entscheidungen verzögert werden und wertvolle Zeit mit Arbeiten verschwendet wird, die eingetlich im Vorfeld des Meetings hätten stattfinden können. Gerade in Replenishment Meetings, in denen wir die Arbeit für die nächste Iteration planen ist es wichtig, dass jeder Teilnehmer vorbereitet ist, um das Meeting erfolgreich und effizient durchführen zu können. Hierzu gehört, dass alle Teilnehmer individuelle Aufgaben für die nächste Woche in ihrem Team-Backlog erfassen.
Damit wir effizient durch unsere Planungs-Meetings kommen habe ich mir angewöhnt ein bis zwei Stunden vor dem Termin eine Chat-Nachricht an das Team zu senden, um daran zu erinnern individuelle Aufgaben im Backlog zu dokumentieren. Da ich ein Mensch mit einer Hang zur Automatisierung bin, habe ich mir hierzu mit Microsoft Power Automate einen Flow gebaut, der diese Aufgabe übernimmt. Hierzu sucht der Flow in meinem Kalender nach Meetings die innerhalb der nächsten 90 Minuten beginnen, im Titel den Begriff „Replenishment Meeting“ enthalten und gleichzeitig als Microsoft Teams Meeting angesetzt sind. Bei einem Treffer sendet der Flow eine Nachricht in den Teams-Chat des Meetings und erinnert die Teilnehmer an die Vorbereitung der Aufgaben für die kommende Woche.

Da man auf Chat-Nachrichten von „echten“ Kollegen lieber reagiert als auf einen Chat-Bot, habe ich den Flow so gebaut, dass er die Erinnerungstexte und Erinnerungszeiten dynamisch variiert, um die Automation dieser Aufgabe etwas zu verschleiern. Bleibt nur zu hoffen, dass keiner meiner Kollegen diesen Blog liest 😉
Ich verwende als Anzeigesprache in Power Automate Englisch, da dies den Abgleich mit Hilfe, Dokumentation und Tutorials aus der Community erleichtert. Ich habe zur Erstellung des Reminders einen leeren Flow verwendet und nicht auf ein Template zurückgegriffen. Als Trigger für meinen Reminder kommt „When an upcoming event is starting soon (V3)“ des Office 365 Outlook Connector zum Einsatz. Dort kann der Kalender ausgewählt werden in dem sich die Termine befinden und die Look-Ahead Time in Minuten definiert werden. Diese habe ich auf 90 Minuten gesetzt.

Da Variablen immer auf der ersten Ebene initialisiert werden müssen, lege ich direkt nach dem Trigger drei Arrays an, aus denen ich später meine Erinnerungstexte zusammensetze. Die drei Teile sind eine Begrüßung und ein Reminder-Text gefolgt von einem Emoji. Hierzu wird je dreimal die Action Initialize Variable eingefügt. Ich habe die Namen Reminder, Greeting und Emoji verwendet und jeweils den Typ auf Array gesetzt. Zuletzt kann man im Feld Value die Inhalte der Arrays definieren. Die einzelnen Items werden in Anführungszeichen gesetzt und mittels Kommata getrennt. Das Array wird von eckigen Klammern umschlossen (siehe folgende gekürzte Liste).
[
"Kleine Erinnung: Bitte eure Aufgaben für die kommende Woche vorbereiten!",
"Vergesst nicht, eure Aufgaben für die nächste Woche vorzubereiten.",
"Denkt daran, eure User Stories für die nächste Woche vorzubereiten.",
"Vergesst nicht, eure Tasks für die kommende Woche vorzubereiten.",
"Denkt daran, eure User Stories für die kommende Woche zu erstellen.",
"Vergesst nicht, eure Tasks für die kommende Woche vorzubereiten.",
"Bitte sorgt dafür, dass ihr eure Work Items für die Planung erstellt habt.",
"Denkt bitte daran, eure Aufgaben für die kommende Woche vorzubereiten!",
"Vergesst bitte nicht, eure Aufgaben für die nächste Woche vorzubereiten."
]
Die Emoji bekommt man auf die gleiche Weise in das Array. Um die Emojis im Editor in Power Automate einzugeben muss man die Tastenkombination Windows-Taste und Punkt drücken und kann dann über das Widget die Emojis auswählen.

Die Inhalte für den Reminder habe ich mir übrigens von Chat GPT generieren lassen 😉 Dieses Tool und seine Auswirkungen auf unsere künftige Arbeitsweise wird sicher noch einen eigenen Blog-Artikel erhalten.

Da ich nur in Meetings mit den Begriffen „Replenishment Meeting“ im Titel Erinnerungen versenden möchte, muss ich zunächst prüfen, ob das Subject nicht evtl. leer ist, damit der Flow nicht mit einem Fehler abbricht. Das erreiche ich indem ich das Subject des Triggers darauf prüfe, dass es nicht Null (Expression) ist. Hierzu wird eine weitere Action über Control -> Condition eingefügt.

Wenn das Subject nicht leer ist, prüfe ich in einer weiteren Condition ob das Subject den gesuchten Begriff enthält und es sich auch um ein Microsoft Teams Meeting handelt. Da Outlook beim Anlegen einer Teams-Besprechung in den Ort die Zeile „Microsoft Teams-Besprechung“ einträgt, lässt sich dies relativ einfach abfragen.

Im nächsten Schritt kommt der komplizierteste Teil. Man muss sich die Conversation ID des Teams-Chats zu der Outlook-Besprechung aus dem Body des Termins heraussuchen. Hierzu verwende ich ein Compose in dem ich den Body mittels der Expressions Trim und Split zerlege. Die gesuchte Conversation ID steht zwischen dem String meetup-join/
und dem darauffolgenden /
.
trim(first(split(split(triggerOutputs()?['body/body'],'meetup-join/')[1],'/')))
Damit die Chat-Nachrichten nicht immer zur selben Uhrzeit gesendet werden habe ich einen Delay zwischen 1 und 30 Minuten eingebaut, dessen Dauer mit der Expression rand(1,30)
definiert wird.

Zuletzt folgt das Versenden der Chat-Nachricht über den Teams Connector mit der Action „Post message in a chat or channel“. Durch die Auswahl Post as User wird die Nachricht von meinem Account versendet. Im Feld Group chat muss der Output des Compose der Conversation ID eingesetzt werden. Die Message wird aus den drei Arrays zusammengebaut und beginnt mit der Begrüßung variables('Greeting')[rand(0,19)]
gefolgt von dem Reminder variables('Reminder')[rand(0,19)]
und einem Emoji variables('Emoji')[rand(0,13)]
. Über die eckigen Klammern wird auf die einzelnen Elemente der Arrays zugegriffen. Auch hier kommt wieder ein Randomizer zum Einsatz, der auf die Größe der Arrays angepasst werden muss. Bitte beachtet, dass der Index bei 0 beginnt. Für ein Array mit 14 Einträgen erfolgt die zufällige Auswahl eines dieser Elemente mittels rand(0,13)
.

Der vollständige Flow sieht am Ende wie folgt aus:
