Spreadsheet Freemarker-Funktionen
Diese Seite beschreibt Funktionen eines Spreadsheet-Objektes (siehe Spreadsheets) mit den dazugehörigen Objekten für Zeilen Row und Spalten Col.
Diese Funktionen sind in der Regel im Mapper anwendbar oder in allen anderen Steps, die Freemarker-Skripte verarbeiten wie z.B. der TextHtmlWriter.
Voraussetzung
Zum Verständnis dieser Seite ist es hilfreich sich auch mit der Seite Scripting zu befassen.
Spreadsheet | Funktion | Attribute | Rückgabewert | Beispiel | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|
getName() | Gibt den Namen des Spreadsheets aus. | - | string | ||||||||
getNumberHeaderCols() | Gibt die Anzahl der Spalten in der Kopfzeile aus. | - | int | Anzahl Spalten des Spreadsheet: ${myspreadsheet.getNumberHeaderCols()} | |||||||
getHeader() | Gibt das Zeilenobjekt (siehe Row) der Kopfzeile zurück. | - | Row | Listet alle Spaltentitel Semikolon-getrennt auf: ${myspreadsheet.getHeader()?join(";")} Listet alle Spaltentitel auf, die mit "price_" beginnen: ${myspreadsheet.getHeader().getCols()?filter(headercol -> headercol.title?starts_with("price_"))?join(";")} <#if myspreadsheet.getHeader().getCols()?seq_contains("description")>Ja Spalte "description" ist enthalten<#else>Nein, nicht gefunden</#if> Kurzschreibweise: Statt .getHeader().getCols() kann man auch .header.cols schreiben. | |||||||
hasRows() | Gibt true zurück, wenn das Spreadsheet mindestens eine (Daten-)Zeile enthält | - | boolean | <#if !spreadsheet@SearchMasterDatastore_1.hasRows()>Das Spreadsheet ist leer bzw. hat keine Datenzeilen. </#if> <#if !(spreadsheet@SearchMasterDatastore_1?? && spreadsheet@SearchMasterDatastore_1.hasRows())> Das Spreadsheet ist leer oder existiert nicht. </#if> | |||||||
getRows() | Gibt alle Zeilen (siehe Rows) des Spreadsheets zurück - ohne Kopfzeile. | - | List<Row> | <#list spreadsheet@SearchMasterDatastore_1.getRows() as row>${row['id']}</#list> Iteriert über alle Zeilen des Spreadsheets und gibt pro Zeile den Wert der Spalte id aus. | |||||||
firstRow(String columnName) | Gibt die angegebene Spalte (columnName) aus der ersten Zeile des Spreadsheet zurück | string | Col | Wert der Spalte "status" der ersten Zeile: ${output@SpreadsheetUrlDownload_2.firstRow("status")!} Gibt den Wert der Spalte "Status" in der ersten Zeile aus. | |||||||
firstRow(String columnName, String defaultValue); | Wie firstRow(String columnName), gibt aber den defaultValue aus, falls die Spalte nicht vorhanden ist | string, string | string | Wert der Spalte "status" der ersten Zeile: ${output@SpreadsheetUrlDownload_2.firstRow("status", "open")!} Gibt den Wert der Spalte "Status" in der ersten Zeile aus. Falls der Wert leer ist oder nicht existiert, wird der Default-Wert "open" zurück gegeben. | |||||||
meta.map@KeyValueSpreadsheet.get(String Key) | Gibt aus einem vorher erstellen KeyValueSpreadsheet, den Value des angegeben Keys zurück | string | string | Wert des Key1 aus KeyValueSpreadsheet1: ${meta.map@KeyValueSpreadsheet_1.get(Key1)} | |||||||
Row | |||||||||||
| |||||||||||
getCols() | Gibt alle Spalten der Zeile zurück. | - | ColumnList bzw. List<Col> | ${row.getCols()?join(",")} Fügt alle Spaltenwerte kommasepariert zusammen. ${row.getCols()?filter(col -> col.getTitle()!?starts_with('price'))?join(",")} Fügt alle Spaltenwerte kommasepariert zusammen, von Spalten, deren Titel mit dem Wort "price" beginnt. | |||||||
getRowNumber() | Gibt die aktuelle Zeilennumer aus. | - | int | Aktuelle Zeilennummer: ${row.getRowNumber()} | |||||||
["headerColName"] | Gibt die Spalte (Col) zum Spaltennamen. | string | Col | Der Wert der Spalte 'status' ist: ${row["status"]!}. Alternativ würde auch die Langform ${row.get("status")!}funktionieren. | |||||||
val("headerColName") | Sehr ähnlich zu ["headerColName"] aber der Wert der Spalte wird automatisch in den Datentyp umgewandelt, der im ContentType des Schemas hinterlegt ist. | string | String / List / Map | Siehe Beispiele zur .val Funktion | |||||||
isValid() | Prüft ob alle Spalten entsprechend der Schema-Definition valide sind | - | boolean | <#list spreadsheet@SearchMasterDatastore_1.getRows() as row> <#if row.isValid()> Alle Spalten entsprechend dem im Datastore-Schema definierten Regeln (z.B. Pflichtfeld, Reg-Ex, Erlaubte Werte...) </#if> </#list> | |||||||
parent(String columnName) | Gibt die angegebene Spalte aus der Parentzeile (falls vorhanden) zurück. | string | Col | Dies funktioniert nur bei Variant-Zeilen, die aus einem Datastore per SearchDatastore Step kommen. Siehe auch Auf Relationen zugreifen und Datastores - HierarchischeDaten. ${parent['columnname']!} - greift auf eine Spalte der Parent-Zeile zu <#if row.parent()??>ja, ist Variante, weil Parent vorhanden<#else>Nein, ist keine Variante, da kein Parent vorhanden</#if> | |||||||
master(String columnName) | Gibt die angegebene Spalte aus der Master-Zeile (falls vorhanden) zurück. | string | Col | Dies funktioniert nur bei Zeilen, die aus einem Child-Datastore per SearchDatastore Step kommen. Siehe auch Auf Relationen zugreifen und Datastores - HierarchischeDaten. ${master['columnname']!} - greift auf eine Spalte der Master-Zeile zu <#if row.master()??>ja, ist Child-Zeile, weil Master vorhanden<#else>Nein, ist keine Child-Zeile, da kein Master vorhanden</#if> | |||||||
variants() | Gibt alle Varianten-Zeilen (sofern vorhanden) der aktuellen Parent-Zeile zurück. | List<Row> | Dies funktioniert nur bei Zeilen, die aus einem Datastore per SearchDatastore Step kommen. Siehe auch Auf Relationen zugreifen und Datastores - HierarchischeDaten. <#if (row.variants()?? && row.variants()?size > 0)>Diese Parentzeile hat ${row.variants()?size} Variantenzeilen<#else>Keine Variantenzeile vorhanden</#if> <#if (row.variants()?? && row.variants()?size > 0)> <#list row.variants() as v> ${v.get('artikelnummer')!} - </#list> </#if> | ||||||||
children() | Gibt alle Child-Zeilen (sofern vorhanden) der aktuellen Master-Zeile zurück. | Dies funktioniert nur bei Zeilen, die aus einem Master-Datastore per SearchDatastore Step kommen und wenn es zu diesem Master-Datastore auch einen verknüpften Child-Datastore gibt. Siehe auch Auf Relationen zugreifen und Datastores - HierarchischeDaten. <#if (row.children()?? && row.children()?size > 0)>Diese Masterzeile hat ${row.children()?size} Children<#else>Keine Children vorhanden</#if> <#if (row.children()?? && row.children()?size > 0)> <#list row.children() as c> ${c.get('artikelnummer')!} - </#list> | |||||||||
getSpreadsheet() | Gibt das Spreadsheet-Objekt (siehe Spreadsheet) zurück, zu dem die aktuelle Zeile gehört. | Spreadsheet | |||||||||
Col | |||||||||||
get() | Gibt den Textwert der Spalte | - | string | ${brandname.get()} ist das gleiche wie die Kurzform ${brandname!}. Das Ausrufezeichen am Ende sorgt dafür dass ein evtl. Null-Wert mit einem leeren String ("") ausgegeben wird. | |||||||
val() | Sehr ähnlich zu get() aber der Wert der Spalte wird automatisch in den Datentyp umgewandelt, der im ContentType des Schemas hinterlegt ist. | string | String / List / Map | Siehe Beispiele zur .val Funktion | |||||||
get(String defaultValue) | Wie get(), aber es wird der defaultValue ausgegeben, falls der Wert leer ist | string | string | ${brandname.get("foo")} ist das gleiche wie die Kurzform ${brandname!"foo"}. Das Ausrufezeichen am Ende sorgt dafür dass ein evtl. Null-Wert mit einem leeren String ("") ausgegeben wird. | |||||||
getTitle() | Gibt den Spaltentitel aus. | - | string | ${mycolumn.getTitle()} | |||||||
getHeaderCol() | Gibt die dazugehörigen Kopfspalte aus. | - | Col | ${mycolumn.getHeaderColumn().get()} ist das gleiche wie ${mycolumn.getTitle()!} | |||||||
getRow() | Gibt das Zeilenobjekt (siehe Row) zurück, zu der die Spalte gehört. | Row | Aktuelle Zeilennummer: ${mycolumn.getRow().getRowNumber()} |
Beispiele zur .val() Funktion
Wie oben erwähnt ist die Funktion .val()
sehr ähnlich zu get()
aber der Wert der Spalte wird automatisch in den Datentyp umgewandelt, der im ContentType des Schemas hinterlegt ist (in String, Integer, Decimal, Boolean, Liste oder Map). Das ist der Fall, wenn man ein Spreadsheet konsumiert, welches aus einem SearchDatastore Step kommt, da das Datastore-Schema die Spaltentypen konfiguriert.
Die Funktion row.val('Spaltenname')
ist gleichbedeutend mit col.val()
, bzw. ruft row.val('Spaltenname')
im Hintergrund col.val()
auf. Was nutzt man wann? Wenn man gerade eine 'row' in der Hand hat, dann kann man row.val('Spaltenname')
aufrufen. Hat man bereits die Spalte (col) in der Hand, dann col.val()
. Im Mapper geht in der Regel beides.
Beispiel 1: SINGLE, ContentType=DECIMAL
Nehmen wir an, die Datastore-Spalte price
ist vom Typ SINGLE
und ContentType=DECIMAL
(Dezimalzahl):
Die der Preis ist: ${row.val("price")}
bzw.
Die der Preis ist: ${price.val()}
Die Ausgabe wäre z.B. 19.99 EUR
aber als echtes Zahl-Objekt und kein String, weil die Spalte im Schema als solche konfiguriert ist. D.h. man könnte auch ohne Umwandlung in eine Zahl durch ?number
sofort mit dem Wert rechnen: z.B. ${price.val() + 1}
würde dann 20.99
ausgeben. Wäre der ContentType von 'price' hingegeben ContentType=TEXT
statt DECIMAL
, dann würde ${price.val() + 1}
einfach 19.991 ausgeben, weil die beiden Teile als String zusammengesetzt werden.
Beispiel 2: MAP, ContentType=INTEGER, Trenner: ;
Nehmen wir an, die Datastore-Spalte attributes
ist vom Typ MAP
und ContentType=INTEGER
(Ganzzahl). Wert der Spalte: color:red;size=42
Die Schuh-Größe ist: ${row.val("attributes")["size"]}
bzw.
Die Schuh-Größe ist: ${attributes["size"]}
Die Ausgabe wäre z.B. 42
aber als echtes Zahl-Objekt und kein String, weil die Spalte im Schema als solche konfiguriert ist. d.h. man könnte auch ohne Umwandlung in eine Zahl durch ?number
sofort mit dem Wert rechnen: z.B. ${attributes["size"] + 1}
würde dann 43 ausgeben. Wäre der ContentType von 'attributes' hingegeben ContentType=TEXT
statt INTEGER
, dann würde ${attributes["size"] + 1}
einfach 421 ausgeben, weil die beiden Teile als String zusammengesetzt werden.
Beispiel 3: MULTIVALUE, ContentType=STRING, Trenner: ,
Nehmen wir an, die Datastore-Spalte languages
ist vom Typ MULTIVALUE
(Liste) und ContentType=TEXT
: Wert der Spalte: de,en,fr
Die zweite Sprache ist: ${row.val("languages")[1]}
bzw.
Die zweite Sprache ist: ${languages[1]}
Die Ausgabe wäre z.B. en
(Hinweis: der Index in der eckigen Klammer beginnt immer bei 0. D.h 1 ist die zweite Stelle).
Beispiel - JSON erstellen mit newMap(), zipMap(), toJSON() und .val()
Unser Tutorial zeigt, wie sie durch Kombination verschiedener Funktionen valides und typsicheres JSON erstellen.