Seitenhierarchie
Zum Ende der Metadaten springen
Zum Anfang der Metadaten

Mehr zum Thema Scripting

Ergänzend zu dieser Seite empfehlen wir auch folgende Seite zum Thema Scripting.

Was ist ein Spreadsheet?

Ein Spreadsheet ist gedanklich wie eine Excel-Tabelle mit Spalten und Zeilen und stellt das zentrales Element und Bindeglied zwischen Steps in Synesty Studio dar. So können z.B. Daten eines Spreadsheets in einen Datastore eingefügt oder in einer CSV Datei gespeichert werden.
Der wichtigste Step in diesem Zusammenhang ist der SpreadsheetMapper, womit sich Spreadsheets an die eigenen Bedürfnisse anpassen lassen. Man kann damit z.B. Spalten umbenennen, entfernen und Funktionen anwenden. Selbst WENN-DANN Logik kann auf Spalten angewendet werden, um diese zu manipulieren. 

 

 

Die Abbildung zeigt, wie man mit dem genannten SpreadsheetMapper die Spalten bearbeiten kann. 

Erklärung zur Abbildung:

  • Inhaltliche Komponenten (1-3a)
  • Visuelle Komponenten (4-6)

1. Titel

Der Wert Titel legt die Spaltenbezeichnung fest.

2. Quelle

Hier können Sie eine Spalte mit den Daten einer beliebigen Spalte aus der Quelldatei befüllen. So ist es z.B. denkbar, das die Spalte mit dem Titel "ArtikelID" mit den Daten der in der Quelldatei befindlichen Spalte "art_id" befüllt werden soll.

3. Wert

Das Feld Wert ist eine andere sehr flexible Möglichkeit die Daten der Spalte zu bestimmen. Dies kann auf zwei Arten geschehen:

  • fester Wert
  • dynamischer Wert über Script-Sprache

Achtung: Wird das Feld Wert befüllt, wird die Auswahl von Feld "Quelle" (2.) überschrieben, d.h. nicht beachtet.


Eine große Stärke dieses Feldes ist die Möglichkeit Logik mit Hilfe der Freemarker Scriptsprache einzubinden. 
Wir empfehlen Ihnen im Anschluss an diese Informationen sich diese Freemarker Beispiele  anzusehen. Sie werden schnell sehen, welche vielfältigen Möglichkeiten sich mit Freemarker Befehlen in Spreadsheets ergeben. 

Damit können Sie z.B. eine Spalte aus verschiedenen anderen Spalten zusammenbauen, um z.B. einen Produkttitel dynamisch aus den Spalten Marke, Produktname, Farbe und Größe zu generieren. 

 

Verfügbare Daten für das Wert-Feld: (3a)

Nach Klick auf den  Button, stehen Ihnen alle verfügbaren Daten zum befüllen der Wert Spalte zur Verfügung.
Diese werden bei Auswahl, automatisch in die benötigte Freemarker Syntax umgeformt.

 


 

Daten aus der Quelle einfügen

Sie können mit dieser Option, ähnlich wie mit dem "Quelle" Feld (2.) auf jede Spalte der Quelldatei zugreifen. Anders als in 2. können Sie jedoch mehrere Werte, anstatt einer einzigen, hinzufügen.

 


 Klicken Sie hier, um ein Beispiel anzuzeigen

Ausgangslage:

Sie haben in Ihrer Quelldatei eine Preisspalte "price" mit einem nummerischen Wert und eine Währungsspalte "pricecurrency".

Ziel:

Das Zielsystem erwartet eine einzige Spalte "preis", welche sowohl die Währung als auch den Preis beinhaltet. ( z.B. EUR_99.95 )

Vorgehen:

Nachdem Sie die Quelldatei in Synesty Studio geladen und diese als Input in den Step "SpreadsheetMapper" geladen haben, legen Sie eine neue Spalte mit dem Titel (1.) "preis" an, danach klicken auf den "+" Button neben den Feld "Wert".

In dem erscheinenden Fenster, wählen Sie die Quellspalte "pricecurrency", anschließend wird das Feld "Wert" befüllt. Danach wird über die selbe Vorgehensweise die Spalte "price" hinzugefügt. Das Feld "Wert" hat nun den Inhalt ${pricecurrency}${price}. Die Daten (4.) der Spalte haben nun diese Form "EUR99.95"

Um das vorgegebene Trennzeichen " " einzufügen, wird dieses Zeichen lediglich zwischen die beiden Werte eingetragen. Somit ergibt sich als Resultat im "Wert" Feld: ${pricecurrency} ${price}

Über den Button ausgewählte (dynamische) Werte, werden automatisch in die Freemarker Syntax übersetzt. Dabei werden die Werte wie "Spaltenname" in einem Container ${} eingeschlossen. Alle festen Werte, müssen außerhalb dieses Containers eingefügt werden.

 


 

Ergebnisse aus vorherigen Spalten einfügen

Hier können Sie aus allen Werten, welche links der aktuellen Spalte stehen, wählen. D.h. Sie können einen bereits angepassten Wert wieder verwenden.
Die Variablen einer Ergebnisspalte erkennen sie am Ausdruck result wie z.B.

${result['preis']}
 Klicken Sie hier, um ein Beispiel anzuzeigen

Ausgangslage:

Sie haben die selbe Quelldatei wie im obigen Beispiel und haben schon die oben beschriebene Spalte "preis" erstellt (EUR 99.95). Es existiert in der Quelldatei ebenfalls eine Spalte "versandkosten".

Ziel:

Das Zielsystem erwartet eine Spalte "preis_+_versandkosten" mit Währung, Preis und Versandkosten. ( z.B. EUR 99.95 + 6.95 )

Vorgehen:

Legen Sie eine neue Spalte mit dem Titel (1.) "preis_+_versandkosten" hinter der Spalte "preis" an. Danach klicken Sie auf den "+" Button neben dem Feld "Wert". Gehen Sie in dem neuen Fenster auf den Reiter "aus Ergebnisspalte" und wählen die Spalte "preis" aus. Das Feld "Wert" ist nun mit "${result['preis']}" gefüllt. Nun haben Sie den identischen Wert aus der vorher selbst erstellten Spalte "preis". Um die Versandkosten hinzuzufügen klicken Sie erneut auf "+" und wählen die Quellspalte "versandkosten" aus. Abschließend fügen Sie das Trennzeichen " + " zwischen den beiden Spaltenwerten ein.

Somit ergibt sich als Resultat im Feld "Wert": ${result['preis']} + ${versandkosten}

 


 

Meta-Daten einfügen

 

Sie haben die Möglichkeit Meta-Daten wie z.B. die aktuelle Zeit beim Ausführen des Flows (prop_actualruntime) oder den Zeitpunkt der letzten Ausführung des Flows (prop_lastruntime) in eine Spalte einzufügen. Dies ermöglicht Ihnen, hochdynamische Spalten zu erzeugen.

 

 Klicken Sie hier, um ein Beispiel anzuzeigen

Ausgangslage:

Sie haben eine Quelldateien mit mehreren Spalten.

Ziel:

Das Zielsystem erwartet eine Spalte "uebertragen" mit den aktuellen Datum. (z.B. Feb 6, 2014 )

Vorgehen:

Legen Sie eine neue Spalte mit den Titel (1.) "uebertragen" an. Klicken Sie auf den "+" Button und navigieren Sie in den auftauchenden Fenster auf den Reiter "aus Meta-Daten". Hier wählen Sie "prop.actualruntime" aus, danach wird das Feld "Wert" mit ${meta.prop_actualruntime!} gefüllt.

Da dieser Wert mehrere Informationen wie z.B. Zeit, Datum, Jahr etc. enthält, müssen Sie zum Schluss noch definieren, welchen Wert Sie benötigen. Fügen Sie dazu im Feld "Wert" hinter dem "!" folgende Anweisung ein "?date" ein.

Somit ergibt das Resultat im Feld "Wert": ${meta.prop_actualruntime!?date}

Achtung: Bei jedem Datumswert muss definiert werden, was angezeigt werden soll. Dazu haben Sie folgende Optionen:

?date - liefert das Datum

?time - liefert die Zeit

?datetime - liefert das Datum gefolgt von der Zeit


Auf Relationen zugreifen

So wie es bei Datastores möglich ist, Relationen abzubilden (siehe Datastores#HierarchischeDaten), gibt es auch bei Spreadsheets Möglichkeiten auf diese Relationen zuzugreifen. Die meisten Möglichkeiten bieten sich hier bei Spreadsheets, die aus einem Datastore kommen. 
In Synesty Studio gibt es 2 Arten von hierarchischen Relationen: die sog. Parent-Variant und Master-Child Relation. Diese sind durch folgende Eigenschaften charakterisiert:

Relation 1: Parent - Variant 

  • Parent und Variantenzeilen haben identische Spaltennamen

  • Bei Datastores existieren Parent- und Variant-Zeilen in dem selben Datastore und im selben Folder

  • Varianten werden beim Import in den Datastore über die Spalte parent_identifier mit der Parent-Datensatz verknüpft

Relation 2: Master - Child 

  • Master-Zeilen und Children-Zeilen haben können unterschiedliche Spaltenname haben (da sie aus Datastores mit 2 unterschiedlichen Schemas kommen können)

  • Bei Datastores existieren Master-Zeilen in einem Master-Datastore und Children in einem mit dem Master-Datastore verknüpften Child-Datastore

    • beide Datastores können unterschiedliche Schema verwenden - daher auch die unterschiedlichen Spaltennamen

  • Children werden beim Import in den Datastore über die Spalten master_identifier, und master_datastore mit dem Master-Datensatz verknüpft 

Freemarker Ausdrücke

In diesem Zusammenhang sind folgende Freemarker-Ausdrücke relevant, die im nächsten Abschnitt beschrieben werden.

${parent['columnname']!} - greift auf eine Spalte der Parent-Zeile zu
${row.variants()!} - greift auf alle Varianten-Zeilen der aktuellen Parent-Zeile zu 
<#if row.variants()??>Hat ${row.variants()?size} Varianten<#else>Hat 0 Varianten</#if>
<#if row.parent()??>ja, ist Variante, weil Parent vorhanden<#else>Nein, ist keine Variante, da kein Parent</#if>

${master['columnname']!} - greift auf eine Spalte der Master-Zeile zu
${row.children()!} - greift auf alle Child-Zeilen der aktuellen Master-Zeile zu 
<#if row.children()??>Hat ${row.children()?size} Child-Zeilen<#else>Hat 0 Child-Zeilen</#if>
<#if row.master()??>ja, ist Child-Zeile, weil Master vorhanden<#else>Nein, ist keine Child-Zeile, da kein Master vorhanden</#if>
Ergebnisse aus Parent-Zeile einfügen

Diese Funktion funktioniert nur bei 2-stufigen Spreadsheets wie z.B. bei Datasore-Artikel mit Varianten oder Aufträge mit Auftragspositionen. Diese Spreadsheets haben einen 2-stufigen Aufbau, bei dem die erste Zeile (die sog. Parent-Zeile) z.B. Auftragskopfdaten enthält und darauf folgende Zeilen die Auftragspositionen (die sog. Kind-Zeilen) enthalten.

 Wenn man nun in den Auftrags-Positions-Zeilen (Varianten-Zeilen) Auftragskopfdaten (Parent-Zeile) anzeigen will, kann man das mit der ${parent['columnName']} machen.

Hinweis: Vorraussetzung für diese Funktion ist ein Spreadsheet, in dem es Varianten-Zeilen gibt, die mit einer Parent-Zeile verknüpft sind.
Bisher unterstützen dies nur wenige Steps z.B. SearchDatastore, PlentyMarketsGetItemsBase, PlentyMarketsSearchOrders und PlentyMarketsGetReorders. Die meisten Spreadsheets sind hingegen eher flach, und haben nicht diese Parent-Child-Verknüpfung (z.B. aus einem SpreadsheetCSVReader).

Wenn ein Spreadsheet Parent-Child Zeilen besitzt, dann erkennen Sie dies im SpreadsheetMapper am Tab "aus Parent-Zeile" (siehe Screenshot rechts)

 

 

 Klicken Sie hier, um ein Beispiel anzuzeigen

Ausgangslage:

Sie haben einen Flow, der Auftragsdaten aus plentymarkets holt. Diese Daten kommen in einem 2-stufigen Spreadsheet mit Auftragskopfdaten und Auftragspositionen.
 

Ziel:

Sie wollen in den Positionszeilen die Felder aus der Liefer- und Rechnungsanschrift ausgeben. Diese Werte stehen aber nur in der Zeile des Auftragskopfes (Parent-Zeile).
 

Vorgehen:

Klicken Sie in das Wert-Feld der Spalte, wo der Wert angezeigt werden soll und klicken sie auf den Plus-Button. Sie sollten das Tab "aus Parent-Zeile" mit allen Spalten sehen. Klicken Sie z.B. auf die Spalte "OrderCustomerAddressCity".

Daraufhin sollte im Wert-Feld ${parent["OrderCustomerAddressCity"]!} stehen. Da die Auftragszeile selbst keine Parent-Zeile hat, sollten sie das Wert Feld noch wie folgt abändern, damit keine Fehlermeldung erscheint.

<#if parent??>${parent["OrderCustomerAddressCity"]!}<#else>${OrderCustomerAddressCity}</#if>

Ergebnis:

In den Auftragspositionen stehen jetzt auch Daten aus der Parent-Zeile mit den Auftragskopfdaten.
 

 

 


Auf Varianten-Zeilen zugreifen

Diese Funktion steht nur bei Spreadsheets des Steps SearchDatastore zur Verfügung.

Wenn man Ergebnisse aus einem Datastore verarbeitet, der Parent- und Varianten Datensätze enthält, dann gibt es die Möglichkeit innerhalb der Parent-Zeile auch auf die Varianten-Zeilen zuzugreifen.
Zum Beispiel kann man damit die Anzahl der Varianten-Zeilen prüfen oder in Abhängigkeit der Inhalte bestimmter Varianten-Zeile in der Parent-Zeile reagieren 

 

Beispiel: Ausgabe in Parent-Zeile nur, wenn es mindestens eine Varianten-Zeile gibt

<#if (row.variants()?? && row.variants()?size > 0)>Diese Parentzeile hat ${row.variants()?size} Variantenzeilen<#else>Keine Variantenzeile vorhanden</#if>

Beispiel: In Parent-Zeile alle Varianten-Artikelnummern ausgeben

<#if (row.variants()?? && row.variants()?size > 0)>
 
  <#list row.variants() as v>
    ${v.get('artikelnummer')!} -
  </#list>
 
</#if>
Ergebnisse aus Master-Zeile

Analog zur Parent-Zeile gibt es die Möglichkeit auch auf den Master-Datensatz zuzugreifen. Ein Master-Datensatz gibt es allerdings nur im Kontext von Datastores, da es auch nur dort Master-Child-Beziehungen gibt.

Diese Funktion steht nur bei Spreadsheets des Steps SearchDatastore zur Verfügung.

 

Beispiel: Auf identifier-Spalte der Master-Zeile zugreifen

${master['identifier']!}
Auf Kind-Zeilen (children) zugreifen

Diese Funktion steht nur bei Spreadsheets des Steps SearchDatastore zur Verfügung.

Wenn man Ergebnisse aus einem Master-Datastore verarbeitet, der mit einem Child-Datastore verknüpft ist, dann gibt es die Möglichkeit innerhalb der Master-Zeile auch auf die Zeilen des Child-Datastores zuzugreifen, den sog. children.
Zum Beispiel kann man damit die Anzahl der Children prüfen oder in Abhängigkeit der Inhalte bestimmter Children in der Master-Zeile reagieren 

 

Beispiel: Ausgabe in Master-Zeile nur, wenn es mindestens eine Child-Zeile gibt

<#if (row.children()?? && row.children()?size > 0)>Diese Masterzeile hat ${row.children()?size} Children<#else>Keine Children vorhanden</#if>

Beispiel: In Master-Zeile alle Children-Artikelnummern ausgeben

<#if (row.children()?? && row.children()?size > 0)>
 
  <#list row.children() as c>
    ${c.get('artikelnummer')!} -
  </#list>
 
</#if>

4. Wert-Funktion einfügen

Zusätzlich zum Plus-Zeichen können sie über das -Symbol Skript-Funktionen einfügen. Die hier dargestellten Funktionen sind als Eingabehilfe anzusehen und erleichtern das etwas aufwändigere Tippen per Hand. In den meisten Fällen müssen Sie jedoch die eingefügten Funktionen noch auf ihre Spaltennamen anpassen, da lediglich Beispiele eingefügt werden. 

Diese Funktionen gliedern sich in drei Teile, wie man im Screenshot sieht. 

 

Freemarker Built-Ins

Freemarker Built-Ins sind Funktionen, die bereits im Kern in die Freemarker-Sprache integriert sind und auch in der offiziellen Freemarker-Dokumentation erklärt sind. Die aufgeführten Funktionen sind nur eine Auswahl der häufig verwendeten Funktionen und sind nicht vollständig. 

Mehr Informationen und Grundlagen zur Anwendung auch auf der Seite Scripting.

FunktionBeschreibungBeispiel
if elseFügt eine einfache WENN-DANN Bedingung ein.
<#if column == "value1">foo<#else>bar</#if>
if elseif elseFügt eine erweiterte WENN-DANN Bedingung mit einer Abfrage für 3 Bedingungen ein.
<#if column == "value1">foo<#elseif column == "value2">foo2<#elseif column == "value3">bar<#else></#if>
listBeispiel-Code, um über eine Liste zu iterieren. Mehr zu sequences.
<#assign meineListe = "1,2,3,4"?split(",") /><#list meineListe as item>${item!}</#list>
replaceErsetzt Teile einer Zeichenkette.
${meineSpalte!?replace("wort1","wort2")!}

Ersetzt wort1 mit wort2.

numberWandelt einen String (Text) in eine Zahl um.
Wichtig: Es muss ein Punkt als Dezimaltrenner vorhanden sein.
${spalteMitZahl!?number + 5}

Wandelt Wert einer Spalte in eine Zahl und addiert 5 darauf.

 

Falls die Zahl noch keinen Punkt als Dezimaltrenner verwendet, dann ersetzen Sie erst das Komma durch einen Punkt:

${spalteMitZahl!?replace(",",".")?number + 5}
lowercaseWandelt Text komplett in Kleinbuchstaben.
${column!?lower_case!}
uppercaseWandelt Text komplett in Großbuchstaben.
${column!?upper_case!}
capitalizeSchreibt den ersten Buchstaben eines Wortes groß.
${column!?capitalize!}
trimEntfernt führende und endende Leerzeichen.
${column!?trim!}
containsPrüft ob ein Text eine Teilzeichenkette enthält.
<#if column!?contains("substring")>foo<#else>bar</#if>
index_ofGibt die Position einer Teilzeichenkette in einem Text zurück.
${column!?index_of("substring")!}
last_index_ofGibt die letzte Position einer Teilzeichenkette in einem Text zurück.
${column!?last_index_of("substring")!}

 

Template Funktionen

Diese Funktionen sind nicht Teil von Freemarker sondern wurden von Synesty extra eingebaut. Es handelt sich um nützliche Helfer-Funktionen für einige Spezialfälle oder als Ersatz für fehlende Funktionen.

FunktionBeschreibungBeispiel
isNumberPrüft, ob ein Wert eine Zahl ist.
<#if isNumber(value)>value ist eine Zahl<#else>value ist KEINE Zahl</#if>
random

Erzeugt eine Zufallszahl. Die Zufallszahl ist Standard-mäßig vom Datentyp double, also eine Zahl mit Dezimalstellen.

Um eine Ganzzahl zu erhalten nutzen Sie das Freemarker-Built-in ?floor, um Abzurunden, und die Dezimalstellen wegzuschneiden.

${random()} -> random number between 0 and 1 (e.g. 0.567885)
${random(100)} -> random number between 0 and 100 (e.g. 45.57743)
${random(10,100)} -> random number between 10 and 100 (e.g. 11.35675)

Create an integer value use ?floor to strip the decimal places
${random()?floor} -> random integer number between 0 and 1
${random(100)?floor} -> random integer number between 0 and 100
${random(10,100)?floor} -> random integer number between 10 and 100






position_ofErmittelt die n-te Position eines Zeichens bzw. Teilstrings innerhalb einer Zeichenkette.
Ein Beispiel mit anderen Worten: "An der wievielten Positionen kommt "-" (Bindestrich) zum zweiten mal vor?"
Position of the 2nd occurence of "-" is ${position_of("1-2-3-4", "-",2)}

Ergebnis:
Position of the 2nd occurence of "-" is 3

escapeHTMLErsetzt bestimmte Zeichen durch HTML Entitäten.

z.B. spitze Klammern (<) werden zu &lt;

${escapeHTML(string)!}
unescapeHTMLDas Gegenstück zu escapeHTML.z.B. macht aus &lt; wieder eine spitze Klammer (<).
now()Liefert die aktuelle Zeit als Timestamp in Millisekunden.z.B. 1417185735245
lastDayOfMonthLiefert ein Date des letzten Tag des Monats bezogen auf das übergebene Referenzdatum. Wird kein Referenzdatum angegeben, wird der aktuelle Zeitpunkt als Referenzdatum genutzt.
${lastDayOfMonth("2016-02-15")?date}
Ausgabe: Feb 29, 2016


${lastdayofmonth("2016-02-03")?date?string("dd.MM.yyyy")}
Ausgabe: 29.02.2016
 
${lastDayOfMonth()?date}
Ausgabe: wie oben, nur letzter Tag des aktuellen Monats
firstDayOfMonthLiefert ein Date des ersten Tag des Monats bezogen auf das übergebene Referenzdatum. Wird kein Referenzdatum angegeben, wird der aktuelle Zeitpunkt als Referenzdatum genutzt.
${firstDayOfMonth("2016-02-15")?date}
Ausgabe: Feb 01, 2016


${firstDayOfMonth("2016-02-03")?date?string("dd.MM.yyyy")}
Ausgabe: 01.02.2016
 
${firstDayOfMonth()?date}
Ausgabe: wie oben, nur erster Tag des aktuellen Monats
eanChecksumBerechnet die 13. Stelle (Prüfsumme) einer EAN13.
${eanChecksum("978381582086")!}

Ergibt den Wert 5, was der Prüfsumme dieser EAN entspricht. Die vollständige EAN13 lautet

9783815820865
UUIDErzeugt eine 36-stellige eineindeutige ID, eine sog. UUID.
${UUID()!}

z.B. 8e7f2a40-9f12-4d85-b805-ed6864c13fec

parseField

Spezialfunktion, die hautpsächlich den Anwendungsfall hat, auf Attributwert zuzugreifen,
die wie folgt in einer einzelnen Spalte hinterlegt sind:

color=red;size=M

Häufig trifft man das bei Artikeldaten an, wo Variantenattribute wie Farbe und Größe
auf diese Art mit bestimmten Trennzeichen in einer Spalte stehen. Man könnte alternativ
mit der ?split Funktion den String zerlegen, aber parseField ist komfortabler.

${parseField("color=red;size=M", "MAP", "TEXT", ";", "=").at("size")!}

Gibt den Wert "M" bei size zurück.

datecalc

Rechnet mit einem Datum, um Zeiten zu addieren oder subtrahieren. Man kann entweder das aktuelle Datum verwenden oder ein Referenzdatum reingeben.

Die verwendbaren Felder sind MONTH, DAY, HOUR, MINUTE, SECOND, MILLISECOND.

Hinweis: Bei Verwendung eines Referenzdatums muss das Datum als String reingegeben werden z.B. 2015-08-06 10:39
Wenn das Datum nicht als STRING sondern als DATE vorliegt, muss man erst noch einen String daraus machen z.B.

prop_lastruntime?datetime

 

 

${datecalc("HOUR", 1)!?datetime}

Rechnet 1 Stunde auf die aktuelle Uhrzeit drauf.

${datecalc("DAY", -2)!?datetime}

Ergibt das Datum von Vorgestern, bezogen auf jetzt.

${datecalc(prop_lastruntime?datetime, "DAY", -2)?string('yyyy-MM-dd HH:mm')}

Zieht vom Datum der letzten Laufzeit 2 Tage ab.

minErmittelt das numerische Minimum einer Liste, die durch einen Trenner wie z.B. Komma getrennt ist.
${min("2,3,1,8,5", ",")!}

Ergibt den Wert 1.

maxErmittelt das numerische Maximum einer Liste, die durch einen Trenner wie z.B. Komma getrennt ist.
${max("2,3,1,8,5", ",")!}

Ergibt den Wert 8.

urlEncodeMit der Funktion urlEncode kann man Zeichenketten so aufbereiten, dass man sie in URLs benutzen kann. Sie ersetzt alle Sonderzeichen, die in URLs nicht erlaubt sind entsprechend. 
vorher
#sonderzeichen und leerzeichen!"§%&//(
Funktion ${urlEncode(result['urlmitsonderzeichen']!)!}
nachher %23sonderzeichen+und+leerzeichen%21%22%C2%A7%25%26%2F%2F%28
urlDecodeDas Gegenstück zu urlEncode
vorher%23sonderzeichen+und+leerzeichen
Funktion ${urlDecode(result['urlmitsonderzeichen']!)!}
nachher
#sonderzeichen und leerzeichen
stripHTMLTagsDiese Funktion entfernt HTML Tags aus Texten. Das wird häufig in Datenfeeds bei der Artikelbeschreibung benötigt. Bisher konnte man das ganze auch über Suchen/Ersetzen mit einem regulären Ausdruck erreichen. Diese Funktion macht das ganze einfacher und komfortabler. 
vorher<h1>Überschrift</h1><p>Text</p>
Funktion${stripHTMLTags(description!)!}
nachherÜberschrift Text
netErrechnet zu einem Brutto-Preis den Netto-Preis zu einem gegebenem Steuersatz${net("100.00", "19.0")} → 84.03
grossErrechnet zu einem Netto-Preis den Brutto-Preis zu einem gegebenem Steuersatz${gross("84.03", "19.0")} 100.00
round

Rundet einen numerischen Wert auf eine bestimmte Anzahlt Dezimalstellen und einem Rundungsmodus.

Siehe alle unterstützten Rundungsmodus.

Syntax:
${round(variable, decimalplaces, roundingMode, roundingValue)}
Beispiel:
price=99.8490
${round(price,2,"HALF_EVEN")}
${round(price,2,"HALF_EVEN", 0.75)}
Ausgabe:
99.85
100.75
md5Berechnet die MD5-Checksumme / Hash eines Wertes.
${md5("Wert")!}

oder

${md5(meinevariable)!}
sha1Berechnet den SHA1-Hash eines Wertes.
${sha1("Wert")!}

oder

${sha1(meinevariable)!}

sha256

Berechnet den SHA256-Hash eines Wertes.Analog zu sha1 Beispiel.

sha512

Berechnet den SHA512-Hash eines Wertes.Analog zu sha1 Beispiel.

hmacMD5

Berechnet den HmacMD5-Hash eines Wertes.Analog zu md5 Beispiel.

hmacSHA1

Berechnet den HmacSHA1-Hash eines Wertes. Analog zu sha1 Beispiel.

hmacSHA256

 Berechnet den HmacSHA256-Hash eines Wertes.Analog zu sha1 Beispiel.

encodeBase64

Encoded einen String mit Base64.
${encodeBase64("mein toller string")!}

Ergebnis: bWVpbiB0b2xsZXIgc3RyaW5n

decodeBase64Decodiert einen Base64 encodierten String.
${decodeBase64("bWVpbiB0b2xsZXIgc3RyaW5n")!}

Ergebnis: mein toller string

substring_wordkürzt einen anzugebenden String auf eine anzugebende Länge, vermeidet aber, dass Wörter mitten drin abgeschnitten werden. (Das Zeichen an dem gekürzt wird ist ein Leerzeichen)
${substring_word('ABCD EFG AH', 6)}

 

Ergebnis:
ABCD

${row.cols().filter("price*", "INCLUDE").join(";")}

Fügt die Werte aller Spalten, die mit dem Wort "price" beginnen (z.B. price1, price2, price3 usw.) semikolon-getrennt zusammen. Dies funktioniert nur im SpreadsheetMapper oder in Freemarker-Skripten, in denen einen Spreadsheetzeile als ${row} Variable zur Verfügung steht. Die Funktionen filter() und join(), können auch unabhängig voneinander genutzt werden.

Die Funktion filter erlaubt es ausserdem komma-getrennt mehrere Filterkriterien anzugeben, um die entsprechenden Spaltenwerte zu selektieren. Dabei kann Stern (*) als Wildcard verwendet werden.

Die Funktion kann im SpreadsheetMapper über das Schraubenschlüssel-Icon / Template Funktionen erreicht werden.

 

Beispieldaten:

identifierbrandnamenamedescriptionpricepricecurrencystockvariants
1K-StarSuper Shoe XIDescription of Super Shoe XI129.99EUR0color=red;size=M


Beispiel-Anwendung und Ergebnis:

${row.cols().join(";")}
1;K-Star;Super Shoe XI;Description of Super Shoe XI;129.99;EUR;0;color=red;size=M

${row.cols().filter("price,name", "INCLUDE").join(";")}
Super Shoe XI;129.99

${row.cols().filter("price,name", "EXCLUDE").join(";")}
1;K-Star;Description of Super Shoe XI;EUR;0;color=red;size=M

${row.cols().filter("price*", "INCLUDE").join(";")}
129.99;EUR

 

 

Bedingungs-Generator

Im Abschnitt Freemarker-Build Ins (und auch im Abschnitt Scripting) wurde erklärt, wie man man WENN-DANN Bedingungen mit der Freemarker-Syntax formulieren kann. 
Leider ist das etwas schwerfällig, vor allem für neue Nutzer. 

Der Condition-Builder für WENN-DANN Bedingungen soll dieses Problem vereinfachen. 

Im Funktionsmenü in jeder Spalte finden Sie jetzt das Tab "Bedingung generieren". 
Mit diesem flexiblen Wizzard können Sie sich Bedingungen zusammen klicken. Daraufhin wird das entsprechende Skript für die Bedingung generiert.



Wir empfehlen für WENN-DANN Logik immer zuerst mit dem Generator zu beginnen und danach die Bedingung zu editieren. In de Regel sollte der vom Generator erzeugte Code für die meisten Fälle ausreichend sein. Es kann aber sein, dass sie eine derart komplexe Bedingung formulieren wollen, so dass eine manuelle Nachbearbeitung notwendig ist. 


5. Daten

Hier werden die Daten der Spalte dargestellt. Diese dienen der Vorschau, sind nicht direkt editierbar und werden durch die Felder Quelle (2.) oder Wert (3.) sowie konfigurierten Funktionen definiert.

6. Spalte verschieben

Durch Klick auf einen der zwei Pfeile, können Spalten nach rechts bzw. links verschoben werden. 

Alternativ kann auch folgende Verschieben-Funktion benutzt werden, die bei vielen Spalten effektiver ist.


7. Spalte löschen

Ein Klick auf den "X" Button entfernt eine Spalte aus dem SpreadSheet.

 

 

 

 

Einstellungen

Allgemeine Einstellungen

Gruppieren nach Spaltenname: Diese Option ermöglicht es nach einer Spalte des Spreadsheets zu Gruppieren. Weitere Informationen siehe Gruppieren/Aggregatfunktionen

Sortieren nach Spaltenname: Wählen Sie hier die Spalte aus, welche sortiert werden soll.

Sortieren: Absteigende oder Aufsteigende Sortierung

Zeige n Zeilen in der Vorschau: Dieser Wert legt fest wie viele Zeilen in der Vorschau des Spreadsheets angezeigt werden. Wählen Sie möglichst kleine Werte.  

Funktionen

Unter dem Menüpunkt "Funktionen" stehen Ihnen eine Vielzahl an vorgefertigten Operationen zum Anpassen Ihrer Daten zur Verfügung. Damit lassen sich schnell und einfach grundlegende Transformationen an Ihren Daten vornehmen.

Diese werden im Folgenden genauer erläutert.

 

Suchen & Ersetzen

Diese Funktion erlaubt es Zeichen(ketten) zu ersetzen. Sie können beliebig viele Regeln durch Klick auf "Hinzufügen" definieren.

Hinweis

Sie können im Suchmuster auch einen sog. regulärer Ausdruck verwenden (engl. regular expressions), hierfür aktivieren Sie bitte die Checkbox.

 


 

Rechenoperation

Rechenoperationen eignen sich für Spalten mit numerischen Daten.

Folgende Rechenoperatoren stehen zur Verfügung

  • Addition +
  • Subtraktion -
  • Multiplikation *
  • Division /

Dezimaltrenner

Bei mathematischen Funktionen wird immer einen Punkt als Dezimaltrenner erwartet. D.h. falls Zahlen mit Komma als Dezimaltrenner existieren, muss das Komma erst durch einen Punkt ersetzt werden. Eine Möglichkeit wäre, dazu die vorherige Suchen/Ersetzen Funktion zu benutzen oder im Wert-Feld mit Freemarker Komma durch Punkt zu ersetzen:

Beispiel: Komma durch Punkt mit Freemarker ersetzen
${OrderTotalGross?replace(",",".")?number + OrderShippingCosts?replace(",",".")?number}


 

 


 

Runden

Mit der Funktion Runden, haben Sie die Möglichkeit numerische Werte einer Spalte anzupassen.

  • Runden - Die Runden Funktion ermöglicht die Rundung auf eine feste Anzahl von Nachkommastellen oder eine Rundung auf einen festen Rundungswert.

 

Nachfolgend finden sie einige Beispiele zu den verfügbaren Rundungsoperationen

 

Sie können bei der Rundungsfunktion entweder einen Rundungswert definieren oder auf die zu rundenden Stellen angeben. Wenn sie beide Möglichkeiten nutzen möchten, können sie mit (Zwischen-)Ergebnis Spalten arbeiten.

 

AusgangswertRundungsmodusRundungswertStellenErgebnis
182.472CEILING
(Aufrunden)
0.9-182.9
182.472CEILING0.1-183.1
182.472CEILING5-185
182.472CEILING0-190
182.472CEILING00-200
182.472CEILING-2182.48
182.472CEILING-1182.5
182.472CEILING-0183
182.472FLOOR
(Abrunden) 
0.9-181.9
182.472FLOOR0.1-182.1
182.472FLOOR5-175
182.472FLOOR0-180
182.472FLOOR00-100
182.472FLOOR-2182.47
182.472FLOOR-1182.4
182.472FLOOR-0182
182.472HALF_UP
(ab >= 5 aufrunden)
0.9-181.9
182.572HALF_UP0.9-182.9
182.472HALF_UP0.1-182.1
182.572HALF_UP0.1-183.1
182.472HALF_UP5-175
182.472HALF_UP0-180
182.472HALF_UP00-200
182.472HALF_UP-2182.47
182.475HALF_UP-2182.48
182.472HALF_UP-1182.5
182.472HALF_UP-0182
182.472

HALF_DOWN
(ab > 5 aufrunden)

0.9-181.9
182.500HALF_DOWN0.9-181.9
182.572HALF_DOWN0.9-182.9
182.472HALF_DOWN0.1-182.1
182.672HALF_DOWN0.1-183.1
182.472HALF_DOWN5-175
182.472HALF_DOWN0-180
182.472HALF_DOWN00-200
182.472HALF_DOWN-2182.47
182.472HALF_DOWN-1182.5
182.472HALF_DOWN-0182
1.5

HALF_EVEN
(bei ungerader Ganzzahl aufrunden, bei gerade abrunden)

0.9-1.9
2.5HALF_EVEN0.9-1.9
1.5HALF_EVEN-11.5
2.5HALF_EVEN-12.5


  • Ganzzahl - diese Option führt dazu, das die Werte der Spalte auf eine Ganzzahl gerundet werden (entspricht "Abrunden, 0 Stellen")

 

 


 

Datumsfunktionen

Geben Sie das vorhandene Quellformat und das gewünschte Zielformat an, um Datumswerte umzuformen.

Hier finden Sie Beispiele für die Umwandlung von Timestamps

 

 


 

Querverweis

Mit einem Querverweis (in Excel auch bekannt als SVERWEIS) können Sie Daten aus einem Datastore in ein Spreadsheet einfügen. Man kann einen Querverweis mit folgendem SQL Befehl vergleichen:

SELECT * FROM datastore WHERE datastorename = 'DemoDatastore' AND identifier = '123' AND folder = 'default';

 

  • Datastore: Aus welchem Datastore sollen Daten abgerufen werden
  • Folder: Aus welchem Folder (Standard: 'default')
  • Identifier / Identifier2 / identifier3: Um eine Zeile im Datastore zu identifizieren wird die Spalte identifier, identifier2 oder identifier3 genutzt
    • füllen Sie nur eines der beiden Felder mit den gewünschten Wert
  • Field: Geben Sie den Namen der Spalte (Field) an, aus der die Daten im Datastore geholt werden sollen

 

 

Folder ignorieren

In einigen Fällen will man den Folder ignorieren. Klicken Sie dazu auf den +-Button und wählen "Folder beim Querverweis ignorieren".
Das ist z.B. dann nützlich, wenn Sie in über mehrere Folder hinweg nach EAN suchen wollen, z.B. wenn Sie nicht genau wissen, in welchem Folder sich ein bestimmter Datensatz befindet.

Achtung bei doppelten Datensätzen

Achtung: Sollte es Datensätze geben, die über mehrere Folder hinweg den gleichen identifier (oder identifier2 oder identifier3) besitzen, dann liefert der Querverweis nur den ersten gefundenen. Das Ergebnis ist in diesem Fall zufällig. Das sollten Sie beachten, wenn es ID-Dopplungen gibt.

 

 

 Klicken Sie hier, um ein Beispiel anzuzeigen
Querverweis mit festem Wert

Fester Wert bedeutet hier, das wir 'hart' mit dem Wert 12345 einen Querverweis (manchmal auch Lookup genannt) auf die Identifier2-Spalte des DemoDatastore machen.
Über Datastore, Folder und Identifier / Identifier2 wird die entsprechende Zeile lokalisiert und über Field wird das auszugebende Feld ausgewählt. 

 

Querverweis mit dynamischen Wert aus aktueller Zeile

Dynamisch bedeutet in diesem Fall, dass anstatt eines festen 'harten' Wertes einen dynamisch Wert aus der jeweils aktuellen Zeile nutzt.
In diesem Beispiel wollen wir einen Querverweis immer über die aktuelle Spalte 'identifier' machen, um uns anhand dieser ID den Wert aus der entsprechenden Spalte im DemoDatastore zu holen.  

 

 


 

Mappingset

Mit einem Mappingset können Sie, einen Quellwert in einen Zielwert übersetzen - sozusagen eine "Übersetzungstabelle".

Es gibt verschiedene Arten Mappingsets zu erzeugen:

  • Default-Mappingset
  • Datastore-zu-Datastore Mappingset
Default-Mappingsets

Default-Mappingsets sind einfache Übersetzungstabellen, die manuell als Textblock gepflegt werden können.

Mappingset per Flow erweitern

Default-Mappingset können auch mit dem Step AddUpdateMappingset per Flow angelegt und automatisiert werden. Damit kann man die Pflege des Mappingsets auch automatisieren.


Datastore-zu-Datastore-Mappingsets

Datastore-zu-Datastore Mappingsets hingegen werden über ein Mapping-Tool auf Basis von Daten in einem oder mehreren Datastores erzeugt. Hier kann man die eindeutigen Werte einer gewählten Quellspalte auf erlaubte Zielwerte mappen. Die Zielwerte kommen ebenfalls aus einer Spalte eines Datastores.

Beispiel: Eigene Kategorien auf Google-Shopping Kategorien mappen

Erstellen Sie in neues Mappingset.


Wählen Sie den Mappingset-Typ Datastore zu Datastore:

Dadurch gelangen Sie in den Mappingset Builder.

Als Quelle wählen Sie ihren Datastore mit Artikeldaten, in dem es eine Kategorie-Spalte gibt, die Sie auf Google Shopping mappen wollen.
Als Ziel wählen Sie einen Datastore mit den Google Shopping Kategorien (dieses Cookbook zeigt am Beispiel, wie Sie diesen Datastore erstellen können).
Als Ziel-Spalte wählen Sie die Spalte, die den zu mappenden Zielwert enthält, z.B. die ID der Google-Shopping-Kategorie.
Als Ziel-Label (optional) können Sie eine Spalte auswählen, die eine sprechende textuelle Beschreibung der Ziel-Spalte enthält. Dies dient lediglich zu Anzeigezwecken und erleicht den Mappingprozess.

 

Klicken Sie dann auf Konfiguration starten. Dadurch werden die Daten aus den Datastores gelesen und das Mapping gestartet.

Klicken Sie auf Mappingset speichern, wenn Sie fertig sind. Dadurch wird das Mappingset und die aktuelle Konfiguration gespeichert und das erstellte Mappingset kann genutzt werden.


Anwendung von Mappingsets

Es gibt zwei Arten der Anwendung von Mappingsets:

  • einfache Mappingsets (d.h. einfache Übersetzung von Quell-Wert zu Ziel-Wert)

  • Bereichs-Mappingsets (Zuweisung eines Quell-Bereichs zu einem Ziel-wert z.B. "alle Preise zwischen 0 und 100 EUR bekommen 10% Rabatt")

 

Wichtig: Der Quellwert ist immer der aktuell sichtbare Wert der Spalte.  

Einfaches Mappingset

Ein einfaches Mappingset ersetzt den aktuellen Wert in einen Zielwert.

SucheBegriff1=ErsetzeDurch1 
SucheBegriff2=ErsetzeDurch2 
SucheBegriff3=ErsetzeDurch3
Funktionierendes BeispielNicht funktionierendes Beispiel

Hier ist der Wert "SucheBegriff1". Da dieser Wert auch im Mappingset auftaucht, greift die Übersetzung. Der neue übersetzte Wert ist "ErsetzeDurch1".

In diesem Beispiel klappt die Übersetzung nicht, weil vor "SucheBegriff1" noch etwas anderes steht (im Beispiel Prefix"). Dadurch wird im Mappingset kein passender Eintrag gefunden, und es wird der unübersetzte Orginalwert ausgegeben (siehe Mapping-Modus weiter unten, um dieses Verhalten zu ändern). 

 

Mehrere Werte in einer Zeile

Es ist auch möglich mehrere Werte in einer Zeile zu definieren. Das kann die Datenpflege erleichtern.
Dazu müssen die Werte auf der linken Seite des Gleichheitszeichens in doppelte eckige Klammern gesetzt werden und komma-getrennt eingegeben werden.

Beispiel - Farbübersetzungen
[[inkarnat, cherry, petrol]]=rot
[[lava, rust, mandarine, aprikot]]=orange

In diesem Beispiel werden verschiedene Farbvarianten für rot und orange definiert.

Es handelt sich hierbei lediglich um eine Kurzschreibweise. Die Werte innerhalb der eckigen Klammern werden im Hintergrund automatisch expandiert und in ein normales Mappingset übersetzt.  

 


Bereichs-Mappingset

Ein Bereichs-Mappingset hingegen funktioniert für Zahlenwerte und ermöglicht es verschiedene Zahlenbereich zu definieren. Der aktuelle Wert wird dann auf den Zielwert des entsprechenden Bereichs gemappt, zu dem er gehört.

1-100=bis 100
100.01-1000=groesser Hundert
1000.01-10000=groesser Tausend

Um Bereichs-Mappingsets zu nutzen, muss die Option Dieses Mappingset beinhaltet Bereiche angekreuzt werden (siehe 2. Screenshot).

Anwendungsbereiche:
Wenn man eine Preiskalkulation erstellt, dann will man oft bestimmte Regeln auf bestimmte Preisbereiche anwenden. z.B. sind manche Aufpreise nur für bestimmte Preisregionen sinnvoll, für andere aber nicht.
Durch Verwendung der Funktion Ergebnisse aus vorherigen Spalten einfügen ergeben sich sehr flexible Möglichkeiten individuelle WENN-DANN-Logik auf verschiedene Preisbereiche anzuwenden (siehe Beispiel).

+Ohne Bereichs-Mappingsets sähe die Logik wesentlich komplizierter und unübersichtlicher aus, da alle Bereichsprüfungen im Skript gemacht werden müssten. Jetzt ist nur noch das absolute Minimum notwendig. Vorstellbar wäre auch, dass man die Preisbereiche direkt auf Aufpreis-Faktoren mappt und diese direkt in weiteren Spalten zum kalkulieren verwendet. Damit sähe das ganze noch einfacher aus. Wie immer, hängt die Umsetzung von den konkreten Anforderungen ab. 

 

Beispiel: Einfaches MappingsetBeispiel: Bereichs-Mappingset

 


Modus 1 mit Mappingset Name:

Sie können ein vorhandenes Mapping Set wählen oder ein neues erstellen, welches Sie über Datastores / Mappingset getrennt pflegen können.
Wann zu verwenden: Dieser Modus empfiehlt sich, wenn sie das gleiche Mapping Set mehrmals z.B. in verschiedenen Spalten oder verschiedenen Flows wiederverwenden wollen. Dann sparen sie sich Arbeit, da das Mapping Set an einer zentralen Stelle gepflegt werden kann.

Modus 2 direkt über Textfeld "Mappingset String":

Das ist die schnelle Variante, wenn sie ein Mapping Set nur in einer einzigen Spalte brauchen und nicht an anderer Stelle wiederverwenden wollen.

 

Bei beiden Methoden wird dabei der zu suchende Begriff und der neue Wert durch ein = getrennt. Es können beliebig viele dieser sogenannten Key=Value Paare gebildet und getrennt durch "Enter" angelegt werden

 

Wir empfehlen Ihnen ein Mappingset zu erstellen. Dieses kann zentral außerhalb des Flows nachgepflegt werden und auch in anderen Flows wiederverwendet werden.

 

Konfiguration

Mapping Modus:

Über die Mapping Modus kann man das Verhalten beeinflussen, wie sich die Übersetzen auswirkt.

Hinweis: Die Mapping Modus funktionieren nur für normale Mappingsets und  nicht für Bereichs-Mappingsets.

 

    • Originalwerte ausgeben (Keep Original Values) - bedeutet, dass die Originalwerte ausgegeben werden, sollte das Mapping Set keinen zu mappenden Wert enthalten.

    • Nicht gemappte Werte entfernen (Remove unmapped original values) - bedeutet, dass ein leerer Wert ausgegeben wird, sollte das Mapping Set keinen zu mappenden Wert enthalten

    • Nicht gemappte Werte präfixen (Mark unmapped original values) - bedeutet, dass die Originalwerte mit dem Prefix NO_MAPPING ausgegeben werden z.B. "NO_MAPPING 1234". D.h. man kann damit ungemappte Werte besser erkennen und z.B. durch Filter gezielt diese Zeilen lokalisieren.

    • Standardwert benutzen - bedeutet, dass die Originalwerte durch einen Standardwert ersetzt werden. Somit können Werte, welche nicht im Mapping Set enthalten sind, durch ein festgegebenen Wert überschrieben werden.

    • Suchen & Ersetzen (case-sensitive) - bedeutet, dass jeder Eintrag des Mappingsets im Sinne einer Suchen&Ersetzen-Funktion auf den aktuellen Wert angewendet wird. Case-sensitive bedeutet, dass Groß/-Kleinschreibung der Mappingset-Einträge beachtet wird.

    • Suchen & Ersetzen (ignore case) - bedeutet, dass jeder Eintrag des Mappingsets im Sinne einer Suchen&Ersetzen-Funktion auf den aktuellen Wert angewendet wird. Ignore-case bedeutet, dass Groß/-Kleinschreibung der Mappingset-Einträge keine Rolle spielt.

    • Suchen & Ersetzen (Regulärer Ausdruck) - bedeutet, dass jeder Eintrag des Mappingsets im Sinne einer Suchen&Ersetzen-Funktion auf den aktuellen Wert angewendet wird. Jeder Quellwert des Mappingsets entspricht damit einem sog. regulären Ausdruck (engl. regular expression). Damit lassen sich sehr komplexe Suchmuster realisieren. Diese Funktion ist aus Performance-Sicht am langsamsten von allen. Bitte nur verwenden, wenn Sie wissen was sie tun.

    • Mappe, wenn Wert enthält [...] (ignore case) - bedeutet, dass jeder Eintrag des Mappingsets im Sinne einer Suchen&Ersetzen-Funktion auf den aktuellen Wert angewendet wird. Jeder Quellwert wird überprüft ob der gesuchte Wert vorhanden ist. Diese Funktion erlaubt ihnen Texte zu ersetzen, auch wenn Ihnen der genaue Inhalt des zu ersetzenden Textes oder Wertes nicht bekannt ist. Case-sensitive bedeutet, dass Groß/-Kleinschreibung der Mappingset-Einträge beachtet wird.

    • Mappe, wenn Wert enthält [...] (ignore case) bedeutet, dass jeder Eintrag des Mappingsets im Sinne einer Suchen&Ersetzen-Funktion auf den aktuellen Wert angewendet wird. Jeder Quellwert wird überprüft ob der gesuchte Wert vorhanden ist. Diese Funktion erlaubt ihne Texte zu ersetzen auch wenn Ihnen der genaue Inhalt des zu ersetzenden Textes/Wertes nicht bekannt ist. Case-sensitive bedeutet, dass Groß/-Kleinschreibung der Mappingset-Einträge beachtet wird.


 

Hinweis

Grundlage für die Übersetzung ist immer der komplette aktuelle!!! Wert der Zelle.
Ausnahme: Mapping-Modus Suchen & Ersetzen: Bei Suchen & Ersetzen wird jeder Eintrag des Mappingsets nacheinander auf den kompletten Wert der Zelle angewendet.

Beispiel: Suchen & Ersetzen (case-sensitive)

Spaltenwert: Das ist ein sehr langer Beschreibungstext. 

Mappingset:

 

ist=1
langer=bla
text=foo

 

Spaltenwert nach Anwendung des Mappingsets: 
Das 1 ein sehr bla Beschreibungsfoo. 

 

  • Trennzeichen (Source Delimiter): Diese Option ermöglicht es einzelne Werte einer Liste zu Mappen 

Beispiel:

Werte in einer Spalte sind durch > getrennt. Z.B.: kat1>kat2>kat3

Mappingset:

kat1=101
kat2=102
kat3=105

 

 

Ergebnis mit Trennzeichen ">":

101>102>105

  • Duplikate entfernen(Remove Duplicates): Ist diese Option aktiviert werden mehrfach vorkommende Werte im Ergebnis des Mappings entfernt

Beispiel:

Werte in einer Spalte sind durch > getrennt. Z.B.: A,B,C,Y

Mappingset:

A=101
B=102
C=105
Y=102

 

Ergebnis mit Trennzeichen "," und Duplikate entfernen :

101,102,105

 

 

 


 

 

Text Funktionen

Diese Funktionen sind nützlich, um Texten und Strings den letzten Schliff zu geben ohne dass man skripten muss.

Leerzeichen und Zeilenumbrüche

Diese Funktion entfernt Leerzeichen am Anfang und Ende der Spalten (sog. Trimmen) oder Zeilenumbrüche. Man kann zwischen 3 Optionen wählen:

  • Trimmen und Zeilenumbrüche durch Leerzeichen ersetzen
  • Trimmen und Zeilenumbrüche entfernen
  • nur Trimmen (Zeilenumbrüche erhalten)


Splitten

Damit kann man einen Spaltenwert nach einem bestimmten Zeichen trennen und dann auf einen bestimmten Teil zugreifen. Häufig braucht man das bei Komma-separierten Listen, um z.B. auf das 2. Element zuzugreifen.

  • Trennzeichen - das Zeichen nach dem getrennt werden soll z.B. Komma oder Semikolon
  • Position - das n-te Element auf das sie nach der Trennung zugreifen wollen. (0=das erste Element, 1=das zweite, 2=das dritte ...)
    • statt einer Zahl kann man bei Position auch last oder first eingeben, um auf das letzte bzw. auf das erste Element zuzugreifen.
    • bei last gibt es auch die Möglichkeit, die Position relativ zum letzten Element zu bestimmen (z.B. zur Bestimmung des vorletzten Elements kann man schreiben last-1)

Beispiel:

Ausgangswert: Wort1,Wort2,Wort3
Trennzeichen: , (Komma)
Position: 1 
Ergebnis: Wort2 

 

Ausgangswert: Wort1,Wort2,Wort3
Trennzeichen: , (Komma)
Position: last 
Ergebnis: Wort3


Ausgangswert: Wort1,Wort2,Wort3
Trennzeichen: , (Komma)
Position: first 
Ergebnis: Wort1 


Ausgangswert: Wort1,Wort2,Wort3
Trennzeichen: , (Komma)
Position: last-1 
Ergebnis: Wort2 

 

 

Teilzeichenfolge (engl. Substring)

Häufig muss man Zeichenketten/Strings auf eine bestimmte Länge kürzen, oder man braucht nur einen Teil davon. Dabei hilft diese Funktion, ohne das man Freemarker-Skripte benutzen muss. Der Vorteil dieser Positionen gegenüber der Freemarker-Skriptvariante ist, dass diese Funktion fehlertoleranter ist und man z.B. keine Längenprüfung machen muss.

Die zurückgegebene Teilzeichenfolge beginnt mit dem Zeichen der Startposition (Startposition am Anfang ist immer 0) und endet vor der angegeben Endposition.

Die Start oder Endposition kann auch leer gelassen werden (siehe Beispiele unten).


Beispiel: 

Ausgangswert: Synesty Studio
Startposition: 0
Endposition:  5
Ergebnis: Synes

Ausgangswert: Synesty Studio
Startposition: 3
Endposition:  6
Ergebnis: est

Ausgangswert: Synesty Studio
Startposition: 3
Endposition:  <leer>
Ergebnis: esty Studio

Ausgangswert: Synesty Studio
Startposition: <leer>
Endposition:  6
Ergebnis: Synest

 

 

 

 

 

 

Skript

Das Feld Skript gleicht dem Feld "Wert". Auch hier können Sie, per Freemarker, auf alle Quellspalten und Meta-Daten zugreifen und manipulieren.

Der Unterschied liegt darin, dass das Skript ganz am Ende der Verarbeitungskette ausgeführt wird. So können Sie beispielsweise eine Spalte per "Wert" manipulieren und diese manipulierten Daten im Skript Feld per ${value!} nochmals transformieren. In einigen Fällen benötigen Sie diese Flexibilität.

 

Hier finden Sie einige Beispiele zum Feld "Wert" und "Skript".

 

 

 

Gruppieren/Aggregatfunktionen

Diese Funktion ermöglicht es eine Spalte eines Spreadsheets zu gruppieren. Um die Funktion zu nutzen wählen Sie unter "Einstellungen" -> "Gruppieren nach Spaltenname" den Titel der Spalte aus, welche gruppiert werden soll. Die Gruppierung bewirkt, das alle Zeilen mit gleichem Wert in einer Zeile zusammengefasst werden. 

Beispiel:

Nicht gruppierte Daten

Sie haben beim Gruppieren drei Modus zur Auswahl


A) Ergebnis nach Gruppierung nach 1.Spalte - Modus: Nur gruppierte Zeilen zeigen

Dieser Modus gibt als Ergebnis die Gruppierten Spalten aus. Die originalen Zeilen werden also "zusammengefasst" und nicht mehr einzeln dargestellt:

 

B) Ergebnis nach Gruppierung nach 1.Spalte - Modus: Ergebnis als unterste Zeile

Wählen Sie diesen Modus, um die originalen Zeilen zu erhalten und zusätzlich das gruppierte Ergebnis zusätzlich hinzuzufügen. Zu Illustrationszwecken wurden auf die 2. und 3. Spalte Aggregatfunktionen angewandt. Mehr dazu im nächsten Abschnitt. 

C) Ergebnis nach Gruppierung nach 1.Spalte - Modus: Ergebnis als oberste Zeile

Dieser Modus gleicht dem Modus aus B) nur das die Zeile anstatt unterhalb, oberhalb der zusammengehörenden Zeilen ausgegeben wird.


Aggregatfunktion
  • Wert der ersten Zeile (Standard): In dieser Spalte wird der Wert der ersten Zeile übernommen. Die Werte der restlichen gruppierten Zeilen gehen somit verloren.
  • Erster nicht leerer Wert: Gibt den Wert der ersten Zeile, in der die Spalte nicht leer ist. 
  • Wert der letzten Zeile: In dieser Spalte wird der Wert der letzten Zeile übernommen. Die Werte der restlichen gruppierten Zeilen gehen somit verloren.
  • Alle Werte auflisten: Die Werte aller gruppierten Zeilen dieser Spalten werden als neuer Wert aufgelistet. Das Trennzeichen kann genutzt werden, um die Werte voneinander abzugrenzen

  • Eindeutige Werte auflisten: Die unterschiedlichen Werte aller gruppierten Zeilen dieser Spalten werden als neuer Wert aufgelistet. Das Trennzeichen kann genutzt werden, um die Werte voneinander abzugrenzen
  • Zeilen zählen: Anzahl aller gruppierten Zeilen (auch mit leeren Werten).
  • Eindeutige Werte zählen (nicht-leer): Anzahl der eindeutigen Wert mit nicht leeren Werten.

Mathematische Aggregatfunktionen

Voraussetzung für eine sinnvolle Anwendung dieser Aggregatfunktionen ist, dass die Werte der Spalte in Form von Fließkommazahlen mit Punkt als Dezimaltrennzeichen vorliegen z.B. 1.28

  • Kleinster Wert: Der niedrigste Wert aller gruppierten Zeilen wird ausgegeben
  • Größter Wert: Der höchste Wert aller gruppierten Zeilen wird ausgegeben
  • Summer aller Werte: Die Summe aller gruppierten Zeilen wird ausgegeben
  • Durchschnittswert: Der Durchschnitt aller gruppierten Zeilen wird ausgegeben (entspricht "Summe aller Wert" geteilt durch "Zeilen Zählen")

 

Ziel-Schema laden

Im SpreadsheetMapper kann man ein Zielschema zu laden. D.h., dass man ein fertiges Set von benötigten Spalten laden kann. Dabei kann man ein bestehendes Schema (siehe Datastores / Schema) auswählen, und dessen Spalten in das aktuelle Mapping laden. Alle Spalten werden daraufhin gelöscht und mit den Spalten des Schemas ersetzt.

Wann brauche ich das?

  • wenn Sie Daten per Flow in einen Datastore importieren wollen. 
    • Dazu laden Sie das Schema ihres Ziel-Datastores und kreuzen noch die Option "Identifier Spalten für Datastore Import hinzufügen" an.
  • oder wenn man bestimmte Zielformate häufig braucht. Dann kann man dafür ein Schema anlegen, und dieses dann immer wieder bei Bedarf laden. 

 

 

Erlaubte Werte

 

Eine Eigenschaft von Schemas ist, dass man sog. "erlaubte Werte" hinterlegen kann (z.B. die Werte Neu oder gebraucht beim Feld Zustand). Diese tauchen dann dann auch in der Mappingansicht im SpreadsheetMapper auf, wenn man dieses Schema geladen hat. 
Einige Add-Ons bringen feste Schemas mit, wo diese erlaubten Werte bereits hinterlegt sind. 

 

 

 

 

 

${datecalc(prop_lastruntime?datetime, "DAY", -2)?string('yyyy-MM-dd HH:mm')}

 

 

Einfacher Zugriff auf erste Zeile eines Spreadsheets

Für fortgeschritte Nutzer, die z.B. oft direkt mit REST-APIs oder Webservices arbeiten, gibt es jetzt eine einfachere Möglichkeit per Freemarker auf Werte der ersten Zeile eines Spreadsheets zuzugreifen. 

Diese Funktion ist im Kontext von folgenden Steps interessant:

 

Wert der Spalte "status" der ersten Zeile: ${output@SpreadsheetUrlDownload_2.firstRow("status")!}

Hier wird der Wert der Spalte status der ersten Zeile des Spreadsheets ausgegeben. 

bzw.

Wert der Spalte "status" der ersten Zeile: ${output@SpreadsheetUrlDownload_2.firstRow("status", "no status")!}

Hier wird auch der Wert ausgegeben. Über den zweiten Parameter kann aber ein Default-Wert mitgegeben werden, der zurückgegeben werden soll, sollte es die Spalte Status nicht geben.

 

Hinweis zu Variablennamen

Hinweis: Der Variablenname output@SpreadsheetUrlDownload_2 ist nur ein Beispiel. Die Zahl am Ende (in diesem Fall _2) und unterscheidet sich je nach Step und Position des Steps. Über den Pfeil unter den Steps kommen Sie an den korrekten Variablenname.


Hinweis zum Unterschied von Variablennamen im SpreadsheetMapper und anderen Steps:

Es ist wichtig, dass man Variablen immer mit dem Plus-Button einfügt. Denn im SpreadsheetMapper unterscheidet sich die Schreibweise von Variablen, z.B. im Vergleich zum TextHTMLWriter Step.
Beim SpreadsheetMapper steht bei Variablen, die aus vorherigen Steps oder Flow-Variablen kommen noch das Prefix "meta". Im TextHTMLWriter ist diese Prefix hingegen nicht notwendig. Der Plus-Button beachtet diese Dinge und fügt immer kontext-abhängig den korrekten Variablennamen ein.

und dann 

 

 

 

  • Keine Stichwörter