Dateinamenvergabe

Hallo nochmal, ich bin kurz vor beginn meiner arbeit mit meinen Dokumenten, ich steh vor dem letzten Problem, ich war jetzt mal so frei und habe Datenbanken angelegt die nur für Tags dasein werden woraus der Dateiname gebildet werden soll.
Die Datenbanken heißen:
1= Aktenzeichen / Kundennummer
2= Betreff
3= Firma
4= Name

Im privaten Bereich hätte ich gerne das der Dateiname so benannt wird: “Name, Betreff, Aktenzeichen” sofern DEVONthink einen Tag aus einer der Datenbanken erkannt hat im Dokumenteninhalt.
Dateiname: Tag aus Datenbank: 4,2,1

Im geschäftlichen Bereich hätte ich gerne das der Dateiname so benannt wird: “Firma, Name, Betreff, Aktenzeichen” sofern DEVONthink einen Tag aus einer der Datenbanken erkannt hat im Dokumenteninhalt.
Dateiname: Tag aus Datenbank: 3,4,2,1

Bei beiden sollte es möglich sein Firmen & Namen auszuschließen damit die eigene Firma oder der eigene Name bzw. der der Oma nicht im Dateinamen landet
Dateiname: Tag aus Datenbank: 4,2,1 - (Adam - Oma) etc.
Dateiname: Tag aus Datenbank: 3,4,2,1 - (Patronen… - AL INT… - Adam - Oma) etc.

Könnten sie mir da bitte anhand der extra angelegten Datenbanken mit einem Script aushelfen was einen Dateinamen bastelt aus den 4 Datenbanken mit Ausschlussmöglichkeit der 2er firmen und 2er Namen? Denke das das möglich ist mit den Datenbanken.
Sofern ich das beschriebene Script habe oder die intelligente Regel habe bin ich hoffentlich in der Lage das so umzubauen wie ich das brauche, aber es wäre schon toll wenn sie das nach dem Muster für mich machen, ich brauch augenblicklich für alles immer einen ganzen Tag :sob:

Wenn das alles mit einer Regel möglich ist wäre das umso schöner, bevor ich sie um Hilfe bitte probier ich ob ich das selber hin bekomm, aber ich hab schon rum probiert wie wild und ich glaube da man immer nur in einer Datenbank suchen kann läuft das auf 4 einzelne Regeln hinaus aus 4 Datenbanken einen Namen zu bauen was mich anfangs total überfordert da ich einfach nur zu Noobig bin :slight_smile:

Ich geb mir Mühe und lerne schnell, aber der Anfang meiner Arbeit erfordert so eine komplexe Vorgehensweise und damit mehr als ich geschafft habe in so kurzer Zeit zu lernen.
VG Adam :slight_smile:

Hi @Adam_L, mir ist nicht klar warum für verschiedene Tag-Sets extra Datenbanken angelegt werden müssten. Gibt es dafür einen Grund?

Es könnte einfacher sein die Tags in der Datenbank anzulegen in der die Dokumente am Ende liegen und die Tags jeweils zu gruppieren:

Tags
	Firma
		ABC
		Test

Extra Datenbanken für Tags machen eigentlich nur Sinn wenn in diesen Datenbanken Informationen zu den Tags gespeichert werden (also z.B. extra Dokumente die die Verwendung der Tags beschreiben) und diese nicht in der “Haupt-Datenbank” auftauchen sollen. Ist das der Fall?

Ich bin Anfänger, der Grund wie ich mir das denke ist die richtige Zuordnung der Reihenfolge aus der der Dateiname gebildet werden soll.

Dateinamenbeispiel: Datenbank3/ Datenbank4/ Datenbank2/ Datenbank1
Dateinamenbeispiel: Patronenfirma=TAG aus db 3/ Adamname= TAG aus db4/ Rechnungbetreff= TAG aus db2/ 12345678Kundennummer= TAG aus db1
Wenn du das mit Unterordnern in einer Datenbank hinbekommst zeig mir bitte den Lösungsweg wie du differenzierst was ein namensTAG ist und was ein firmenTAG ist usw. und wie du ihn an die richtige stelle im Dateinamen setzt. Mehr brauch ich nicht :slight_smile:

Schon, bin mir nur noch nicht sicher ob das in der Praxis so einfach klappt.

Wie soll z.B. verfahren werden wenn ein Dokument mehr als einen Tag einer Art hat (wenn z.B. für “Betreff” 2 Treffer vorliegen und dadurch 2 Tags vergeben wurden)?

Hab die Änderungen in deinem Post gesehen, sollen “Patronenfirma”, “Adamname” etc. jeweils mit in den Namen?

Wär das ein korrekter geschäftlicher Name?

DEVONtech & Töchter GmbH / Oma / BETREFF / 123456789

Falls ja würde ich ein anderes Zeichen als / zum trennen empfehlen da DEVONthink beim exportieren eines solchen Dokuments daraus

DEVONtech - Töchter GmbH - Oma - BETREFF - 123456789.txt

macht, d.h. du wüsstest jetzt schon, dass du nicht einfach in DEVONthink nach dem Namen eines exportierten Dokuments suchen kannst falls das mal nötig wäre …

EDIT: nicht wichtig, du kannst später selbst entscheiden womit die einzelnen Teile getrennt werden sollen

Das sind nur Beispiele:
Nach dem scannen wird OCR am Dokument durchgeführt, danach wird das jüngste Datum aus dem Dokument ausgelesen und als Erstellungsdatum verwendet und jetzt brauch ich einen Dateinamen der ersichtlich macht welches Dokument da gerade gescannt wurde und der soll nun automatisch benannt werden sobald Das Dokument abgeglichen wurde mit den vorhandenen Tags aus diesen vorhandenen Datenbanken.

RWE Anton Kutz Letzte Mahnung 98765444
Vodafone Gisela Butz Rechnung 123456
Vodafone Huberta Schmutz Mahnung 654987

Was ist mit fehlenden Tags, wenn also z.B. für “Betreff” kein Tag vorhanden ist? Soll dann ein Platzhalter in den Namen? Wenn ja welcher jeweils?

Nein, platzhalter brauchen nicht sein, sollte was falsch erkannt werden wird manuell hinzugefügt.
Fehlende Tags werden zur Datenbank manuell hinzugefügt.

Schon klar, nur es ist wahrscheinlich deutlich einfacher wenn Platzhalter verwendet würden, dann könnten z.B. Smart Groups verwendet werden um alle Dokumente mit unvollständigen Namen zusammen anzuzeigen. Ob privat oder geschäftlich spielt dabei keine Rolle, die werden getrennt behandelt. Wirklich keine Platzhalter?

Namenslisten hab ich mir aus dem Internet runtergeladen somit habe ich schon viele Vornamen abgedeckt. Den Rest muss ich immer hinzufügen wie´s kommt.
Bist du Programmierer?

ok, dann mach Platzhalter, wenn du sagst das ist besser

Ok, probier das mal bitte so:

  • Lege eine neue Datenbank an

  • Dupliziere Dokumente dorthin (via Kontextmenü)
    (Achtung: Keine indizierten Dokumente duplizieren, nur importierte)

  • Tags-Struktur einrichten:

    • Erstelle jeweils einen Tag

      • Aktenzeichen / Kundennummer
      • Betreff
      • Firma
      • Name
    • Diese 4 Tags

      • zusammen auswählen
      • Info Inspektor > Allgemein > Ignorieren bei Tagging
        (dadurch werden sie zu Gruppen und nicht mit an Dokumente vergeben)
    • Innerhalb dieser 4 Gruppen

      • Tags erstellen für alle Begriffe die an Dokumenten vergeben werden sollen
        (für andere Nutzer: dazu wird hier eine Smart Rule mit der Aktion Skript ausführen > Externes Skript > Tags zuweisen verwendet)
  • Smart Rule ausführen die Tags vergibt

  • Skript einrichten:

    • property isPrivate --> geschäftlich / privat
    • property theSeparator --> Trenner in Namen
    • property removeTags --> Tags direkt entfernen
      (Tags würd ich erst automatisch entfernen lassen wenn alles funktioniert.)
  • Skript-Editor.app öffnen

  • Skript einfügen

  • Dokumente auswählen

  • sehen was passiert :slightly_smiling_face:

-- Record Namen anhand Tags vergeben

property isPrivate : false -- geschäftlich / privat
property theSeparator : " " -- Trenner in Namen
property thePlaceholder_CustomerID : "%AKTENZEICHENKUNDENNUMMER_"
property thePlaceholder_Subject : "%BETREFF_"
property thePlaceholder_Company : "%FIRMA_"
property thePlaceholder_Name : "%NAME_"
property removeTags : false

tell application id "DNtp"
	try
		set theRecords to selected records
		if theRecords = {} then error "Please select some records"
		show progress indicator "Renaming based on Tags... " steps (count theRecords) as string with cancel button
		
		repeat with thisRecord in theRecords
			step progress indicator (name of thisRecord) as string
			set theTags_CustomerID to (name of parents of thisRecord whose location starts with "/Tags/Aktenzeichen \\/ Kundennummer") -- 1
			set theTags_Subject to (name of parents of thisRecord whose location starts with "/Tags/Betreff") -- 2
			set theTags_Company to (name of parents of thisRecord whose location starts with "/Tags/Firma") -- 3
			set theTags_Name to (name of parents of thisRecord whose location starts with "/Tags/Name") -- 4
			
			if theTags_CustomerID = {} then set theTags_CustomerID to {thePlaceholder_CustomerID}
			if theTags_Subject = {} then set theTags_Subject to {thePlaceholder_Subject}
			if theTags_Name = {} then set theTags_Name to {thePlaceholder_Name}
			
			if isPrivate = false then
				if theTags_Company = {} then set theTags_Company to {thePlaceholder_Company}
				set newName to my tid(theTags_Company, ";") & theSeparator & my tid(theTags_Name, ";") & theSeparator & my tid(theTags_Subject, ";") & theSeparator & my tid(theTags_CustomerID, ";")
			else
				set newName to my tid(theTags_Name, ";") & theSeparator & my tid(theTags_Subject, ";") & theSeparator & my tid(theTags_CustomerID, ";")
			end if
			set name of thisRecord to newName
			
			if removeTags = true then
				set thisRecord_Tags to tags of thisRecord
				set newTags to my removeItemsFromList(thisRecord_Tags, (theTags_CustomerID & theTags_Subject & theTags_Company & theTags_Name))
				set tags of thisRecord to newTags
			end if
		end repeat
		hide progress indicator
		
	on error error_message number error_number
		hide progress indicator
		if the error_number is not -128 then display alert "DEVONthink" message error_message as warning
		return
	end try
end tell

on tid(theInput, theDelimiter)
	set d to AppleScript's text item delimiters
	set AppleScript's text item delimiters to theDelimiter
	if class of theInput = text then
		set theOutput to text items of theInput
	else if class of theInput = list then
		set theOutput to theInput as text
	end if
	set AppleScript's text item delimiters to d
	return theOutput
end tid

on removeItemsFromList(theList, removeItems)
	set newList to {}
	repeat with thisItem in theList
		set thisItem to thisItem as string
		if thisItem is not in removeItems then
			set end of newList to thisItem
		end if
	end repeat
	return newList
end removeItemsFromList

1 Like

wow, ich versuch das mal umzusetzten, der wahnsinn

Gut, das sieht genau danach aus was ich brauche, ich bin jetzt schon am testen ob´s klappt, gemacht hab ich schon:
-Eine Datenbank angelegt für TAG´s namens Dateinamenstag´s
-unterm Reiter Tags/ Dateinamenstag´s habe ich neue Tags gebildet und sie dann in die Dateinamenstag´s verschoben als Unterkategorie wie beschrieben und sie beim Tagging als ignoriert markiert Jetzt sind daraus Gruppen geworden, soweit alles gut.

  • Dann habe Ich Tags in diesen Gruppen vergeben die in gescannten Dokumenten vorkommen
  • Das Programm Script Editor fand ich auch auf dem Mac
  • Die Benennung des Scripts klappt auch

Problem 1: Kannst du das Highlighten was genau ich an dem Script anpassen soll und womit?

Problem 2: Oben im Script Editor wo script “ohne Titel” steht soll ich den Dateispeicherort hinzufügen aber ich weiß nicht wohin damit.

Problem 3: Das mit dem Tags zuweisen mit der smart rule hab ich auch gefunden, soll ich diese Regel an jedem der 4 Kategorien anwenden oder an der Datenbank ansich?

Problem 4: Ich weiß nicht ob sich die Frage mit dem Dateispeicherort jetzt klären wird aber wie wende ich es dann an in DEVONthink. Ich habe 2 Orte in dem Programm gefunden die mit Scripten zu tun haben, einmal in der Statusleiste den Butten Scripte und unter den Smart Rules:
Script anwenden extern und da steht nicht so viel drin, wahrscheinlich kommt das dann da rein aber ich weiß nicht wo der Ordner zu finden ist.

Ich bin dir jetzt schon zu tiefsten Dank verpflichtet, wenn du mir bei all dem geholfen hast dann hast du bestimmt tausenden Anfängern eine solide Grundlage gegeben eine gute Datenbank einzurichten wo später wenig Nacharbeit von Nöten ist, die einfach nur nach Devonthink und Dateibenneung suchen.

1 Like

DEVONthink’s Skript Menü Ordner liegt hier:

/Users/USERNAME/Library/Application Scripts/com.devon-technologies.think3/Menu

Da der Ordner recht umständlich zu erreichen ist würd ich ein Alias auf den Ordner anlegen:

  • Im Finder mit gedrückter ALT Taste Menü Gehe zu > Library
  • Dann durchnavigieren bis zum Skript Menü Ordner
  • Via Kontextmenü Alias erstellen
  • Alias irgendwohin ziehen, z.B. Desktop

In Skript-Editor.app

  • im Speichern-Dialog das Alias oben auf die Ordnerauswahl ziehen, das setzt den Ordner zum speichern

Speichere nun 2 Versionen des Skripts:

  • eine mit property isPrivate : true (privat)
  • eine mit property isPrivate : false (geschäftlich)

Der Rest ist zum testen nicht wichtig.

Die Smart Rule wird nicht auf die Tags selbst angewendet, sie nutzt diese nur. D.h. oben in der Smart Rule muss Suchen in: die neuen Dokumente umfassen, denke das wird der Eingang der Datenbank sein. Zum testen reicht es aber einfach erstmal die komplette Datenbank anzugeben.

Unter dem Button findest du alle Skripte die in DEVONthink’s Skript Menu Ordner liegen, also auch die beiden Versionen des Skripts. Der Smart Rules Ordner ist erstmal unwichtig, die Skripte sind (noch) zum manuellen ausführen ausgelegt.

Wenn die Skript im Ordner gespeichert und die Tags vorbereitet sind dann einfach ein paar Dokumente auswählen und über den Button oder das Menü das gewünschte Skript ausführen.

Später können daraus Smart Rule Skripte gemacht werden, zum testen ist das aber zu umständlich.

Super, vielen lieben dank, ich setz mich gleich daran das zu testen. :slight_smile:
Ich kann dir garnicht sagen wie sehr glücklich du mich damit machst!
(Das hab ich vorhin vergessen abzuschicken)

1 Like

Jetzt nachdem ich dank dir weiß wie man ein script hinzufügt habe ich es geschafft das 2 identische Scripte in den Ordner Rename hinzuzufügen mit dem unterschied: Dateibennung Privat (property isPrivat : true)
und eins mit: Dateibennung Geschäftlich (property isPrivat : false)
welche dann in der Liste unter Ordner Umbenennen auftauchten.
(Der Tip mit der alt Taste war Gold wert!)
Nachdem jetzt alles an seinem Platz ist und er eine Datei benennen sollte hat er mir eine Fehlermeldung ausgespuckt siehe Screenshots, "Invalid argument name

Bildschirmfoto 2021-01-21 um 21.56.14 Bildschirmfoto 2021-01-21 um 21.58.12 Bildschirmfoto 2021-01-21 um 21.58.30
In den Taggruppen sind Tags vergeben, Ich hab versucht im Eingang; Dateinamentag´s; Dateinamentag´s/Tags zu suchen, ich hab drauf geachtet das Das PDF ein durchsuchbares ist und jetzt weiß ich definitiv nicht mehr weiter, vielleicht mach ich was falsch?
Ich markiere die Datei und versuche dann das Script zu starten,
dann habe ich probiert die Smart Rule anzuwenden und nochmal das script zu starten.
Immer wieder “invalid argument name”
Wähle ich keine Datei aus sagt er mir: “Please select some Records” denke das ist richtig.
Ich hab auch die smart rule von Manuel auf nach Import gesetzt.
Jetzt bin ich mit dem Latein am Ende :slight_smile:

Hab den Fehler gefunden und das Skript oben aktualisiert. Falls es nicht direkt klappt mal DEVONthink neustarten (nachdem du die Skriptdateien aktualisiert hast).

Den Fehler konnt ich vorher beim testen nicht finden weil ich immer Dokumente die Tags haben ausgewählt hatte. Reihenfolge:

  • Tags einrichten (damit die Smart Rule sie vergeben kann)
  • Smart Rule über Dokumente laufen lassen
  • Dokumente auswählen (die sollten jetzt Tags haben)
  • eins der Skripte ausführen

Probier mal

Du bist der Hammer, ich probier´s gleich aus!