Gibt es: toString()
ist für die meisten Klassen der Sprache definiert. Allerdings sollte das in einem String-Kontext automatisch aufgerufen werden.
thanks; @HaubenTaucher, including var creationDate = creationDate.toString()
prior to the app.logMessage
makes your script work here.
(ok, und ich antworte in diesem Thread auf englisch, weil…?)
Hej,
thanks for your thoughts and code explantation…
But
i got a message in the protocolwindow:
|20.04.22, 18:35:33: 20211005_RE_
|20.04.22, 18:35:33: TESTListe| on performSmartRule (Error: TypeError: Attempted to assign to readonly property.)|
by running this modified Code:
function performsmartrule(records) {
const app = Application(‘DEVONthink 3’);
records.forEach((r) => {
const name = r.name();
const dateFull = name.match(/^(\d{4})(\d\d)(\d\d)/);
if (dateFull !== null)
{
const creationDate = new Date(dateFull[1], dateFull[2] - 1, dateFull[3]);
r.creationDate = creationDate;
app.logMessage(name);
creationDate = creationDate.toString();
app.logMessage(creationDate);
}
});
}
Ich glaube, hier musst du mit var
oder let
arbeiten weil du die variable umdefinieren willst.
Bitte jetzt nicht im Nebel stochern. Wenn du erst ˋconst blaˋ schreibst, kannst du nicht drei Zeilen später versuchen, ˋblaˋ neu zu definieren. Das muss schief gehen. Einfach ˋapp.logMessage(creationDate.toString())ˋ benutzen.
Bitte pack den Code hier in drei Backquotes, damit er als Code erkennbar ist.
Daran bin jetzt ich nicht ganz unschuldig; wobei ich AS genau durch dieses Stochern gelernt habe. Mein Code würde ohne Zweifel davon profitieren, aufgeräumter zu sein; andererseits solange das Ergebnis das ist, was ich will, und sonst niemand mit meinem Code arbeiten muss ist alles gut Und JS werde ich wohl auch nur durch stochern ein bisschen lernen.
Bitte pack den Code hier in drei Backquotes, damit er als Code erkennbar ist.
Wieder was gelernt… Habe ich nicht gewusst, sorry…
Hier ist jetzt der letzte angepasste Code… So scheint es zu funktionieren. Es wird jetzt eine ausführliche Liste in das Protokollfenster geschrieben.
Die schaue ich mir jetzt mal in Ruhe an um zu sehen, wie man nun weiter machen kann…
Vielen Dank für Eure Hilfe…
function performsmartrule(records) {
const app = Application('DEVONthink 3');
records.forEach((r) => {
const name = r.name();
const dateFull = name.match(/^(\d{4})(\d\d)(\d\d)/);
if (dateFull !== null)
{
const creationDate = new Date(dateFull[1], dateFull[2] - 1, dateFull[3]);
r.creationDate = creationDate;
app.logMessage(name);
app.logMessage(creationDate.toString());
}
});
}
Hej,
ich habe mir die Liste angeschaut und wollte das Script um einen Eintrag erweitern um zu sehen, wie/was man vergleichen könnte…
function performsmartrule(records) {
const app = Application('DEVONthink 3');
records.forEach((r) => {
const name = r.name();
const dateFull = name.match(/^(\d{4})(\d\d)(\d\d)/);
if (dateFull !== null)
{
const creationDate = new Date(dateFull[1], dateFull[2] - 1, dateFull[3]);
r.creationDate = creationDate;
app.logMessage(name);
app.logMessage(creationDate.toString());
app.logMessage(r.creationDate.toString());
}
});
}
Leider erzeugt die Angabe app.logMessage(r.creationDate.toString());
nur einen “object function”-Eintrag im Protokoll…
Wie bekomme ich denn wohl raus, was in r drinne steht?
Ich vermute einmal, dass r.creationDate.toString()
eine unzulässige Verkettung darstellt (Nebel, mehr Nebel ). Zwei Sachen kannst du probieren: erstens ob
r.creationDate
sich direkt in das Log schreiben lässt; oder, wenn nicht, eine Variable definieren (deineVar = r.creationDate
und dann app.logMessage(deineVar.toString())
Naja, es gäbe eine dritte Option…
ich befürchte - wenn ich Deine Vorschläge richtig umgesetzt habe - das wir auf die von dir angedeutete 3. Option ausweichen müssen…
Denn…
erstens ob
r.creationDate
sich direkt in das Log schreiben lässt;
führt zu diesem Fehler
während die Variablengeschichte (ich habe den oberen Teil mal weggelassen an dieser Stelle)
function performsmartrule(records) {
const app = Application('DEVONthink 3');
records.forEach((r) => {
const name = r.name();
const dateFull = name.match(/^(\d{4})(\d\d)(\d\d)/);
if (dateFull !== null)
/* dateFull.length muss === 4 sein
Denn: match liefert ein Array zurück, dessen erstes Element der gesamte Treffer ist. Es folgen die einzelnen capturing groups. Das sind bei Dir drei Stück (Jahr, Monat, Tag). */
{
const creationDate = new Date(dateFull[1], dateFull[2] - 1, dateFull[3]);
/* Monate beginnen in JavaScript mit "0" */
r.creationDate = creationDate;
meineVar = r.creationDate;
app.logMessage(name);
app.logMessage(creationDate.toString());
app.logMessage(meineVar.toString());
}
});
}
wieder zur “object Function”-Ausgabe im Logfile führt…
JS macht Kopfschmerzen…
Was daran liegt, dass r.createDate
ein Object Specifier ist, kein Objekt. Du musst erst eine Art Get-Operation auf diesem Specifier ausführen, um an den Wert (hier das Datum) zu kommen. Also r.creationDate().toString()
.
<Werbung>
Bei der Gelegenheit möchte ich Dir
ans Herz legen. Das erklärt u.a. solche Feinheiten von JavaScript for Automation. Die müssen wir eigentlich nicht hier breittreten, weil sie mit DT gar nichts zu tun haben.
</Werbung>
Gegenfrage: Warum glaubst, Du, dass nach der Zuweisung da irgendwas anderes stehen könnte als du zugewiesen hast? Wäre das so, bräuchtest Du eigentlich gar keine weiteren Experimente mit JavaScript mehr zu unternehmen, da die Runtime offensichtlich fehlerhaft wäre.
@cgrunenberg: Es ist etwas irritierend, dass console.log(creationDate)
das Datum als String ausgibt (das ist die Standard-Methode von JavaScript, etwas auf die Konsole zu schreiben), app.logMessage(creationDate)
(also die DT-Methode, etwas in die Log-Datei zu schreiben) aber einen Fehler erzeugt. app.logMessage
erwartet genau wie console.log
einen String als Parameter (zumindest interpretiere ich das Skripting-Dictionary so). In dem Fall sollte automatisch ein Cast von Date
zu String
erfolgen (wie das ja console.log
auch tut).
Was aber AppleScript/JXA leider nicht automatisch machen und DEVONthinks Code nicht einmal aufgerufen wird deswegen.
Natürlich. Es braucht einfach nur mehr Klammern. Darauf hätte ich selbst kommen können.
Allerdings. Ich bin wirklich etwas enttäuscht. Eigentlich ist das wie mit den Kommata im Deutschen: Einfach so lange irgendwo hinschreiben, bis es sich gut anfühlt.
Ja, und aber auch nein; während ich deine Site benutze, und auch sonst durchaus bewandt bin in der Verwendung einer Suchmaschine, brauche ich für den Anfang ein bisschen ein Gefühl dafür, was ich eigentlich suche. Genau das gibst du mir in diesem Thread. Für mich sind es gerade solche Projekte die der OP betreibt, die mir beim lernen helfen - das klassische learning by doing. Je klarer es dann für mich ist, was ich tue, desto nützlicher ist dann ein Nachschlagewerk. Ich finde dieser Thread gehört absolut hierher. Das Wissen das wir anfragen ist für dich niedrigstes Niveau - aber für uns die ersten wichtigen Schritte.
Was den Thread angeht: d’accord. Aber ich finde es nicht sinnvoll, jede Fehlermeldung, die beim Experimentieren mit JXA (oder AppleScript) auftritt, hier abzuhandeln. Die Frage, wie man auf Properties/Eigenschaften/whatever in JXA zugreift, wird ja gerade auf der zitierten Website in einem eigenen Abschnitt abgehandelt.
Es wäre mE sinnvoll, zumindest die Einführung dort durchzugehen und dann ggfs. gezielt Fragen zu stellen. Perfekt ist der Text ja sicherlich nicht.
Das hat nichts mit JavaScript als solchem zu tun. Es geht um eine Eigenheit von JavaScript for Automation (JXA). Mit diesem Framework musst du dich eingehender beschäftigen, wenn du es verwenden willst. Und damit meine ich nicht, denselben Code in mehreren Varianten zu posten, die alle nicht funktionieren können.
Guten Morgen,
von welcher “Site” die du benutzt sprichst Du?
Und bitte noch 2 weitere Fragen…
- wo finde ich die Dokumentation für die Befehle, welche ich in JS unter DT verwenden kann? Auf der JXA-Site finde ich ““nur”” teile?
- wie kann man in DT JavaScript-Schnipsel am besten ablegen, die auch die Struktur von JS darstellen? Also so wie hier im Forum, wenn man 3x den Backquotes vor den Code setzt… Wie macht Ihr das?
Ich bin zwar nicht @blanc, aber er spricht von Scripting with JXA | JavaScript for Automation (JXA)
Hoffe ich.
Auch das ist auf dieser Site beschrieben: In Script Editor, nachdem Du die Scripting Library für DT geladen und die Sprache auf JavaScript eingestellt hast.
Ich würde Code in DT nur als Code, also reinen Text, ablegen (und dafür sorgen, dass er richtig eingerückt ist). Dazu benutze ich einen richtigen Editor (Cot, Visual Studio Code, CodeRunner, was immer Dir gefällt).
Das mit den drei Backquotes ist einfach nur Markdown-Syntax. Das benutzt man, um Code als solchen kenntlich zu machen. Schadet aber eher, wenn man ihn auch ausführen/ausprobieren will.
Vielen Dank für Deine letzte Erklärung
Ich habe da aber noch eine Frage…
ich habe Ausgaben im Protokollfenster… Da gibt es unten am Fensterrand auch die Möglichkeit das LogFile zu speichern. Kommt man an den “Speichern”-Knopf auch per Script dran?
Gefunden habe ich da nichts… Auch in JXA bin ich nicht fündig geworden.