Viele kennen das – am letzten Arbeitstag im Monat vor dem Urlaub oder zu anderen Terminkonstellationen müssen bestimmte Aufgaben erledigt werden. Solche regelmäßigen Aufgaben können in der Hektik der Urlaubsübergabe oder auch sonst schnell in Vergessenheit geraten. Glücklicherweise bietet Microsoft Power Automate die Möglichkeit, automatisiert eine Erinnerung zu verschicken. Wie das funktioniert, soll hier anhand eines Beispiels für den letzten Arbeitstag eines Monats gezeigt werden.
Zielsetzung und Voraussetzungen
Das Ziel ist, an regelmäßig auszuführende Aufgaben erinnert zu werden. Dabei heißt regelmäßig aber nicht, dass die Aufgaben in festen Abständen zu erledigen sind, sondern zu mehr oder weniger individuellen Zeiten. Diese sind z. B. davon abhängig, wann man selbst Urlaub, Überstundenausgleich oder andere regelmäßige und dennoch terminabhänge Kalendereinträge hat (z. B. Feiertage). Das hier aufgeführte Beispiel stützt sich dabei auf einen ordentlich gepflegten Outlook-Terminkalender.
Wie schon erwähnt, werden die Termineinträge schließlich in einem Flow (MS Power Automate) abgefragt und als Trigger für weitere Aktionen verwendet. Ein Microsoft-Konto mit der Möglichkeit, Power Automate zu nutzen, ist daher Voraussetzung.
In unserem Beispiel soll ein Mitarbeiter am letzten Arbeitstag eines Monats daran erinnert werden, seine Stunden zu prüfen. Im Anschluss kann er seinen Vorgesetzten informieren und sich die Stunden genehmigen lassen.
Kalendereinträge – Planung ist (fast) alles
Um erfolgreich am richtigen Tag erinnert werden zu können, sind Kalendereinträge notwendig. Dabei ist es sinnvoll, dass die verschiedenen Arten der Kalendereinträge (Urlaub, Überstundenausgleich, Feiertage, …) stets einheitlich definiert werden. Dies ist im Falle von Urlaubseinträgen leicht: „Urlaub" oder andere gängige Abkürzungen (z. B. „U", „JU" oder „ÜA" für Überstundenausgleich) sollten verwendet werden. Darüber hinaus sollte klar definiert sein, welche Ereignisse relevant sind. Urlaub, Überstundenausgleich oder Feiertage haben beispielsweise einen Einfluss darauf, welcher Tag des Monats der letzte Arbeitstag eines Mitarbeiters ist. Eine Krankmeldung zählt zu den nicht vorhersehbaren Ereignissen, welche eine rechtzeitige Erinnerung potenziell aushebeln können.
Wichtig sind für unser Beispiel demnach Einträge, die Urlaub, Überstundenausgleich und/oder Feiertage festlegen. Ein Eintrag wie beispielsweise „Weihnachten" sollte über ein zusätzliches Attribut (z. B. das Attribut „Kategorie") der Gruppe der „Feiertage" zugeordnet werden. Bestenfalls ist zusätzlich definiert, ob der Feiertag nur für bestimmte Regionen zutrifft. Auch Wochenenden können den letzten Arbeitstag bestimmen. Sie sind aber recht einfach über die Nummer des Wochentages zu identifizieren.
Abbildung 1: Einträge im Outlook-Kalender
Schritte zum „Erinnere mich"
Mit einem Power-Automate-Zugriff und den entsprechenden Kalendereinträgen kann direkt mit der Umsetzung der individuellen und automatisierten Erinnerung begonnen werden. Im Folgenden sind die einzelnen Schritte in Fotostrecken dargestellt.
Schritt 1: Neuen Flow erstellen
Abbildung 2: Geplanten Cloud-Flow erstellen
Über den Button „+ Neuer Flow“ kann ein „Geplanter Cloud-Flow“ erstellt werden.
Abbildung 3: Geplanten Cloud-Flow erstellen
Ein passend gewählter Name hilft beim Wiederfinden des Flows. Unser Flow soll täglich um 7:30 Uhr ausgeführt werden.
Schritt 2: Neuen Schritt (Aktion) anlegen
Abbildung 4: Neuen Schritt hinzufügen
Nach der Erstellung des neuen Flows wird die Bearbeitungsseite angezeigt. Der erste angezeigte Schritt ist der Einstiegspunkt des Flows und stellt den Trigger (Wecker-Symbol – Recurrence) für die Ausführung dar. Darunter findet sich der Button „+ Neuer Schritt“. Mit diesem kann die nächste Aktion im Flow erstellt werden.
Abbildung 5: Aktionen zu Variablen suchen
Um später eine gewisse Logik im Flow verwenden zu können, werden zu Beginn Variablen definiert und initialisiert. In der Suche kann nach „Variable“ gesucht werden …
Abbildung 6: Aktion "Variable initialisieren" auswählen
… und anschließend in den Suchergebnissen „Variable initialisieren“ ausgewählt werden (violettes Symbol {x} für Variablen-Funktionen).
Abbildung 7: Namen, Typ und Wert der Variablen festlegen
In diesem Schritt wird der Name, der Typ und der Wert der Variablen deklariert.
Abbildung 8: Initialisierte Variablen
🠗 Siehe Tabelle unter diesem Bild. 🠗
Abbildung 9: Initialisierte Variablen
🠗 Siehe zweiter Text unter der Tabelle unter diesem Bild. 🠗
(Zu Abbildung 8 + 9) Die nächsten Schritte sind die Initialisierungen vier weiterer Variablen:
Name |
Datentyp |
Wert |
tempLetzterTag |
Zeichenfolge |
--- (Wert wird nicht festgelegt)
|
TagStatus | Boolescher Wert |
fx(true)
|
LetzterTagImMonat | Zeichenfolge |
<letzter Tag im Monat> *
|
letzterArbeitstagImMonat | Zeichenfolge |
<letzter Arbeitstag im Monat> **
|
* Der Wert des letzten Tages im Monat wird ebenso über das Pop-Up Fenster „Dynamischer Inhalt" im Reiter „Ausdruck" festgelegt. Der Ausdruck ist folgender:
formatDateTime(subtractFromTime(startOfMonth(addToTime(utcNow(),1,'month')),1,'day'),'yyyy-MM-dd')
** Der letzte Arbeitstag im Monat muss ein Werktag (Mo. – Fr.) sein. Daher wird hier eine if-Abfrage verwendet, die prüft, ob der letzte Tag im Monat (Variable LetzterTagImMonat) auf ein Wochenende fällt. Ist das der Fall, so wird von diesem Tag auf den davorliegenden Freitag zurückgerechnet (Sa. – 1; So. - 2). So werden bei der Initialisierung der Variablen des letzten Arbeitstages im Monat die Wochenenden schon berücksichtigt:
formatDateTime(if (equals(dayOfWeek(variables('LetzterTagImMonat')),0),subtractFromTime(variables('LetzterTagImMonat'),2,'day'),if (equals(dayOfWeek(variables('LetzterTagImMonat')),6),subtractFromTime(variables('LetzterTagImMonat'),1,'day'),variables('LetzterTagImMonat'))),'yyyy-MM-dd')
Schritt 3: Wiederholen bis
Abbildung 10: Aktion "Steuerung > Wiederholen bis" auswählen
Dieser neue Schritt entspricht einer Schleife und beinhaltet weitere Schritte. In der Auswahl von Aktionen wird die Kategorie „Steuerung“ ausgewählt. Unter den angebotenen Aktionen findet sich die nun benötigte „Wiederholen bis“.
Abbildung 11: Variable "weiterSchleifen" als Bedingung setzen
Hier wird die Abbruch-Bedingung festgelegt. Als Wert wird die Variable „weiterSchleifen“ verwendet.
Abbildung 12: Wiederholen bis - Abbruch-Bedingungen
Diese wird mit dem Vergleichsoperator „ist gleich“ mit dem Ausdruck „false“ verglichen.
Schritt 4: Kalendereinträge abrufen
Abbildung 13: Aktion "Kalenderansicht der Termine abrufen (V3)" auswählen
Innerhalb der „Wiederholen bis“ Box können nun über „Aktion hinzufügen“ Aktionen erstellt werden, die ausgeführt werden, bis die zuvor angelegte Bedingung erfüllt ist – wie in einer klassischen While-Schleife.
Die erste Aktion ermittelt die Kalendereinträge für den letzten Arbeitstag im Monat (Variable „letzterArbeitstagImMonat“ – Wochenenden schon berücksichtigt). Dazu wird in den Aktionen der Eintrag „Office 365 Outlook > Kalenderansicht der Termine abrufen (V3)“ ausgewählt.
Abbildung 14: Kalender, Start- und Endzeit für Termin-Abruf auswählen
Hier muss nun der zu verwendende Kalender (Kalender-ID: als Dropdown) sowie der Zeitraum ausgewählt werden, aus welchem die Kalendereinträge abgerufen werden sollen. Als Zeitraum wird der letzte Arbeitstag des Monats eingetragen. Dies gelingt über die Variable „letzterArbeitstagImMonat“. Ist diese für Start- und Endzeit ausgewählt, muss die Zeichenfolge noch etwas erweitert werden, da in diesen Feldern ein bestimmtes Format erwartet wird (2021-12-31T08:00:00). Die relevanten Termine wie „Urlaub“ oder eingetragene Feiertage sind normalerweise ganztätige Ereignisse und werden für den Zeitraum von 01:00 Uhr bis 21:00 Uhr detektiert. Zeitpunkte, welche zu nah an Mitternacht grenzen (z.B. 00:01 oder 23:59 Uhr) haben bei unseren Tests zu Problemen bei der Berechnung des letzten Arbeitstages geführt.
Unter Umständen werden mehrere Kalendereinträge zurückgegeben, weshalb die nächste Aktion „Auf alle anwenden“ verwendet wird.
Schritt 5: Auf alle Kalendereinträge anwenden
Abbildung 15: Folgende Aktionen auf alle Kalendereinträge anwenden
Hier wird eine weitere Verschachtelung eingebaut, da alle zurückgegebenen Kalendereinträge ausgewertet werden müssen. Daher wird die Aktion „Steuerung > Auf alle anwenden“ hinzugefügt – diese kann als eine for-each-Schleife verstanden werden.
Abbildung 16: Auf alle anwenden - "value" als Verarbeitungswert
Dazu muss ausgewählt werden, mit welchen Werten, bzw. Objekten weitergearbeitet wird – „*Ausgabe von vorherigen Schritten auswählen“. Durch einen Klick in das Feld, werden wieder dynamische Inhalte angeboten. Somit kann bis zum Eintrag „value“ heruntergescrollt und dieser ausgewählt werden.
In dieser Schleife soll jeder Kalendereintrag („value“) verarbeitet werden. Hierfür werden im nächsten Schritt weitere Aktionen erstellt.
Schritt 6: Bedingung – Prüfen auf Feiertage
Abbildung 17: Bedingung – „Feiertag“ als Kategorie
Die nächste Aktion prüft, ob der untersuchte Kalendereintrag auf einen Feiertag hinweist. Dazu muss der verwendete Kalender auch die Feiertage enthalten. Für jeden Kalendereintrag kann und muss für das vorliegende Vorgehen eine Kategorie hinterlegt werden. Bei Feiertagen sollte diese z. B. „Feiertag“ heißen. Ist die Kategorie im Kalendereintrag nicht hinterlegt, muss sie vorher im Kalender gesetzt werden. Diese kann als Bedingung verwendet werden. Um dies umzusetzen wird die Aktion „Steuerung > Bedingung“ gewählt. Als Wert für die erste Bedingung wird unter „Dynamischer Inhalt“ der Eintrag „Kategorien“ verwendet.
Abbildung 18: Bedingungen - Feiertag (regional)
Es wird überprüft, ob der Wert das Wort „Feiertag“ enthält.
Ein Aspekt ist weiterhin, ob ein Feiertag nur regional zu beachten ist. In diesem Fall werden sie allerdings nicht beachtet, da das Modell in Hessen verwendet wird und damit so gut wie alle regionalen Feiertage wegfallen. Ist das in anderen Bundesländern nicht der Fall, müsste hier noch ein wenig nachgearbeitet werden. Voraussetzung ist dabei, dass im Betreff bzw. Titel des Eintrages der Hinweis „regional“ hinterlegt ist, wenn sich der Feiertag nur auf bestimmte Regionen bezieht. Alternativ könnte hier mit Hinweisen auf das Bundesland gearbeitet werden.
Abbildung 19: Bedingungen - Feiertag (regional)
Für den vorliegenden Anwendungsfall reicht der Abgleich des Betreffs im Kalendereintrag. Dieser darf nicht das Wort „regional“ enthalten, damit der Eintrag ein valider Feiertag ist.
Die beiden Bedingungen („Feiertag“ und „nicht regional“) müssen gleichzeitig zutreffen. Daher werden sie mit dem UND-Operator verknüpft.
Abbildung 20: Bedingungen - Feiertag (regional)
Wenn die Bedingungen erfüllt sind („Wenn ja“-Fall), kann die Variable TagStatus auf false gesetzt werden und das weitere Prüfen des Kalendereintrages ist überflüssig. Dies ist über die Aktion „Variable festlegen“ möglich.
Treffen die Bedingungen allerdings nicht zu („Wenn nein“-Fall), so kann in einer weiteren Bedingung überprüft werden, ob ein Eintrag für Urlaub oder Überstundenausgleich vorliegt. Dies gehört in den nächsten Schritt.
Schritt 7: Bedingung – Urlaub und Überstundenausgleich
Abbildung 21: Bedingung - Urlaub und ÜA über Betreff festlegen
Im „Wenn nein“-Fall des vorangegangenen Schrittes wird eine neue Bedingung hinzugefügt. Als Wert wird über den dynamischen Inhalt der „Betreff“ der Kalenderansicht ausgewählt.
Abbildung 22: Bedingungen für Urlaub und ÜA
Es ist jeweils für Urlaub und für Überstunden eine Zeile notwendig. Die beiden Bedingungen werden mit dem ODER-Operator verknüpft, da entweder das eine oder das andere eintreten kann, damit die Bedingung wahr wird. Der Betreff muss also „Urlaub“ oder „Ueberstunden“ im Text enthalten, damit der „Wenn ja“-Fall eintritt. Der enthaltene Text ist individuell zu wählen, je nachdem, wie die eigenen Urlaubs- und Überstundenausgleichs-Einträge hinterlegt sind.
Abbildung 23: Wenn ja, TagStatus auf false setzen
Wenn die Bedingungen nicht zutreffen, kann der Tag als normaler Arbeitstag verstanden und der Flow kann beendet werden.
Ist allerdings eine der beiden Bedingungen wahr und für den Tag ist Urlaub oder Überstundenausgleich eingetragen, so wird die Variable TagStatus auf false gesetzt. Damit ist die Verarbeitung des aktuellen Kalendereintrages abgeschlossen und der nächste ist an der Reihe.
Schritt 8: Prüfen, ob die Schleife abgebrochen wird oder weiterlaufen muss
Abbildung 24: Bedingung "Schleifenabbruch" hinzufügen
Nach der Verarbeitung aller Kalendereinträge ist der Block „Auf alle anwenden“ abgeschlossen und es muss geprüft werden, ob ein weiterer Schleifendurchlauf („Wiederholen bis“) notwendig ist. Daher wird eine weitere Bedingung „Schleifenabbruch“ hinzugefügt.
Abbildung 25: Schleifenabbruch prüfen - TagStatus gleich true?
Ist der TagStatus gleich true?
Abbildung 26: TagStatus gleich true – Schleifenabbruch
Wenn ja, wird die Variable weiterSchleifen auf false gesetzt und die Schleife wird damit abgebrochen, da dies die Abbruchbedingung des Blocks „Wiederholen bis weiterSchleifen gleich false (letzten Tag berechnen)“ ist.
Abbildung 27: Schleifenabbruch - kein Abbruch - dekrementiere tempLetzterTag
Bei „Wenn nein“ wird es aufwendiger, da die entsprechenden Variablen für den nächsten Schleifendurchgang angepasst werden müssen. Für die Variable tempLetzterTag muss ein Tag von dem vorherigen abgezogen werden: subtractFromTime(variables('letzterArbeitstagImMonat'), 1, 'day', 'yyyy-MM-dd'). …
Abbildung 28: Variablen für nächsten Schleifendurchlauf setzen
Nachdem die Variable tempLetzterTag geändert wurde, kann erneut geprüft werden, ob der neue Tag auf ein Wochenende fällt. Dementsprechend wird die Variable letzterArbeitstagImMonat durch die erneute Zuweisung aktualisiert. formatDateTime(if (equals(dayOfWeek(variables('tempLetzterTag')),0),subtractFromTime(variables('tempLetzterTag'),2,'day'),if (equals(dayOfWeek(variables('tempLetzterTag')),6),subtractFromTime(variables('tempLetzterTag'),1,'day'),variables('tempLetzterTag'))),'yyyy-MM-dd')
Weiterhin wird die Variable TagStatus wieder auf true gesetzt, damit sie, wenn nötig, im neuen Schleifendurchlauf wieder auf false gesetzt werden kann.
Die Schleife wird wiederholt, solange der berechnete Tag auf ein Wochenende fällt, ein Feiertag ist oder Urlaub bzw. Überstundenausgleich im Kalender eingetragen ist.
Schritt 9: Letzte Bedingung – ist heute der zuvor berechnete letzte Arbeitstag im Monat?
Abbildung 29: Prüfen, ob heute der letzte Arbeitstag ist
Schließlich, nach allen benötigten Schleifendurchgängen, kann überprüft werden, ob der heutige Tag dem letzten Arbeitstag im Monat entspricht. Dies wird mit dem simplen Vergleich der Variablen letzterArbeitstagImMonat mit dem heutigen Tag erreicht. Der Ausdruck für den aktuellen Tag ist folgender:
formatDateTime(utcNow(),'yyyy-MM-dd')
Abbildung 30: Notification - E-Mail-Benachrichtigung erstellen
Ist die Bedingung nicht wahr, der heutige Tag also nicht der letzte Arbeitstag im Monat, so wird keine weitere Aktion durchgeführt.
Ist der Vergleich jedoch positiv, so kann im „Wenn ja“-Pfad eine Erinnerungsmail eingestellt werden. Beim Hinzufügen der neuen Aktion wird nach „Notification“ gesucht …
Abbildung 31: Notification - individuellen Text für die E-Mail festlegen
… und die Aktion „E-Mail-Benachrichtigung erhalten“ ausgewählt. Hier können Betreff und Text nun individuell festgelegt werden. Es hat sich gezeigt, dass die Notification nicht immer einwandfrei funktioniert, weshalb auch eine normale Mail über die Aktion “Mail senden” verschickt werden kann.
Abbildung 32: Alternativ zur E-Mail - ToDo erstellen
ALTERNATIVE zur Mail: Wer MS To-Do verwendet, kann sich als Alternative auch eine Aufgabe mit entsprechenden Angaben erstellen und für diese gleichzeitig eine Erinnerung zu einem bestimmten Zeitpunkt setzen. Dies funktioniert mit der Aktion „To-Do hinzufügen (V3)“. Auch hier am besten den Flow jeden Tag morgens laufen lassen, damit Änderungen im Kalender erkannt werden und die Erinnerung noch rechtzeitig ihre Aufgabe erfüllen kann.
Der gesamte Flow sieht nun wie folgt aus – die einzelnen Blöcke mit den Details sind zusammengeklappt (Ausnahme: Wiederholen bis):
Abbildung 33: Gesamter Flow
Zum Schluss
Das Zusammenspiel verschiedener Microsoft-Komponenten kann den Arbeitsalltag vereinfachen, wenn die Zeit es erlaubt, ein wenig herumzuexperimentieren. So ist z. B. die automatisierte Erinnerung zu einem bestimmten Zeitpunkt möglich – hier am letzten Arbeitstag im Monat. Benötigt wird ein bisschen Outlook, etwas von der Cloud und ein Hauch von zeitlicher Flexibilität, um sich mit dem Thema zu befassen.
Sollte die zuletzt genannte Zutat fehlen, ist auch der Download des Flows als ZIP-Datei möglich. Dieser lässt sich in diesem Format leicht in der eigenen Power Automate Umgebung importieren – wenn der hier beschriebene Anwendungsfall auch für Sie interessant ist. Wichtig beim Import ist, dass der Flow als neuer Flow erstellt wird (Schraubenschlüssel anklicken) und die eigene E-Mail-Adresse bzw. der MS Account hinterlegt wird. Weiterhin muss nach dem Import der eigene Kalender ausgewählt werden (über „Flow bearbeiten").
Ansonsten sind Ihre Einsatzgebiete gefragt. Setzen Sie Ihre Ideen doch gleich um und teilen Sie diese gerne mit uns – über einen Kommentar zu diesem Artikel.
Vielleicht wäre eine automatisch erstellte Abwesenheitsnotiz möglich.
Kommentare