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)

 

 

Contact

Tips & Tricks

Headlines


Legal Information  |  GTC  |  Sitemap
 

Simply productive

RagTime 6

 

Inventory and Foyer

Individual content, formats, fonts, and colors are listed well arranged in the Inventory. Frequently used documents and form can be accessed easily from within the Foyer.


New Features
Try before you buy
General Sales Information

Deutsch
English