apple script
(アップル スクリプト)


コンピューターが解るような言葉ってあるんです

C言語とかベイシックとか言うのは、最終的には「機械語」とやらに置き換えられて、コンピューターを動かすことが出来るんです。apple scriptもそのようなもので(ちょっと違うんですが)、今はマックを買うとただで付いてくる"スクリプト編集プログラム"をつかうと簡単にコンピューターを操ることが出来るらしいんです。
スクリプト編集プログラムを立ち上げて、"beep"と入れてみましょう。実行ボタンを押すと"プン"という警告音がなります。これは超簡単に言うと、beepという言葉をスクリプト編集プログラムがマックが解る言葉(アップルイベントというらしい)に変えてくれて、実行ボタンを押すことでコンプータが音を出すんです。
しかし、使う言葉は何でもいい訳ではなく、きめられた言葉しか使うことは出来ません。(あたりまえか!)
アプリケーションに命令する時は、そのアプリがapplescriptに対応しているかどうかが大切なんです。対応している時でも使うことのできる言葉(用語)はきめられているんです。(何でも使えるんだったら人間と同じじゃん!)
幸いにも、DTPで使うQX(クォーク)はスクリプトが使えます。つまり対応している訳なんです。しかしながらレコーダブルではないので、AI(イラストレータ)やPH(フォトショップ)のアクションのように実際に行なった動作を記録することは出来ません。(レコーダブルとは、スクリプト編集プログラムで、"記録ボタン"を押すと自動的にそのプログラムを記録してくれることを言うんです。)だから、QXのスクリプトは自分で最初から書いていかないといけません。また、最近(OS8.5から)アップルスクリプトは英語しか使えなくなりました。(QXは最初から英語しか使えませんが)と言っても中学生の時に習った英語の知識があれば十分なんです。それではQXのスクリプトが書けるように、ちょっとづつお勉強していきましょう。


何から始めるか!

そうなんです。実はこれを書いている私もなんも知らないんです。何から始めたらいいのかも解らないんです。(佐藤さん助けて!教えて!)とにかく、人の作ったスクリプトでも見てみましょうか。

これは、鎌田さんという人のホームページ上で提供されているスクリプトなんです。
上の欄の"このスクリプトについて"というところは、何を書いてもいいみたいなんです。スクリプトの結果には影響しないんです。とは言っても、保存するとき"アプリケーション"っていうので保存すると、一番最初に、そこに書かれてある文字が画面に出るように設定できるらしいんです(scriptを保存する時に出てくるダイアログで"初期画面を表示する"にするとここに書かれた文字が表示されるんです)。普通はそのスクリプトの内容を簡単に書いたりしているようなんです。マァ〜自分で使うスクリプトだったら、好きなことを書いておきましょう。
その下の欄(--Copyright 1996 ………)に、作りたいスクリプト文が書かれているようなんです。
このスクリプトはtextboxの中の文全てののカーニングをゼロにするスクリプトのようなんです。たった7行の簡単なスクリプトでテキストボックスの中にいくら沢山の文章が入っていても一発で、使われているカーニングを全部0にしてくれちゃうんです。実際の作業ではあまり使うことはないんですけど。
それでは、このスクリプトを徹底的に解析していきましょう。

tell 〜 end tell の文が、3つ入れ子式になっていて、最後に set 〜 to 〜 という文で終わっているんじゃないでしょうか。なんかスクリプトってたいして難しく無さそうな気もしてきました。tell,tell…で操作したい対象を絞り込み、set …でカーニングとか、トラッキングとか変えれるんじゃないでしょうか。every〜というような言葉も使えますから、一度に全部のカーニングが変えられるんですね。
簡単なスクリプトでも、随分頭の体操したような、ムダなことしたような? 次からはひとつずつよく使いそうな構文について考えていこうと思うんです。


set〜to… 〜を…に変えろ

set の前に、ちょっと get を…
  get "春の嵐"
とスクリプト編集プログラムを立ち上げて、スクリプトウインドウにいれてみましょう。そして実行ボタンを押して下さい。別のウインドウ(結果ウインドウ)に"春の嵐"と表示されるんです。だからどうなんだと言ってしまえばおしまいですが、このプログラムが"春の嵐"という文字(テキスト)を手に入れて、いつでも使えるよ〜、ということなんではないでしょうか。applescript では get で何でも手に入れることが出来るんです。で、どういう時使うんだっていうと、例えば、QX(クォーク)の書類の 1ページ の1番目の textbox の3番目の段落の文字の書体を変えたいというスクリプト書く時、QX の用語を調べて、はたして本当にその段落をとって来れるかどうかなど、get 〜〜 で調べるんです。OK なら、結果ウインドウに結果が表示されます。ダメなら、エラーになります。と、いうような使い道もあるようなんです。

setto … は、…を〜に代入するということらしいんですが、上記カーニングの例でいうと
  set every character's kern whose kern is not 0 to 0
every character's kern を 0 に変えろってことなんです。なんとなく分かりますよね。
getでは何でも手に入れることが出来たんですが、setはそうではないらしいんです。いくらapplescriptでも変えられないものもあるんです。マァ、あたりまえですね。勝手に変えられて困るものは誰にでもあるもんです。
ところで、applescriptが使える言葉って(用語)、例えば QX のスクリプトを書くのにどんな用語がつかえるのでしょうか?
スクリプト編集プログラムのファイルメニューの "用語説明を開く" をクリックして、QX 本体を選んでやれば、なんだかヅラヅラと英語がいっぱいでてきます。その中で[r/o]というのが入っている用語が変更出来ない(set〜が使えない)用語なんです。(たいして重要なことではないですけど。)それでは、set を使った例をもう一個ぐらい見てみましょう
  set a to "春の嵐"
簡単そうですね。a を春の嵐に変えろってことなんです。正確には a に春の嵐っていう文字列を代入しろってことのようなんです。ところで、この a って何なんでしょうか。


変数

  set a to "春の嵐"
この a って、変数っていうんです。春の嵐という(文字列)を扱うには""で囲まなければいけませんでしたよね。''で囲まれていなくて、数字でなくて、用語(言語の用語やアプリケーションの用語など)でもない文字は、全て変数として扱われるらしいんです。だから、script文の中で何か意味のある(何かで定義された)言葉以外の言葉はみんな変数なんです。この変数には何でも代入出来て、あとで使うことが出来るんです。変数って日本語はどうも適当ではないような気もしますが、算数の世界ではよく、xとかyとか他の値を代入する時に使いましたね。それですそれです、その変数なんです。変な数字じゃありません。変わることのできるものということなんです。マァ、何でも入れられる入れ物みたいなものなんです。だから、上のscript はaという箱に春の嵐という文字列をいれなさいという命令なんです。


アァ〜、まだまだ役にたつ script は書けそうもありません。そこで今度は repeat 文でもお勉強してみましょうか。ちょっとむずかしそうなんですけど! その後 if 文でもやれば少しは役にたちそうなものつくれるんでしょうか??


repeat 繰返し

スクリプトってどこが面白いかっていうと、この repeat とか every とか if とかがあるから便利で面白いんです。set 〜 to … で一個だけ何かを変えるんだったら、何もスクリプトなんか苦労してお勉強しなくても、アプリケーションで手作業でやった方がどれだけ速いかしれません。全部いっぺんに変えたり、作ったりできるから面白いんです。
  repeat within { , , , …}
という構文は、{}の中の , で仕切られた項目一つ一つについて 〜 に代入して、最後まで、次の行に書いてあるコマンド(命令)を繰返しなさいよっ、ということらしいんです。 〜 は変数ですが "ループ変数" っていうらしいんです。{ } で囲まれた部分はリストっていうらしいんです。
  set x to 0
  repeat with y in {1,2,3,4,5,}
   set x to x+y
  end repeat

上のスクリプトを実行すると、結果ウインドウに 15 と返ってきます。この命令をうけてコンプータがどう動いたかっていうと、最初の set 文で x(変数)に 0 を格納し、次の3行の repeat 文で 0+1 → 1+2 → 3+3 → 6+4 → 10+5 となり、repeat 文をぬけると、変数 x には 15 が格納されるようなんです。
先ほどリストっていうの出てきましたよね。えべりー、じゃなかった everyってのも前に出てきました。そこでついでに
  every〜of… というのも覚えておきましょう。
このように指定されたら結果は、どうやらリストっていうのになることがきまっているらしいんです。だから、
  repeat with x in (every file of folder "名称未設定")
    set y to name of x
  end repeat
 と書けば
名称未設定というフォルダの中にあるファイルの名前を全部、y という変数の中に格納しなさいという命令になるんです。
(なんかとってもややこしいんですけど、何回か読めば言ってることが解ってくるんです。あっ、私は120回くらいで解りました。)
この後、y を好きなように料理することが出来るんです。


if 〜 then ……(条件文というらしい)

if 文の前にちょっと、下の図のスクリプトを見てください。
1行目の display dialog "あなたはどちらかというと、仕事がきらいです。" buttons {"はい", "いいえ"} を覚えましょうか。
これは、"はい"と言うボタンと"いいえ"というボタンをつけて、"あなたはどちらかというと、仕事がきらいです。" というダイヤログを出しなさいと言う命令なんです。これぐらい覚えてしまいましょう。しょっちゅう使います。この1行のスクリプトだけ書いて実行すると、右図のようなダイヤログが出ます。

2行目の if the button returned of the result is "はい" then これは、直訳すると、button から返ってきた来た結果が、"はい"ならその時は、次の行に書かれている命令を実行しなさい、ということのようなんです。つまり、もし、"はい"というボタンを押した時は、次の事柄が実行されるということなんです。
次の事柄とは3行目に書かれている、display dialog "やっぱり!"です。 画面に"やっぱり!"というダイヤログが出るんです。
4行目、elseは、そうでなかったら、次の行のコマンドを実行しなさいというということのようなんです。だから、"いいえ"のボタンを押したら、5行目の display dialog "うそつき!"が実行される訳なんです。つまり"うそつき!"というダイヤログが表示されるんです。

もう少しこの条件文について考えてみましょう。

上図のスクリプトは、鎌田さんという方のホームページのスクリプトライブラリーに、フリーウエアとして発表されている"簡易面付け"というクォーク用のスクリプトを、少し自分用に編集したものの一部ですが、if 文のところを少し詳しく見ていきましょうか。

  if i mod 4 = 1 then
これは、iを4で割ったあまりが1だったら、ということなんです。つまり、iが1、5、9、13……のとき、ということなんです。この mod の使い方も覚えてしまいましょう。

    tell pictur box 1 of page j1 of document 1
上図の数字でない赤文字はクォークの用語なんです。結構わかりやすいんです。pictur box は画像ボックスってわかりますよね。だから、このコマンドは j1 ページの画像ボックス1に命令するってことのようなんです。(画像ボックス1の1とは1番前面にあるボックスを表しています。画像ボックス2とは、2番目のレイヤーにある画像ボックスということです)

      set image 1 to alias (thepath & file_name & i)
image 1(画像)に alias (thepath & file_name & i) を set しなさい。ということのようなんです。

    end tell tell文終了

  else if i mod 4 = 2 then
これは、i を4で割ったあまりが1じゃなくて、2のときは、ってことのようなんです。else if 〜〜 then って構文覚えましょうね。

まとめてみますと、このスクリプトの if 文は、i を4で割って1あまるとき、2あまるとき、3あまるとき、0あまるとき(割り切れるとき)に、その i に応じて、張り込む画像ボックスをどこにするのか決めれるんです。つまり、i が1,5,9,13,…… のときは ○ に、i が2,6,10,14,……のときは □ に、というように、ページによってどこの画像ボックスに貼るか決めれるんです。
このように else if 〜〜 then を使えば、いろんな条件の元でコマンドを実行出来るんです。これは便利なものなんです。
それを、repeat 文で、保存した全てのEPSファイルについて実行出来るので便利なものですネ、アップルスクリプトって……。


アップルスクリプトって、ちょっとお勉強するだけで、思わず役に立つことが結構あるんです。

おわり。