命令しなきゃ始まらない

命令ってなんだ?

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

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

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

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

命令してみよう

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

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

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

beep 2

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

 しかし、count命令は「ScriptingAdditions」にあるOSAXのどこにも含まれていません。
 AppleScript本体で定義されているからです。

どんどん命令しよう

 さらにいくつかの命令を試してみましょう。
 数字やダブルクオート(")で囲われた部分は引数(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

 Macが「How are you?」としゃべります(注1)。

say "How are you?"

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

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

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

display dialog  "お元気ですか?"

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

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

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

default button "はい"

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

with icon note

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

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

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

 これで、一行だったスクリプトを分割することができます(注2)。

Finderに命令しよう

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

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

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

end tell

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

 本書では、アプリケーション命令のサンプルとして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

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

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

tell application "Finder"
	quit
end  tell

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

ファイルを使ってみよう

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

 手っ取り早く参照(ファイルパス)を作成するには、指定したいファイルをエディタのウインドウにドロップします(注1)。
 例えば、"システム"をドロップした場合は、次のようになります(注2)。

/System

 Macの従来からのファイルシステムはフォルダ・ファイルを「:」で区切りますが、ターミナル(Shell)やJavaScriptでは「/」区切りです。
 AppleScriptでも実は基本のファイルパスは「:」区切りで記述されます。
 記録の際のファイルパス表記も、次のような「:」区切りです(起動ディスクが"Macintosh HD"の場合の例)。

file "Macintosh HD:System:"

 しかし、他の環境とのやりとりの容易さや、ドロップされた際の区切りが「/」になることもあり、本書では「/」区切りのファイルパスを基本に解説します。
 実際に「_」区切りパスをスクリプトで使用する際は、次のようにfileではなくPOSIX fileを前につけ、パスをダブルクオートでくくります。
 なお、POSIX(Portable Operating System Interface)とは、主にUNIX系のOSで使われる規格のことで、ここでは「/」区切りのパスを指します。

POSIX file "/System"

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

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でファイルを選択状態にしていない場合は、何も起こりません。

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

【今回のまとめ】

命令は

  • いろんな動作を実行させる
  • 主に、動作中心と、結果中心の2種類
  • 引数を変えて、いろんな動作ができる

命令の使い方

  • AppleScript命令とスクリプティング機能追加命令は、すぐ使える
  • アプリケーション命令はtellで囲う
  • 引数が沢山ある時は少しずつ引数を足す

Finderの使い方

  • ファイルは住所(参照)をもっている
  • 参照は「:」区切りと、「/」区切りの形式がある
  • 記録機能を使ってひな形にする