SharePoint Online bietet die Möglichkeit mittels einer einfachen JSON Formatting Datei das Aussehen von Listenansichten komplett zu verändern. Zum Beispiel kann das Aussehen und Verhalten eines Feldes in einer Ansicht geändert werden, aber auch die gesamte Ansicht. Häufig wird diese Funktionalität aber auch einfach dafür verwendet, um bestimmte Zeilen in einer Liste hervorzuheben und auf sie hinzuweisen.
Zum Beispiel
- Markiere alle Elemente, die in einem bestimmten Status sind.
- Markiere alle Elemente, bei denen ein Wert eine bestimme Summe übersteigt.
- Markiere alle Elemente, bei denen ein Datum in der Vergangenheit liegt.
Das ist alles einfach zu formulieren und unter
https://pnp.github.io/List-Formatting
findet ihr viele Beispiele dafür. Eine komplette Liste der Funktionen, die man zum Berechnen benutzen kann, gibt es bei Microsoft Learn.
Wenn ihr dort aber nach einer "WEEKDAY"-Funktion sucht, also nach einer Funktion, die euch den Wochentag zu einem Datum berechnet, dann werdet ihr da nicht fündig werden. So eine Funktion gibt es nicht.
Aber wir können sie selbst nachbauen.
Hervorheben einer Zeile
Zunächst kümmern wir uns aber erstmal um die Grundstruktur der JSON-Datei, die wir im Folgenden benutzen wollen. Als Beispiel werde ich hier eine Zeile in der Listenansicht hervorheben, wenn eine bestimmte Bedingung eintritt.
Dafür müssen wir nur die "additionalRowClass" abhängig von einer Bedingung setzen.
{
"$schema": "https://developer.microsoft.com/json-schemas/sp/v2/row-formatting.schema.json",
"additionalRowClass": "=if(<irgendwas>==<irgendwas>,'ms-bgColor-themeLighter ms-bgColor-themeLight--hover','')"
}
Unsere WEEKDAY Funktion
Dann können wir die fehlende WEEKDAY Funktion mittels ein wenig Mathematik nachbilden.
Mit dem Token
=@now
bekommen wir das aktuelle Datum und darauf aufbauend mit dem Ausdruck
=Number(Date(@now))
die aktuelle Anzahl von Millisekunden seit Donnerstag, dem 01.01.1970 UTC.
Indem wir das durch die Anzahl von Millisekunden in einem Tag teilen
=floor(Number(Date(@now))/ 86400 / 1000)
erhalten wir die Anzahl der Tage seitdem.
Der 01.01.1970 UTC war ein Donnerstag, daher müssen wir zu dieser Summe 4 hinzufügen, um den Sonntag als Start der Woche auszuwählen (Wenn ihr den Montag als Start der Woche haben wollt, dann müsst ihr hier 5 hinzufügen).
Nun können wir diese Summe durch 7 teilen und erhalten die Anzahl der Wochen seit dem 01.01.1970 und einen Rest von Wochentagen. Dieser Rest interessiert uns und wir bekommen ihn mittels der "Modulo" Funktion ("%").
=(floor(Number(Date(@now))/ 86400 / 1000)+4) % 7
Das gibt uns einen Wert zwischen 0 und 6 für den im Moment aktuellen Wochentag in London.
Um das nun wiederum an unsere lokale Zeitzone anzupassen, müssen wir den Zeitstempel 01.01.1970 00:00 noch die Verschiebung mitgeben, die wir in unserer lokalen Zeitzone haben. Ich mach das hier, indem ich die Zeit in Millisekunden vom Zeitstempel 01.02.2020 von 1577836800000 abziehe (Der UTC Zeit in Millisekunden vom "01.01.2020" in London).
=1577836800000-Number(Date('01.01.2020')
Wenn wir das alles zusammenfügen, erhalten wir die folgende „WEEKDAY“ Funktion zum Berechnen des aktuellen Wochentages.
=(floor(((Number(Date(@now))+1577836800000-Number(Date('01.01.2020')))/ 86400 / 1000)+4) % 7
by the way
Mittels derselben Berechnung können wir auch unsere lokale Zeitzone als Unterschied in Stunden von UTC berechnen
=floor((1577836800001-Number(Date('01.01.2020')))/3600 / 1000)
Diese Funktion gibt uns einen Stundenunterscheid zwischen -12 und 12 und sagt uns, um wie viele Stunden uns unsere lokale Zeitzone von UTC unterscheidet (Ich habe 1 zu 1577836800000 hinzugefügt, um sicherzustellen, dass wir keinen "DIVISION BY ZERO" Fehler bekommen, wenn wir in London sind. Die "floor" Funktion gleicht die 1 dann wieder aus).
Alles Zusammen
Damit erhalten wir dann das folgende JSON-Template:
{
"$schema": "https://developer.microsoft.com/json-schemas/sp/v2/row-formatting.schema.json",
"additionalRowClass": "=if([$DayOfWeek] == (floor(((Number(Date(@now))+1577836800000-Number(Date('01.01.2020')))/ 86400 / 1000)+4) % 7),'ms-bgColor-themeLighter ms-bgColor-themeLight--hover','')"
}
Wenn wir eine Liste mit dieser Spalte erstellen:
Field | Type |
---|---|
Weekday | Nummer |
und dann die folgenden Werte Eintragen
Weekday | Nummer |
---|---|
Sunday | 0 |
Monday | 1 |
Tuesday | 2 |
Wednesday | 3 |
Thursday | 4 |
Friday | 5 |
Saturday | 6 |
Die Ansicht sieht an einem Sonntag dann so aus:
und an einem Mittwoch so:
Die Dateien
Dieses Beispiel ist im PNP Github Repository verfügbar:
https://github.com/pnp/List-Formatting/tree/master/view-samples/highlight-rows-current-weekday