Stop If für XLS Datei Inhalt

Hallo,
wir rufen täglich eine Mail ab von einem unserer Dropshiper ab.
Die hängen an diese Mail zwei Exceldateien an. Jeweils eine für unsere beiden Firmen. Darin sind dann Sendungsnummern die wir mit Synesty in Plenty eintragen. Allerdings ist es vorgekommen das in einer der Dateien nicht unsere Firma war, sondern ganz andere Daten.
In Zeile 5 Spalte B steht der Name des Mandanten, also unsere Firma, als Teil eines Strings in der Form:
„Selbstbucher: Keenberk GmbH …“ bzw. „Selbstbucher: kütec.de …“
Die drei Punkte stehen für weiteren Text.
Wenn der Inhalt nicht unsere Firmen betrifft fehlt logischerweise entweder Keenberk oder kütec.de.
Wie kann ich jetzt prüfen ob Keenberk oder kütec.de in der Zelle vorkommt und wenn nicht den Flow mit einem Fehler stoppen?

Hallo,

du kannst mittels folgendem Skript alle Zellen eines Spreadsheets nach den gewünschten Texten durchsuchen. Wenn nach dem Durchlauf des Skripts die Zeile noch nicht gefunden wurde, wird der Text ABORT ausgegeben.

<#assign string_found = false>
<#list output@Excel2Spreadsheet_1.getRows() as row>
<#if !string_found>
  <#list row.getCols() as col>
    <#if col.get()?contains("Keenberk") || col.get()?contains("Kütec")><#assign string_found = true></#if>
  </#list>
<#else>
<#break>
</#if>
</#list>
<#if !string_found>ABORT</#if>

Das Skript habe ich in einen HTMLWriter-Step gepackt und anschließend prüfe ich als Kondition in dem StopFlowIf-Step, ob der Inhalt des HTMLWriters gleich ABORT ist.

Hier ein minimales Beispiel: FlowExport-Tests-Test_Abbruch.json (4,1 KB)

Gruß
Gustav

1 Like

Das klingt gut, vielen Dank.
Ich werde es ausprobieren.

<#if col.get()?contains("Keenberk") || col.get()?contains("Kütec")>

Wie müsste diese Zeile aussehen, wenn beides gefunden werden muss?

Hallo @keenberk,

statt den beiden Pipe Zeichen (||) zwei Ampersand (&&) setzen.

Viele Grüße
Lukas

hm… ja, das hatte ich auch gedacht, aber das funktioniert leider nicht.
Es sind ja zwei Dateien die ich mit dem CSVReader Step einlese in ein spreadsheet.
Wenn ich die Ampersand einfüge, dann kommt auch ein Stop obwohl in den jeweiligen Zeilen jeweils Keenberk bzw. Kütec steht.
Hab dann gedacht ok, dann prüfst du halt den String zweimal jeweils nach den keywords. Allerdings funktioniert das auch nicht.

<#assign string_found = false>
<#list spreadsheet@SpreadsheetCSVReader_2.getRows() as row>
<#if !string_found>
  <#list row.getCols() as col>
    <#if col.get()?contains("Keenberk")><#assign string_found = true></#if>
  </#list>
<#else>
<#break>
</#if>
</#list>
<#assign string_found2 = false>
<#list spreadsheet@SpreadsheetCSVReader_2.getRows() as row>
<#if !string_found2>
  <#list row.getCols() as col>
    <#if col.get()?contains("kütec.de")><#assign string_found2 = true></#if>
  </#list>
<#else>
<#break>
</#if>
</#list>
<#if !string_found || !string_found2>ABORT</#if>

Ist halt seltsam. Für ein keyword funktioniert das Script wunderbar, suche ich aber zwei dann nicht.

Ups. Statt einer neuen Antwort zu posten habe ich versehentlich meine erste Antwort oben editiert.

Hier nochmal die Antwort. Ich gucke mal, ob ich meinen Edit oben irgendwie rückgängig machen kann.


Ich habe mal dein Skript umgeschrieben, dass nach den beiden Strings in einem Durchlauf des Spreadsheets gesucht wird.

<#assign keenberk_found = false>
<#assign kutec_found = false>
<#list output@Excel2Spreadsheet_1.getRows() as row>
  <#if !keenberk_found || !kutec_found>
    <#list row.getCols() as col>
      <#if col.get()?contains("Keenberk")><#assign keenberk_found = true></#if>
      <#if col.get()?contains("kütec.de")><#assign kutec_found = true></#if>
    </#list>
  <#else>
    <#break>
  </#if>
</#list>
<#if !keenberk_found || !kutec_found>ABORT</#if>

Bei meinen Tests funktioniert übrigens auch dein Skript. Auf die Schnelle fallen mir drei mögliche Fehlerursachen ein.

  1. ?contains(„…“) sucht case-sensitive. Entspricht der Suchstring genau der Schreibweise aus deiner Excelliste?
  2. Du liest anscheinend eine CSV-Datei. Wird das Ü aus kütec korrekt dargestellt oder gibt es vielleicht ein Enocding-Problem?
  3. Liest du im CSVReader die gesamte CSV ein? Wenn du die Option „startLineNo“ benutzt, um erst ab einer bestimmten Zeile die CSV-Datei ins Spreadsheet zu packen, überspringst du damit vielleicht die Zeile, in der kütec oder keenberk steht.

Hallo Gustav,
nein, an der Mail sind tatsächlich zwei XLS Dateien angehängt und die lese ich mit dem CSV Reader Step ein. In der Beschreibung des Steps steht das er mehrere CSV/XSL in ein Spreadsheet lesen kann. Und das funktioniert auch wunderbar.

Danke für die Hilfe, mir ist es peinlich es zu sagen, aber es war tatsächlich die startLineNo Option. Manchmal verzweifelt man nur weil man an der falschen Stelle sucht.

Mal noch Interessehalber:
Gibt es eine Möglichkeit in einem bestimmten Fehlerfall, wie diese StopIf, eine SMS an eine Handynummer zu senden?

nein, an der Mail sind tatsächlich zwei XLS Dateien angehängt und die lese ich mit dem CSV Reader Step ein. In der Beschreibung des Steps steht das er mehrere CSV/XSL in ein Spreadsheet lesen kann. Und das funktioniert auch wunderbar.

Stimmt, du kannst auch XLS darüber auslesen. Ich hatte nur den CSVReader in deinem Skript gesehen und automatisch an CSV-Dateien gedacht.

Danke für die Hilfe, mir ist es peinlich es zu sagen, aber es war tatsächlich die startLineNo Option. Manchmal verzweifelt man nur weil man an der falschen Stelle sucht.

Das passiert den besten. Manchmal ist die Lösung einfach zu offensichtlich :slight_smile:

Mal noch Interessehalber:
Gibt es eine Möglichkeit in einem bestimmten Fehlerfall, wie diese StopIf, eine SMS an eine Handynummer zu senden?

Ein Addon gibt es dazu afaik nicht. Es gab wohl mal eines von GTX, aber das ist nicht mehr auffindbar.
Da müsstest du wohl selbst eine API anbinden. Wenn du nach „send sms via api“ googlest, findest du zahllose Dienstleister.

Gruß
Gustav

1 Like

Ok, da werde ich mal suchen gehen.
Vielen Dank :slight_smile:

Hallo nochmal,
ich habe einen Anbieter gefunden bei dem man einfach nur eine simple Mail hinsenden kann und die als SMS weitergeschickt wird. Dazu würde ich gern den Step EmailSendSMTP nutzen.
Da war mein Gedanke das ich den StopIF ja nicht mehr brauche. Wie kann ich jetzt quasi auf die Bedingung hin das im TextHTMLWriter der String ‚ABORT‘ steht den EmailSend Step ausführen lassen?
Hab da an die neuen Gruppen Bedingungen gedacht, aber da bekomme ich eine Fehlermeldung das ich die nicht nutzen kann.

Hallo,

du kannst über die Option skipSending das Senden der Mail steuern.

Im FileFilter-Step kannst du den TextHTMLWriter-Output als Kondition verwenden und so die Datei entfernen. Wenn es keine Datei gibt, kannst du über den StringToFile-Step eine Dummydatei erstellen.

Ich kann dir grad leider gar nicht folgen.
Zu welchem Step gehört denn das skipSending?
Warum sollte ich eine Datei entfernen oder erstellen?

Die skipSending-Option kommt aus dem MailSend-Steps. Damit kann man abhängig vom Vorhanden sein bzw. Fehlen von Anhängen den Versand der Mail steuern.

Ob eine Datei in den MailSend-Step ankommt, steuert du über einen FileFilter-Step, so wie hier:

Wenn der HTMLWriter den Text „ABORT“ enthält, wird die Datei durchgereicht und ansonsten rausgefiltert. Den Output des FileFilters benutzt du als Anhang in deinem SendMail-Step.

Wenn du keine Datei zur Hand hast, die dort verschickt werden könnte, kannst du über den StringToFile-Step eine leere Datei erstellen, welche du dann als Input für den FileFilter benutzen kannst.

Hoffe, dass macht es klarer. Ansonsten kann ich später noch einen kleinen Beispiel-Flow zusammen werfen.

Hallo Gustav,
danke für die Hilfe.
Die skipSending-Option hab ich jetzt auch in der Hilfe gefunden, aber am Step selbst fehlt diese Option.

Ok, das andere schau ich mir nochmal in Ruhe an nächste Woche. Mache gleich in den Kurzurlaub.
Schönes Wochenende :slight_smile:

Kein Problem.

Im EmailSend-Step gibt’s die Option definitiv, bei dem EmailSendSMTP bin ich mir grade nicht so sicher. Möglicherweise tauchen die erst auf, wenn man die Anhang-Option befüllt.