Regel wenn Datum nicht erkannt

Ich nutze folgende Eingangsregel, “OCR” welche auch zu 90 Prozent funktioniert.

Wie könnte eine Regel lauten die sich im Anschluss darum kümmert dann das Importdatum zu nutzen?
Ich finde einfach keine passende.
In etwas so: wenn Dokumentenname kein Datum enthält dann benenne um in Name-Hinzufügedatum

In Intelligenten Regeln gibt es keine Verzweigungen, wie Du sie bräuchtest. Was möglicherweise ginge: Nach dem Ändern des Namens die Datei aus der Inbox in die passende Datenbank/Gruppe zu verschieben.
Und eine weitere Regel für die Inbox aufzusetzen, die nach dieser hier läuft mit den Kriterien “Name enthält kein Datum” (ich fürchte, das funktioniert gar nicht so recht mit DT, weil man in den Bedingungen keinen Regulären Ausdruck angeben kann - @BLUEFROG?) und Wortanzahl > 0. Und dann eben das Importdatum in den Aktionen vor dem Namen platzieren und diese Datei(en) ebenfalls verschieben.

Wenn ich es richtig verstehe, bräuchte man einen Operator “Name stimmt nicht überein mit”. Den gibt es aber nicht. Und man kann die Bedingung für “stimmt überein” leider nicht negieren, scheint’s.
Alternativ: Nach “Name ändern” ein Script laufen lassen, das das Richtige™ tut:

  • wenn newest date einen Wert enthält, Namen auf newest date & name setzen
  • sonst den Namen auf document date oder date created (& name setzen), je nachdem, welches existiert.

Das Script könnte so aussehen wie weiter unten. Achtung, das ist NICHT GETESTET, außerdem sieht es grauenhaft aus, weil ich keine Möglichkeit gefunden habe, in AppleScript eine Variable auf “undefined” zu testen außer diese blöden try-on error Dinger (wieder was, was Apple mal reparieren könnte, statt neue Emojis zu entwickeln). Vielleicht hat @pete31 hier eine bessere Lösung parat, für ihn ist AppleScript quasi Muttersprache :wink:

on performSmartRule(records) 
  tell application id "DNtp"
 	set theRecords to selected records
	repeat with theRecord in theRecords
        set theName to name of theRecord
        set theDate to newest document date of theRecord
        try
  	      set name of theRecord to theDate & " " & theName
        on error
	      set theDate to document date of theRecord
          try
            set name of theRecord to theDate & " " & theName
          on error
            set theDate to creation date of theRecord
            set name of theRecord to theDate & " " & theName
	    end try
      end try
  end repeat
end tell
1 Like

Dito, unschön. Das sollte es tun

-- Umbenennen mit Dokumentendatum

on performSmartRule(theRecords)
	tell application id "DNtp"
		try
			repeat with theRecord in theRecords
				set theName to name of theRecord
				set theDate to newest document date of theRecord
				try
					set {theYear, theMonth, theDay} to my formatDate(theDate)
				on error
					set theDate to document date of theRecord
					try
						set {theYear, theMonth, theDay} to my formatDate(theDate)
					on error
						set theDate to addition date of theRecord
						set {theYear, theMonth, theDay} to my formatDate(theDate)
					end try
				end try
				set name of theRecord to theYear & "-" & theMonth & "-" & theDay & " " & theName
			end repeat
			
		on error error_message number error_number
			if the error_number is not -128 then display alert "DEVONthink" message error_message as warning
			return
		end try
	end tell
end performSmartRule

on formatDate(theDate)
	set theYear to year of theDate as string
	set theMonth to ((month of theDate) as integer) as string
	if (count of characters in theMonth) = 1 then set theMonth to ("0" & theMonth) as string
	set theDay to day of theDate as string
	if (count of characters in theDay) = 1 then set theDay to ("0" & theDay) as string
	return {theYear, theMonth, theDay}
end formatDate

1 Like

:wink: Das tut auch nix anderes als mit try … on error auf einen Fehler zu reagieren (und natürlich das Datum hübsch zu machen). Ich hatte gehofft, dass es eine Alternative zu try … on error gibt um herauszufinden, ob eine Variable definiert ist. Sowas wie if variable is not defined. Offenbar nicht. Auch is equal to missing value oder is equal to null tun nicht das Gewünschte. Yuck.

Danke für eure Mühe. Ich hoffe es hat euch nicht zu viel an Zeit gekostet? Das es so kompliziert wird hätte ich nicht gedacht. Dachte eher ich bin blind auf dem Auge.
Soviel Arbeit muss dann doch nicht sein. Dann muss es eben weiterhin händisch funktionieren.

Das ist nicht ganz Sinn der Sache Skripte zu schreiben :slightly_smiling_face:

Ich hatte nicht den kompletten Thread gelesen und scheine daher missverstanden zu haben was das Ziel war:

Also soll das Hinzufügungsdatum genutzt werden wenn der Name kein Datum enthält und das Dokumentendatum spielt gar keine Rolle? Falls ja: in welchem Format wäre das Datum falls es im Namen vorhanden ist?

Falls ich den OP richtig verstanden habe:

  • Wenn das newest document date vorhanden ist, stelle es in “sortierbarer” Form vor den Namen
  • Sonst versuche dasselbe mit dem document date
  • Wenn es das auch nicht gibt, mach es mit dem addition date

Das heißt, man hat am Ende immer einen Namen der Form “yyyy-mm-dd blafasel”. Das Datum ist quasi das “beste mögliche”, also in absteigender Präferenz das neueste aus der Datei, irgendeins aus der Datei und das Hinzufügedatum.
Aber vielleicht habe ich den OP auch flasch verstanden. Warum es nun zu viel sein soll, das Script zu benutzen, verstehe ich leider auch nicht.
PS

Da hast Du den OP m.E. flasch verstanden (bzw. den Zusammenhang nicht gesehen). Mit “Name” meinte er in diesem Fall den Namen des Datensatzes nach dem Umbenennen in sortable newest document date&name. D.h. Er wollte erst eine Smart Rule den neuen Namen bestimmen lassen und für den Fall dass dieser neue Name kein Datum enthält (weil es eben kein newest document date gibt), das Hinzfügedatum verwenden. Sowas wie ein if … else in einer Smart Rule.

Ah ok. Dann macht das Skript bereits was gewünscht ist.

Die Jungs haben die Arbeit schon erledigt :wink: weißt du, wie du das in eine intelligente Regel einbindest?

Sorry für die Späte Rückmeldung. War ne weile off.
Genauso sollte es sein. Name erstmal egal. Datum wenn nicht aus dem Dokument dann das neuste das mir zur Verfügung steht. Also am besten das Hinzufügedatum. Hatte nicht raus gelesen ob das Script nun schon funktioniert.

Das mit dem Einbinden habe ich noch nie probiert. Gibt es da nen Wiki für? Arbeite mich gern etwas ein.

Ob es ein Wiki gibt, kann ich dir nicht sagen. Aber ein Skript bettest du in eine intelligente Regel ein, indem du als Aktion Skript ausführen > Eingebettet > Skript bearbeiten wählst. Sobald du auf “Skript bearbeiten” tippst, öffnet sich ein Fenster. Das darin enthaltene Basisskript

on performSmartRule(theRecords)
	tell application id "DNtp"
		repeat with theRecord in theRecords
		end repeat
	end tell
end performSmartRule

überschreibst du einfach mit dem Skript, das Pete zur Verfügung gestellt hat. Auf welche Dokumente das Skript angewandt wird bestimmst du mit den Bedingungen der intelligenten Regel.

Wie immer gilt: erst ein paar mal ausprobieren, idealerweise mit eher engen Bedingungen; so kannst du frühzeitig feststellen, ob das Skript das macht, was du willst. Die durch das Skript vorgenommenen Änderungen lassen sich nur manuell rückgängig machen. Sei dir vor allem sicher, dass du das Skript nur auf die Inbox, und z.B. nur nach Import einer Datei anwendest; es ist keine Sicherheit in das Skript eingebaut, d.h. lässt du das Skript mehrfach laufen, so wird der Dateiname jedes mal wieder um ein Datum ergänzt (du kannst dir also vorstellen, was passiert, wenn du anstatt “Inbox” und “Datei ist PDF” “Datenbanken” und “alle Dokumentenarten” wählst, und dein Skript laufen lässt… @pete31 @chrillek mit set thisCheck to texts 1 thru 10 of theName könnte man die ersten 10 Zeichen des Dateinamens erfassen - wie könnte man dann am einfachsten prüfen, ob es sich dabei um ein (vorab durch Petes Skript vorgehängtes) Datum handelt, um eine entsprechende dann lass die Datei in Ruhe-Schleife einzubauen?

1 Like

Und vorzugsweise mit Duplikaten von Dokumenten!

1 Like

Man könnte das in AppleScript mit einem regulären Ausdruck machen (man könnte es in AppleScript auch anders machen, aber darüber kann ich nicht nachdenken, ohne Kopfschmerzen und Ausschlag zu bekommen). @pete21 hat mal etwas über Reguläre Ausdrücke in ObjCAppleScript im Forum geschrieben, aber ich finde es gerade nicht wieder. Muss in einem Thread gewesen sein, den @rufus123 begonnen hatte.
Ergänzung:
hier
steht was dazu (und es ist auch kopfschmerzträchtig)
und hier ist der Post von @pete31, den ich meinte. Da muss man dann nur den regulären Ausdruck ein bisschen anpassen, etwa so

"\\d{4}-\\d\\d-\\d\\d"

Aka “vier Ziffern, Bindestrich, zwei Ziffern, Bindestrich, zwei Ziffern”. Unter der Annahme, dass Bindestrich der Trenner hier ist.

Das würde aber jede 4-stellige Zahl am Anfang des Namens erfassen, oder? Will sagen, es gäbe keine Prüfung, ob es sich tatsächlich um ein Datum handelt?

try
  set thisDate to my convertDate(thisCheck)
on error
  --do the rest of the script
end try

on convertDate(thisCheck)
	return date thisCheck
end convertDate

funktioniert; allerdings kann diese on-Schleife nicht eingebettet werden (bzw. bei DT 3,5 funktionierte das nicht)

Ich warte eh schon den ganzen Tag darauf, dass du das mit zwei Zeilen JS machst :smiley: hat sich die Lieferung mit den gemischten Klammern verspätet? :crazy_face:

@rerexx alles klar? :crazy_face:

Du hast hier 3 Ansätze erhalten, wie du in Petes Skript eine Sicherheitsschleife einbauen könntest, damit Dateinamen die bereits durch das Skript geändert worden sind keine erneute Änderung erfahren können. Wenn du Lust hast, dann ist das ein guter Ansatz um das Skript besser zu verstehen; wenn du versuchen magst, selbst eine solche Schleife einzubauen, kannst du gern das Ergebnis posten oder gezielt nach Hilfe fragen.

Nee, die züchte ich selbst.
Tatsächlich funktioniert JS nicht in smart rules. Sonst würde ich etwa

records.for each(r => {
  let name = r.name();
  if (!/^\d{4}-\d\d-\d\d/.test(name)) {
     ....
  }
})

vorschlagen. Im if dann die jeweiligen Daten auf ! undefined abfragen und gut ist.
Bzw gut wäre, könnte man in smart rules JS benutzen. Schon 'n bisschen schade, Hazel und Drafts zb verarbeiten gerade zu gerne Javascript.

1 Like

Damit hab ich jetzt nen Problem. Also die Umbenennung ist gelaufen aber kein Datu im Dateinamen…
Wie heißt den jetzt die Bedingung dazu? “enthält nicht Datum” gibt’s ja nicht…
Mir fehlt also der Einstieg in die Regel um das Script dann einbinden zu können.

Also die Datei wurde umbenannt, aber nicht umbenannt?