Feld "Erstellt am" per Script füllen

Moin zusammen,
gibt es evt. ein Script in DT wo ich aus dem Dateinamen (in dem steht das Erstellungsdatum immer im Format yyyymmdd voran) das dem Datensatz zugehörige Feld “Erstellt am” füllen kann?
Leider habe ich viele Dokumente, wo das Erstellungsdatum im Dateinamen ein wesentlich älteres ist, als das in DT… Das ist auch ok, nur würde ich gerne Gruppenweise das aktualsieren…

Fertig gibt es das vermutlich nicht. Ich würde es etwa so machen (ohne Garantie!) um ausgewählte Datensätze zu ändern:

let app = Application("DEVONthink 3");
let records = app.selection();
records.forEach(r => {
  let name = r.name();
  let dateFull = name.match(/^(\d{4})(\d\d)(\d\d)/);
  let creationDate = new Date(dateFull[1],dateFull[2]-1,dateFull[3]);
  r.creationDate = creationDate;
})

@Blanc hat bestimmt auch noch eine Variante in AppleScript auf Lager :wink:

2 Likes

Hallo chrillek,
vielen lieben Dank für Dein schnelles Feedback und auch noch gleich mit Code… Fantastisch…
Leider bin ich im Scripting nicht wirklich fit und beim Übersetzen haut mir der Scripteditor Dein Script um die ohren mit der Meldung:


Was ist da wohl falsch?
Danke im Voraus…
HG
Rolf

Was ist ein Beispieldateiname und wie konsistent werden die Dateien benannt?

(Übersetzt mit https://deepl.com)

Das ist Javascript, das kann man nicht “übersetzen”. Wenn Du es in den Script Editor kopierst, musst Du dort den Sprachtyp auf “JavaScript” umstellen (oben links). Dann gibt es auch keine Fehlermeldung. Und lustigerweise funktioniert der Spaß auch, und zwar etwas robuster in dieser Fassung:

(() => {
let app = Application("DEVONthink 3");
let records = app.selection();
records.forEach(r => { /* über alle markierten Datensätze laufen */
  let name = r.name(); /* Namen besorgen */
  let dateFull = name.match(/^(\d{4})(\d\d)(\d\d)/); /* Datum aus den ersten 8 Zeichen des Namens fischen */
  if (dateFull !== null) { /* Wenn der Name wirklich mit 8 Ziffern beginnt */
 	 let creationDate = new Date(dateFull[1],dateFull[2]-1,dateFull[3]); /* Monate beginnen in JavaScript bei 0 */
  	r.creationDate = creationDate; /* neues Datum setzen */
  }	
})
})()
1 Like

Perfekt… Das funktioniert richtig gut…! :heart_eyes: :hugs: :kissing_heart:
Vielen lieben Dank… Bin Dir einen Kaffee :coffee: schuldig :kissing_smiling_eyes:

HG vom Rolf

1 Like

Da komme ich jetzt wohl ein wenig spät auf die Party :smiley: aber dein Script ist ein Paradebeispiel dafür wie sauber JS ist. Weil das Datum im Dateinamen beim OP immer an derselben Stelle steht, wäre meine AS-Lösung gewesen, das Datum mit texts aus der fixen Position zu extrahieren, um es dann neu zu ordnen; dann noch mit return date ein Datum daraus machen, und als metadata hinterlegen.

Danke für die Erläuterung in deinem Script - “-1” hatte ich mir nicht erklären können :wink: Jetzt muss ich nur noch verstehen, warum man bei JS ein Sieb voller gemischter Klammern nehmen und großzügig streuen muss.

1 Like

Danke der Nachfrage…
Die Daten sind zu 95% konsistent… Ein Beispielname wäre z.B: 20200923_Rechnung_Telekom.pdf

Aber das Script von chrillek funktioniert nun einwandfrei und ist mir eine große Hilfe.
Vielleicht nehmt Ihr das mit in den Standardpool bei Euch mit auf?

HG
Rolf

Das ist ein bisschen gewöhnungsbedürftig. (() => { ist der Anfang einer namenlosen Funktion ohne Argumente. Weiter unten dasselbe mit Argument: (r => { (beim forEach). Das Ende des Ganzen ist dann später jeweils mit }) erreicht.
() ganz am Ende ruft die vorher definierte Funktion auf. Das Verpacken in eine Funktion wiederum hat den Effekt, dass die let-Deklarationen immer funktionieren. Außerhalb einer Funktion gibt’s beim zweiten Lauf zumindest innerhalb des Script Editors sonst einen Fehler.

2 Likes

Klar. Ich hab Kopfweh.