命令しなきゃ始まらない

命令ってなんだ?

 AppleScriptのスクリプトには、さまざまな動作を行う単語が用意されていて、これらを命令(command)と呼びます。
 命令は日本語の「動詞」にあたるもので、スクリプトで「何をするか」を表すものです。
 具体的には、AppleScriptやOSAX、アプリケーションなどを対象にして、「開始(run)」や「終了(quit)」などの動作を伝えます。

 命令には、次の4種類があります。

  1. AppleScriptが用意している「AppleScript命令」
  2. OSAXが用意している「スクリプティング機能追加(OSAX)命令」
  3. アプリケーションが用意している「アプリケーション命令」
  4. ユーザーが作成する「ユーザー定義命令」

今回は、ユーザー定義命令を除く3つの命令を紹介します。非常に多くの命令が用意されていますが、すべてを使いこなす必要はありません。使いたい命令だけを覚えておけばよいでしょう。

命令してみよう

 OSに標準で組み込まれている「AppleScript命令」と「OSAX命令」は、「AppleScript Editor」にスクリプトを書けば実行できます。まず、AppleScript命令の1つ、文字数を数える「count」命令を入力して実行してみましょう。

count  "この文章は何文字?"
	--> 9

 次に、OSAX命令を紹介しましょう。「beep」命令は警告音を鳴らす命令です。

beep 2

 "System:Library:ScriptingAdditions:"を見ると「StandardAdditions.osax」(注1)がありますが、これを「AppleScript Editor」にドロップして用語説明を見ると、beep命令を見つける事ができます。この事から、beepなどのOSAX命令は「ScriptingAdditions」フォルダに組み込んだOSAXファイルを使って実現していることがわかります。

 しかし、count命令は「ScriptingAdditions」にあるOSAXのどこにも含まれていません。ここで、注意してほしいのは「ScriptingAdditions」にあるファイルにはスクリプティング機能追加(OSAX)とアプリケーションの2種類がある事です。アプリケーションの方は「ScriptingAdditions」にあっても、通常のアプリケーションと同様に使います。

工具いろいろ
ポッケに道具ありまーす

(注1) 旧Mac OSでは"システムフォルダ:スクリプティング機能追加:標準機能追加"。Mac OS Xではシステム標準のOSAXを取り出す事はできませんが、旧Mac OSでは、取り出す事ができるので、取り出してbeep命令が実行できない事を確かめてみて下さい。

どんどん命令しよう

 さらにいくつかの命令を試してみましょう。スクリプトの太字の部分は命令で、普通の字体の部分は引数(parameter)です。引数は、ユーザーが任意に書き換えられる部分です。引数を変えて、どのような結果になるかいろいろと試してみましょう。以下は、すべてOSAX命令です。

 0〜100の中から適当な数字を返します。

random number 100

 数値「123.45」を四捨五入します。

round 123.45
	--> 123

 文字列「microsoft」の中で「cro」が含まれている位置を文字列の先頭から数えて、その数値を返します。

offset of "cro" in "microsoft"
	--> 3

 現在の日付を返します。

current date

 ファイル選択ダイアログを表示して、選択されたファイル名を返します。

choose file

「Speech Manager」をシステムに組み込んでいる環境では、Macが「How are you?」としゃべります(注1)。

say "How are you?"

 このようにAppleScriptには、「beep」のように動作が主体の命令と、「current date」のように結果、つまりresultの内容が主体の命令があります。

うた歌うメイド
声も出まーす

(注1) say命令はMac OS 8.5以降で利用できます。
 旧Mac OSでSpeech Managerを使用するには、システムCD-ROMの「Mac OS 特別付録」フォルダにある「English Text-to-Speech 」をMac OSに組み込む必要があります。

引数(ひきすう)をつけてみよう

 また、引数を複数付ける必要がある命令もあります。ここでは、AppleScriptでよく使用する「display dialog」を例にして引数の付け方を解説しておきます。ではまず、次のスクリプトを実行してみましょう

display dialog  "お元気ですか?"

 続けて改行をせずに入力して、結果を確認します。

buttons {"はい","まあまあ","いいえ"}

 さらに続けて、次のように入力してください。

default button "はい"

 最後に、次のように入力・実行します。

with icon note

 全部あわせると、display dialog "お元気ですか?" buttons {"はい", "まあまあ", "いいえ"} default button "はい" with icon note、となります。
 非常に長い行のスクリプトができあがりましたが、display dialogのように多くの引数を持つ命令は引数ごとに区切って入力していけば、内容を簡単に理解できます。

 では途中に改行を入れてスクリプトを読みやすくしましょう。しかし命令の途中で普通に改行した場合は、「ScriptEditor」が構文を確認する際にエラーが発生します。スクリプトを途中で改行するには、引数と引数の間などの適切な位置で[option]+[return]キーを押します。これで改行を示す「¬」を入力できます(注1)。この「¬」をソフトリターン記号と呼びます。

display dialog ¬
		"お元気ですか?" buttons {"はい", "まあまあ", "いいえ"} ¬
	default button "はい" with icon note

 これで、一行だったスクリプトを分割することができます。このソフトリターン記号の位置は、構文確認時に自動的に調整されることもあります。

(注1) 「ScriptEditor」の[編集]-[AppleScript フォーマット...]設定で、「演算子など(+ & ,)」で日本語フォントを選択している場合、半角カナ文字の「ツ」になります。
 Script Editor2.0やXcode(Project Builder)では、このソフトリターン記号はエラーとなってしまうので使えません。

Finderに命令しよう

 今度は、アプリケーション命令を使ってみましょう。AppleScriptでは、操作するアプリケーションを指定するために、次のような文を必ず最初に入力します。

tell application "アプリケーション名"

 また、次のように書くと「tell application」で指定したアプリケーションに対する命令を停止します。

end tell

 この「tell application」と「end tell」の間を「tellブロック」と呼びます。tellブロック間には、アプリケーション命令はもちろんのこと、AppleScript命令やOSAX命令も使用できます。tellブロックの中身は、構文確認を行うと自動的に少し右側にずれます。これはインデント(indent)と呼ばれ、スクリプトを読みやすくする処理をScriptEditor自体が行ってくれるわけです。

 本書では、アプリケーション命令のサンプルとしてFinderを使います(注1)。Finderはもっとも多くの人に使われているアプリケーションですから、サンプルには最適でしょう。Finderを操作するには、次のように入力します。

tell application "Finder"
	命令(command)
		・
		・
		・
end tell

 この「命令(command)」の部分に、Finderが備えるさまざまなアプリケーション命令を入力します。では、いくつかの命令を試してみましょう。

tell application "Finder"
	open startup disk
end tell

 「open」命令でFinderの[ファイル]-[開く]メニューを実行することができます。命令が1行に収まる場合は、「AppleScriptって何?」で紹介したように1行で入力することも可能です。

tell application "Finder" to open startup disk

 操作するアプリケーションや入力する命令によっては、アプリケーションが前面(アクティブ)にないと動作しない場合があります。また、前面にあるアプリケーションは、バックグラウンドで動作している場合に比べて、AppleScriptの処理を高速に行えることが多いというメリットもあります。ただし、逆に遅くなる場合もあります。

 では、アプリケーションを前面に移動する「activate」命令を使ってみましょう。

tell application "Finder"
	activate
	open startup disk
end  tell

 これでFinderを前面にしてから、「open」命令を実行します。

 [Finder]-[ゴミ箱を空に...]の処理を行うには、「empty」命令を使います。

tell application "Finder"
	activate
	empty
end  tell

 実は、これらの命令は英語版Mac OSのFinderのメニュー項目と同じ綴りです。つまり、どのようなアプリケーション命令が用意されているかは、そのアプリケーションのメニューを見ればだいたいわかるというわけです。

 さらにAppleScriptは、メニュー項目にない「隠し命令」を使うことも可能です。Finderはアプリケーションですから[終了]できるはずですが、「ファイル」メニューには[終了]項目がありません。そこで、以下のようなスクリプトを実行してみます。

tell application "Finder"
	quit
end  tell

 このquit命令でFinderを終了できます。Finder以外のアプリケーションが起動していない場合は、自動的にFinderが再起動されます。Mac OS Xの場合はDockのFinderアイコンをクリックすると再起動できます(注2)。

ゴミ箱を空に
1)tell application "Finder"
2)activate
3)empty trash
4)end tell

(注1) Mac OS Xの場合、"System:Library:CoreServices:" にある「System Events」が、「Finder」の持っているファイル操作などの機能を担うようになっていますが、旧Mac OSには 「SystemEvents」がありませんので、本書では「Finder」を使います。
 ただし、旧Mac OSとの互換性を考慮する必要が無い場合、Mac OS XではFinderの機能ではないスリープ(sleep)やシステム終了(shut down)は特に、「SystemEvents」を使った方がいいでしょう。

(注2) 旧Mac OSは「Finder」の再起動のときに[command]+[option]キーを押していれば、Mac OS自体を再起動することなく「デスクトップの再構築」が行えます。

ファイルを使ってみよう

 ファイルがどこにあるかを示す文を「参照(reference)」と呼びます。つまり、参照を使えばファイルを指定できるわけです。命令が「動詞」ならば、参照は「目的語」といえます。つまり「何をどうする」の「何」を決定できます。

 手っ取り早く参照文を作成するには、Finderでファイルを選択状態にしておき[編集]-[コピー]([command+C]キー)を実行して、「ScriptEditor」の[編集]-[参照をペースト]を選択しましょう(注1)。例えば、"System"を選択した場合は、次のようになります。

folder "System" of startup disk

 参照文は、必ず「Finderのtellブロック」にペーストする点に注意してください。ファイルはFinderが管理していますので、Finderに対して命令しないと操作できません。

 次に適当なファイルを別のフォルダに移動するスクリプトを書いてみましょう。「...」の部分は移動するファイルなどによって異なったデータ(ファイル名とフォルダ名)が入ります。「Finder」の記録機能が使える場合は、ドラッグ&ドロップ操作を記録してみて下さい。

tell application "Finder"
	activate
	select file ....
	move selection to ....
end tell

「select」はファイルを選択する命令です。スクリプトの実行結果が「result」(結果ウィンドウ)に格納されるのと似ていますが、選択したファイルの参照情報は「selection」に入れられます。先程記録したスクリプトでは、ファイルを移動する「move」命令の中で「selection」を使っています。

 ただし、ファイルを移動するだけならFinderでファイルを選択する必要はないので、1行にまとめて、次のように記述できます。

tell application "Finder"
	activate
	move file ... to ...
end tell

 次に「select」命令が書かれた行を削除してみましょう。

tell application "Finder"
	activate
	move selection to ....
end tell

 このスクリプトを実行すると、Finder上で選択しておいた任意のファイルを「move selection to ....」で指定したフォルダへ移動できます。ただし、スクリプトを実行する前にFinderでファイルを選択状態にしていない場合は、何も起こりません。

 自動記録したスクリプトは無駄な命令を多く含むので、このように思い切ってどんどんスクリプトを削除して汎用スクリプトに作り替えましょう。

ファイルの移動
参照を見て運びます

(注1) [コピー]→[参照をペースト]の処理は、Mac OS 8.5以降のAppleScriptで利用できます。Mac OS 8.1以前の場合は、「folder "システムフォルダ" of startup disk」をキーボードから入力する必要があります。
 Mac OS X10.2の場合はバグのようで、この機能が働きません。

【今回のまとめ】

命令は

命令の使い方

Finderの使い方


2002-10-07 2012-02-13