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
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
-- 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
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
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?
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.
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.
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?
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)
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.
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.