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.

1 Like

Guten Abend zusammen,

dieser Thread beschreibt meine Wunschfunktion an eine intelligente Regel nahezu perfekt. Trotzdem schaffe ich es leider nicht die Regel / das Skript entsprechend umzusetzen, selbst wenn ich das Datumsformat im Dateinamen 1:1 wie hier beschrieben übernehme.

Wie muss ich die Regel, bzw. das Skript anpassen, damit das Ganze grundsätzlich mal funktioniert und wie muss ich den Abgleich des Dateinamen anpassen, wenn ich das Datum wie im Screenshot im Format YYYY-MM-TT nutzen möchte?

Vielen Dank im Voraus

Mit freundlichen Grüßen
Yves

Das Skript erwartet im Namen ein Datum im Format YYYYMMTT; deine Dateinamen aber sind im Format YYYY-MM-TT.

Ich bin mit Java (bzw. RegEx) nicht daheim, deswegen unsicher ob es reicht in Zeile 6 des Skripts jeweils ein - zwischen den ()-Klammerpaaren zu setzen (@chrillek?).

Hallo Blanc,

danke für die schnelle Antwort.
Selbst wenn ich die Datei im Format YYYYMMTT benenne tut sich nichts. Das Erstelldatum der Datei bleibt immer gleich.

Stimmt; das Skript würde standalone im Script Editor laufen, aber unverändert nicht innerhalb einer intelligenten Regel. Siehe z.B. hier für das nötige Format innerhalb einer intelligenten Regel.

(Aktuell sagt Zeile 3 „bearbeite die Dateien, die vom Benutzer ausgewählt wurden“; du brauchst aber „bearbeite die Dateien, die von der Regel übergeben wurden“)

Bzw. DEVONthink | JavaScript for Automation (JXA)

Das kann so auch nicht funktionieren.

  1. @Blanc hat Recht, in der Regular Expression müssen - zwischen Jahr, Monat und Tag stehen, wenn sie im Dateinamen vorkommen.
  2. du benutzt in deinem Skript eine „self-executing anonymous function“. Das ist zwar total schick, hilft aber in diesem Kontext (dh einer Smart Rule) gar nix. Denn die Smart Rule möchte die Funktion performsmartrule aufrufen, der sie als einzigen Parameter die von den Bedingungen der Regel ausgewählten Dateien übergibt (function performsmartrule(records){ ... }). Diese Funktion ist aber nicht da, also passiert – nüscht, nada, rien du tout. Auch damit hat @Blanc Recht. Wie das mit den Scripts in Smart rules funktioniert, ist übrigens auch in der Dokumentation beschrieben.
  3. allerdings hat das aus nix mit „Java“ zu tun – hier geht’s um JavaScript. Da hatte @Blanc ausnahmsweise nicht Recht (naja, vermutlich nur ein Tippfehler).

Irgendwie habe ich jetzt die Lösung für das Problem von @yveslae überlesen… :wink:

:see_no_evil:

Vielen Dank für eure schnellen und offensichtlich sehr sachkundigen Antworten!
Lässt sich die Funktion des Skripts auch irgendwie in eine Smart Rule einbauen bzw. dafür anpassen, oder ist das gar nicht möglich?
Ich kenne mich damit leider so gar nicht aus und bin froh, wenn ich irgendwo in Foren ein paar passende Codeschnipsel zum zusammenkopieren finde…

1 Like

Ein Klick auf den Link, den ich oben gepostet hatte, zeigt dir, wie das Skript verändert werden muss, damit es innerhalb einer Regel funktioniert. Aber ich hab’s für dich erledigt:

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

Das ist auch umgeschrieben, um das Datumsformat YYYY-MM-TT zu bearbeiten.

(@chrillek was ist der Unterschied zwischen let app =, const app = und var app =? Alle drei Optionen habe ich jetzt gesehen, und bin mir unsicher, welcher praktischer Unterschied sich bei der Anwendung ergibt)

(@yveslae ich möchte dich bitten, wenn du zukünftig Skript postest, das auch in einem Textformat zu machen; Skript erscheint wie oben in diesem Post, wenn man es in ``` einschließt, also

```
Skript
```

Das macht es für jeden der dir helfen möchte einfacher, weil derjenige das Skript dann nicht entweder suchen oder aus deinem Screenshot abtippen muss :slight_smile: danke :slight_smile: )