SharePoint Json List Formatting und die nicht existierende WEEKDAY Funktion

Es gibt keine Funktion beim JSON List Formatting, mit der sich der Wochentag berechnen lässt. Man kann ihn aber selbst berechnen.

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: Sunday

und an einem Mittwoch so: Wednesday

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

Hat dir das gefallen? Vielleicht magst du auch...

Die versteckte SharePoint Benutzerinformationsliste

In einer versteckten Liste speichert SharePoint Informationen über Benutzer

Quick Tip: Eine Communication Site als Subsite anlegen

Man kann über die UI keine Communication Site als Subsite anlegen. Per Powershell geht es aber problemlos.

Quick Tip: Tage bis zu einem Datum in einer Listenspalte anzeigen

Über eine SharePoint Listenformatierung kann man einfach darstellen, wie viele Tage noch bis zu einem Datenwert verbleiben