AppleScripts im Script Editor und RagTime: Terminologiekonflikte
Bei einem Vorschlag, wie man ein bestimmtes Problem in RagTime mit AppleScript lösen kann, ist mir im RagTime-Forum ein Fehler unterlaufen (dort inzwischen korrigiert). Das kommt vor, aber in diesem Fall ist der Fehler interessant und ein wenig Diskussion dazu lohnt sich für RagTime-Scripter. Es geht um die Frage, wo AppleScript beim Kompilieren eigentlich die Begriffe sucht.
Die Frage im Forum war: Wie kann man in RagTime einen Zeitstempel in Text oder Tabellen setzen, ohne dass zugleich ein Format gesetzt wird. Die Anweisungen im Bearbeiten-Menü erzeugen alle sowohl eine Formel als auch ein Format. Folgendes war meine ursprüngliche Script-Fassung:
set n to current date
tell application "RagTime 6.5"
tell window 1
set s to selection as reference
tell s
set sylk formula to my sylk_string(n)
end tell
end tell
end tell
on sylk_string(d)
set sd to (day of d) as text
set sm to ((month of d) as integer) as text
set sy to (year of d) as text
set sHour to (hours of d) as text
set sMin to (minutes of d) as text
set sSec to (seconds of d) as text
return "DATE(" & sy & "," & sm & "," & sd & "," & sHour & "," & sMin & "," & sSec & ")"
end sylk_string
Das Script läuft ohne Probleme vom Script Editor aus: Man setzt in RagTime eine Einfügemarke in Text oder wählt eine Rechenblattzelle aus, sobald dann das Script läuft, wird der aktuelle Zeitpunkt in RagTime als Formel eingesetzt.
(Grundtechnik des Scripts: Aus dem aktuellen Zeitpunkt, den current date liefert, wird eine Rechenblattformel nach SYLK-Norm als String errechnet. Das Ergebnis ist etwas wie DATE(2011,9,2,9,8,14). Die aktuelle Auswahl in RagTime wird auf diese Formel gesetzt.)
Kopiert man aber das Script in den RagTime Script-Editor, um es dort zu installieren, gibt es einen Fehler beim Kompilieren: »Hours of d“ kann nicht gelesen werden. Zugriff nicht erlaubt.
Es geht hier ausschließlich um den Handler, der den String für die SYLK-Formel erzeugt.
Hier kommen AppleScript-Termini wie hours, minutes und seconds vor. Diese Termini gibt es aber auch in RagTime.
Kompiliert man das Script im Script-Editor, ist das kein Problem. In der Kette der Programme, die hier nach den Termini gefragt werden, kommt RagTime nicht vor.
Sobald man das Script aber in RagTime zu kompilieren versucht, kommt es zur Fehlermeldung. Innerhalb von RagTime kommt für AppleScript die Terminologie dieses Programms zuerst, und dort werden die Termini anders benutzt.
Man kann das Verhalten auch im Script Editor erzwingen. Hier ein geänderter Handler:
on sylk_string(d)
using terms from application "RagTime 6.5"
set sd to (day of d) as text
set sm to ((month of d) as integer) as text
set sy to (year of d) as text
set sHour to (hours of d) as text
set sMin to (minutes of d) as text
set sSec to (seconds of d) as text
return "DATE(" & sy & "," & sm & "," & sd & "," & sHour & "," & sMin & "," & sSec & ")"
end using terms from
end sylk_string
Diese Variante kompiliert auch im Script Editor nicht mehr. Mit dem using terms from… wird RagTime in der Reihenfolge der Programme, in denen Termini gesucht werden, nach oben geschoben, und das Problem ist dasselbe.
In dem Fall der Forumsdiskussion schien mir die Lösung am einfachsten, die Termini hours, minutes und seconds aus dem Script zu beseitigen. Ich hab sie durch eine Sequenz von div und mod ersetzt, wie man es vor OS X 10.4 immer machen musste.
So einen einfachen Weg gibt es nicht immer. Der allgemeine Trick steckt wieder in using terms from…. Man lotst AppleScript beim Kompilieren an RagTime vorbei, indem man ein anderes laufendes Programm angibt. Der Finder bietet sich an.
Folgende Variante des ursprünglichen Scripts kompiliert und funktioniert auch in RagTime:
on sylk_string(d)
using terms from application "Finder"
set sd to (day of d) as text
set sm to ((month of d) as integer) as text
set sy to (year of d) as text
set sHour to (hours of d) as text
set sMin to (minutes of d) as text
set sSec to (seconds of d) as text
return "DATE(" & sy & "," & sm & "," & sd & "," & sHour & "," & sMin & "," & sSec & ")"
end using terms from
end sylk_string
In diesem konkreten Fall kann man statt using terms from auch ein tell nehmen. Der Unterschied zwischen den beiden Techniken: Bei tell wird auch bei der Ausführung des Scripts der Finder zuerst angesprochen. using terms from hat nur eine Wirkung beim Kompilieren. Und dort steckte das Problem.
(Verfasser: Jürgen Schell)