SharePoint Json List Formatting und die nicht existierende WEEKDAY Funktion

SharePoint Json List Formatting und die nicht existierende WEEKDAY Funktion

Fr. Dez. 09 2022
SharePoint Keine Kategorien zugewiesen

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.

PLAINTEXT

{
  "$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:

PLAINTEXT

{
  "$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:

FieldType
WeekdayNummer

und dann die folgenden Werte Eintragen

WeekdayNummer
Sunday0
Monday1
Tuesday2
Wednesday3
Thursday4
Friday5
Saturday6

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↗