Vormonat in Smart Rules

Hallo,

ich möchte eine Datei mit einer Smart rule u.a. umbenennen. Normalerweise funktioniert das mit den vorgegebenen Möglichkeiten einwandfrei. Dazu nutze ich für das Datum einen Wert aus dem Dokument. Nun benötige ich jedoch vom aktuellen Datum aus den Vormonat bzw. im Januar noch das Vorjahr. Bislang habe ich die Umbenennung noch manuell durchgeführt, aber es wäre klasse, wenn das auch automatisch ginge. Leider konnte ich nichts diesbezüglich in den bereitgestellten Menüs finden. Habe ich etwas übersehen? Ich hoffe, es gibt eine einfache Lösung dafür. Danke vorab.

Beispiele:
02.05.2020 sollte als Teil des Dateinamens 2020-04 liefern und
04.01.2020 sollte 2019-12 ergeben.

Eine Regel mit einem Skript sollte das liefern können.

Der erste Schritt Ihrer neuen Regel könnte (sollte?) daraus bestehen, dass Sie mit Ihrer für andere Dokumente verwendeten Regel das Datum aus dem Dokument auslesen und es in den Dateinamen einfügen. Dann haben Sie schon einmal Monat und Jahr im Dateinamen – natürlich noch den falschen Monat, aber ein (Teil-)Dateiname lässt sich durch ein Skript auslesen.

Wenn sich das Datum immer an derselben Position im Dateinamen befindet – einfacher wird es, wenn der vorläufige Dateiname ausschließlich aus dem falschen Datum besteht –, muss das Skript anschließend diesen Teil des Namens auslesen, diesen in die Teile Jahr, Monat und Tag zerlegen, vom Monat 1 abziehen, wenn 0 dabei herauskommt, den Monat auf 12 setzen und dafür 1 vom Jahr abziehen. Dann müssen die neuen Werte in der gewünschten Reihenfolge zusammengesetzt und in den Namen eingefügt werden.

Wenn Sie sich wenigstens ein bisschen mit Apple Skript oder mindestens einfachem Programmieren in anderen Sprachen auskennen, können Sie sich vorhandene Skripte zum Umbenennen von Elementen ansehen und versuchen eins davon abzuwandeln. Beachten Sie aber, dass diese Skripte alles “Menü”-Skripte sind, das heißt, sie werden auf aktuell ausgewählte Elemente angewandt. Sie brauchen aber ein Skript für Smart Rules. Auch hierfür gibt es Beispiele.

Falls Sie es nicht schaffen: Es gibt hier einige Experten für Apple Skript. Ich bin übrigens keiner davon, habe aber einfache Skripte oft hinbekommen oder hier nachgefragt. Auf Englisch stehen die Chancen natürlich besser, weil das die meisten hier sprechen.

Ihre Smart Rule, wenn Sie fertig ist, halte ich übrigens für äußerst praktisch. Kontoauszüge, Rechnungen u. ä. werden ja oft erst ausgestellt, wenn der darin erfasste Zeitraum abgelaufen ist. Eine automatische Benennung von solchen Dokumenten mit dem Rechnungsmonat anstatt Rechnungsdatum kann für viele nützlich sein.

Vielen Dank für Ihre Antwort. Das hat meine Befürchtung bestätigt, dass es keine schnelle und einfache Lösung für das Problem gibt. Den Vormonat benötige ich nur in ganz wenigen Fällen, sodass es für mich wahrscheinlich einfacher ist, diese Dateien manuell umzubenennen, wie zuvor auch. Mit Apple Script konnte ich mich nie anfreunden… Vielleicht befasse ich mich mit dem Thema, wenn ich mal viel Zeit habe.
Aus Ihrer Antwort jedoch entnehme ich, dass mehrere Leute dieses Problem haben könnten. Daher wäre das evtl. ein Feature request. Hilfreich wäre da ein Datumsfeld, entweder fix mit Vorjahr, Vormonat oder ein Datumsfeld, das mit einem Zusatzwert (+1, +2, -1, -2) erweitert werden kann…

Nein, es ist gar nicht so kompliziert. Für Kenner von Apple Script ist es sogar ein Witz.

Ich, wie gesagt: kein Kenner, musste eine ganze Weile herumprobieren und bin am längsten daran hängengeblieben, wie man Text in Zahlen umwandelt, damit ich von dem Monatstext und dem Jahrestext im Namen der Datei nötigenfalls 1 abziehen kann. Aus anderen Programmiersprachen kenne ich Umwandlungsfunktionen, Apple Script sieht das ein bisschen anders: Wenn man hinter den Text “10” - 1 schreibt, dann wird der Text automatisch in eine Zahl verwandelt.

Aber ich kann, glaube ich, nun eine Lösung vorlegen.


Schritt 1

Sie müssen das folgende Skript im Skript-Unterordner “Smart Rules” unter einem Namen Ihrer Wahl sichern. Sie gelangen dorthin, indem Sie in DEVONthink in der Menüleiste auf das Skript-Symbol klicken und den Menüpunkt “Open Scripts Folder” bzw. dessen deutsche Übersetzung anklicken. Dort finden Sie auch den Unterordner “Smart Rules”

Erst dann wird das Skript in der Auswahlliste der Smart Rule bei “Execute Script” aufgeführt.

Und hier ist das Skript:

on performSmartRule(theRecords)
	tell application id "DNtp"
		repeat with theRecord in theRecords
			set theName to name of theRecord
			if (theName is not "0-00") then
				set theYear1 to (characters 1 thru 2 of theName) as string
				set theYear2 to (characters 3 thru 4 of theName) as string
				set theMonth to (characters 6 thru 7 of theName) as string
				set theMonth to theMonth - 1
				if (theMonth = 0) then
					set theMonth to 12
					set theYear2 to theYear2 - 1
					if (theYear2 = -1) then
						set theYear2 to 99
						-- set theYear1 to theYear1 - 1 does not work
						set theYear1 to "19"
					end if
					if (theYear2 < 10) then set theYear2 to "0" & theYear2
				end if
				if (theMonth < 10) then set theMonth to "0" & theMonth
				set theName to theYear1 & theYear2 & "-" & theMonth
			else
				set theName to "(ohne Datum)" -- no date in the document
			end if
			set the name of the theRecord to theName
		end repeat
	end tell
end performSmartRule

Die Codezeile set theYear to (characters 1 thru 4 of theName) as string ist, denke ich, selbsterklärend. Wenn sich das Jahr und ebenso der Monat im Namen der Datei an anderen Stellen befinden, müssen sie diese abzählen und entsprechend im Skript angeben.

Es gibt eine “Fallback”-Abfrage if (theName is not "0-00") für Dokumente, in denen sich gar kein Datum befindet. Wenn Sie das Datum in der Smart Rule anders aufbauen, müssen Sie die Abfrage entsprechend ändern. Den dazugehörenden Sonst-Fall else set theName to "(ohne Datum)" können Sie natürlich ganz nach Belieben anpassen. Wenn Sie gar nichts ausgeben wollen, ändern Sie das Skript zu else set theName to "".

Die Zeile if (theMonth < 10) then set theMonth to "0" & theMonth benötigen Sie nur, wenn Sie bei einstelligen Monaten eine führende Null im Namen haben wollen. Die ist nämlich bei der Umwandlung des Textes in eine Zahl zwischenzeitlich verlorengegangen.


Schritt 2 – Die Smart Rule

Smart Rule Change Name to Previous Month

Die Regel benennt zuerst ein PDF-Dokument um in Jahr des neuesten Datums im Dokument[Bindestrich]Monat des neuesten Datums im Dokument. Also zum Beispiel in 2020-5. Das Datum kann man natürlich auch anders darstellen, muss dann aber entsprechend das Skript aus Schritt 2 anpassen.

Die Regel ruft danach das Skript mit Execute Script auf.

Ebenfalls wird man vermutlich noch etwas hinzufügen wollen, sodass man zum Beispiel Rechnung Vodafone 2020-5 erhält. Eine Möglichkeit ist, diesen Zusatz als dritten Schritt der Regel einzufügen mit einer Umbenennung in Rechnung Vodafone Name.

Anmerkung: Sollten Sie in dieser Smart Rule Elemente sehen, die Sie nicht einfügen können, so liegt das sehr wahrscheinlich nicht an Ihnen, sondern daran, dass ich mit einer Beta von DEVONthink 3.1 arbeite, die viele, viele neue Funktionen für die Smart Rules enthält!

1 Like

Es war immer noch ein Fehler im Skript, jetzt funktioniert es.

Ich war kurz vor dem Verzweifeln, weil ich mir nicht erklären konnte, warum eine Codezeile, die für den Monat funktioniert, beim Jahr nicht klappt. Dann kam ich auf die Idee, dass das Hin- und Herwechseln zwischen Ziffern als Zahlen und als Text vielleicht nur bei zweistelligen Zahlen funktionieren könnte, deshalb habe ich die vierstellige Jahreszahl in zwei Teile zerlegt.

Aber auch das stimmt nur bedingt: Bei der zweiten Jahreshälfte funktioniert es, bei der ersten partout nicht. Ich habe keinen blassen Schimmer, wieso. Deshalb habe ich bei der ersten Jahreshälfte nicht minus 1 rechnen können, sondern setze sie fest auf 19, wenn der Jahrtausendwechsel erfolgt. Das bedeutet, dass die Smart Rule nur für Daten von Februar 1900 bis Dezember 2999 funktioniert. Bis mir irgendwer verrät, wie man es richtig gelöst hätte.