Email nur am ersten Durchlauf des Tages versenden?

Hallo zusammen,
ich rätsele grade ein bisschen wie wir das am einfachsten in den Griff bekommen:

Wir haben einen Flow, der diverse Dinge an Artikeln automatisch setzt (u.a. in Abhängigkeit von Tags). Dieser Flow hat eine Fehler-Erkennung die Artikel auswirft, deren Verarbeitung nicht möglich ist, z.B. weil widersprüchliche Tags gesetzt wurden.

Diese Artikel werden in eine CSV geschrieben, und gehen per Mail nach Slack.

Nun haben wir aber festgestellt dass „einmal am Tag“ an der Stelle nicht genug ist, und ich musste den Cron entsprechend auf acht mal täglich erweitern, damit Änderungen schnell genug im System ankommen.

Das bedeutet leider auch, dass die Mail jetzt acht mal am Tag in Slack aufschlägt :man_facepalming:

Ich bräuchte als eine Möglichkeit den EmailSend nur noch einmal am Tag zu triggern. Bin mir aber nicht ganz im klaren ob über Filter, Gruppen-Bedingungen, StopFlowIf, oder gar einer Kombination aus allem.


Mein Ansatz bisher:
In einer Spreadsheet-Spalte die aktuelle Stunde aus dem current_timestamp holen, und „hart“ prüfen, ob diese dem ersten Durchlauf (hier: 6 Uhr früh) entspricht. Spaltenwert wird dann entweder 1 oder 0, je nachdem. Für jede Zeile der selbe Wert.

Dann in einem Filter prüfen, ob die Spalte 1 oder 0 ist. Dann einer Condition-Group prüfen lassen, ob der Filter Ausgabe-Spalten hat, oder nicht. Und dann eben im A-Branch die Mail verschicken, und im B-Branch nichts tun. Die Flowchart läuft danach wieder zusammen, ab da weiter wie bisher.

Gefühlt ist das aber relativ komplex, gibts vielleicht eine elegantere Lösung für mein Problem?

Was mich auch stört: wenn ich „aus Gründen“ mich entscheiden sollte dass es um 6 gar keinen Durchlauf mehr gibt, dann scheitert auch mein Vergleich, und es gehen gar keine Mails mehr raus. Klar, kann man dran denken versuchen, aber lieber wär mir eine dynamische Lösung die tatsächlich den ersten Durchlauf des Tages erkennt, statt sich ne bestimmte Stunde raus zu popeln. Spätestens wenn ich zwei Durchläufe in der Stunde brauche, scheitert mein Konzept sowieso.

Gibts vielleicht ne interne Variable die ich übersehen habe? Oder ein komplett anderer Ansatz für das ganze?

Grüße Daniel

Du könntest dir einen Datensatz in den Datastore schreiben.

identifier=${prop_actualruntime?string("yyyyMMdd")}_MeinFlow1

Vorher checkst du, ob es diesen Datensatz schon gibt oder nicht (z.B. per Querverweis).

a) gibts noch nicht → Erster Run des Tages
b) gibts schon → Nicht erster Run

So als Idee…

Danke, das ist auf jeden Fall eleganter eine Marke zu setzen beim Ablauf, und dann zu prüfen ob sie schon da ist :muscle:

Ab da dann aber weiter wie von mir skizziert? Also Filter auf die Spalte, dann Group-Condition ob der Filter Reihen besitzt?

Grüße Daniel

Ja würde gehen.
Evtl. könnte man auch direkt mit firstRow() prüfen, ob Querverweis-Spalte leer oder nicht. Würde evtl. den Filter Step sparen. Ist vermutlich Geschmackssache, was man für verständlicher erachtet.

WENN
spreadsheet@SpreadsheetMapper_1.firstRow("datumsSpalteAusQuerverweis")! == ""
DANN
erster Run
SONST
nicht erster Run

1 „Gefällt mir“

Ich habs versucht, aber irgendwas klappt nicht mit der Bedingung :confused:

Die lautet konkret spreadsheet@SpreadsheetMapper_59.firstRow("timestamp_saved")! == "none"

Im Mapper 59 in der Spalte timestamp_saved ist der Querverweis auf den Datastore (Defaultwert = none), und in der Vorschau klappt auch alles:

Auch ein TextHTMLWriter mit Template ${spreadsheet@SpreadsheetMapper_59.firstRow("timestamp_saved")} ergibt wie zu erwarten:

2021-10-26 19_41_39-Step Configuration - Synesty Studio - https___apps.synesty.com_studio_jobControl

Trotzdem löst meine Bedingung (s.o.) direkt danach nie aus:

Ich seh doch aber das der Datastore leer ist, der QV muss none ergeben.
Was übersehe ich?

Danke Daniel

Hmm… ist in der timestamp_saved Spalte evtl. ein Leerzeichen oder Zeilenumbruch enthalten?

probier mal

spreadsheet@SpreadsheetMapper_9.firstRow("timestamp_saved")!?trim == "none"

oder wende im Mapper mal noch die Textfunktion „Trimmen und Zeilenumbrüche entfernen“ an, so dass die Spalte schon bereinigt raus kommt.

image

Du kannst die Condition auch im TextHTMLWriter testen:

<#if spreadsheet@SpreadsheetMapper_9.firstRow("timestamp_saved")!?trim == "none">Match Yeah!<#else>kein Match.</#if>

Das ist das gleiche was die Condition macht.

Hier mal ein Flow zum Testen:

FlowExport-StepGroupTest-1-StepGroupTestConditionfirstRow.json (10,5 KB)

Die Flow-Variablen müsstest du noch auf deinen Datastore anpassen:
image

Nein, definitiv nicht.

Sowohl ein Filter timestamp_saved! == 'none' als auch ein TextWriter <#if spreadsheet@SpreadsheetMapper_59.firstRow("timestamp_saved")! == "none">Match Yeah!<#else>kein Match.</#if> sagen dass alles passt…


Moment, teste deinen Flow und melde mich gleich wieder :v:

An welcher Stelle schreibst du in den Datastore? Das müsste ja eigentlich NACH der Condition passieren - also in einer der Abzweigungen.

Run 1 Tag 1:

  1. initial kommt „none“, weil noch kein Marker im Datastore.
  2. Branch A wird durchlaufen. Dort setzt du den Marker per DatastoreWriter.

Run 2 Tag 1:

  1. jetzt ist der Marker schon da (Run 1 Tag 1)
  2. Branch B wird ausgeführt.

Run 1 Tag 2:
wie oben usw.

Kannst du vielleicht mal Screenshot schicken, wo man die Gruppen vor und nach der Condition sieht?

Zusammenfassung

Also nicht, dass du VOR der Condition den DatastoreWriter hast, denn dieser wird bei Step-Vorschau nicht ausgeführt… damit würde dein Mapper noch „none“ finden. Bei einem echten Durchlauf wird ein DSWriter aber ausgeführt und schreibt in den Datastore… damit würde der Mapper etwas finden.
Das würde erklären, warum dein Eventlog gegen deine Erwartung in den anderen Branch geht.

Mit anderen Worten: Das Schreiben in einen Datastore und ein Querverweis im Mapper ist in der Vorschau nicht testbar, da in der Vorschau niemals echt geschrieben wird. Sowas ließe sich nur in einem echten Durchlauf testen.

1 „Gefällt mir“

eieiei, ich bin dumm :man_facepalming:

Weiß gar nicht wie ich drauf gekommen bin den Datastorewriter vor die Condition zu ziehen. Aber wie du sagst: in der Vorschau sieht das dann alles okay aus. Von der Logik her machts aber absolut keinen Sinn, und die Bedingung wird nie wahr.

Ich meld mich gleich noch mal, aber das wirds wohl gewesen sein. Wald, Bäume, usw. Danke!

Ja klar, das wars! Ich hab mich so darauf versteift dass die Bedingung ja wahr sein muss, das ich nicht gesehen hab, dass sie es gar nicht ist.

Tut jetzt alles wie es soll. Danke fürs mitdenken :sweat_smile:

1 „Gefällt mir“