オブジェクトと属性

オブジェクトってなに?

 オブジェクト(object)は、日本語で「物(あるいは部品)」という意味です。
 またオブジェクトには「目的語」という意味もあります。
 AppleScriptの命令を動詞に見立てると、オブジェクトは目的語になる名詞と言えます。
 つまり「何をどうする」の「何」の部分がオブジェクトです。

 AppleScriptでのオブジェクトの指定方法は様々なものがあります。
 その中で最もよく使われる書式が名前によるものです。

オブジェクトの種類 名前(name)

「名前(name)」の部分は文字列なので、エディタの入力欄に実際にスクリプトを入力する場合は「名前」の部分をダブルクォーテーションで囲んで表します。
 例えば、次のようになります。

file "sample.txt"

 これまでにも登場したapplication "Finder"というのも、実はアプリケーションオブジェクトを指定していたのです。

 また、番号を使った書式もよく使います。

オブジェクトの種類 番号(index)

 例えば、次のように表記します。

folder 1

 通常オブジェクトは番号と名前を持っていますが、例外もあります。
 例えば、テキストファイルに含まれる文字列には番号だけが付けられており、名前がありません。
 しかし、名前と番号のどちらでも扱えないオブジェクトはまずありませんから、とりあえずこの2つの書式を覚えておけば、たいていのオブジェクトを扱えます。

コンテナオブジェクト

 さて、前回にも登場した「参照(reference)」とは、オブジェクトの位置を示す住所と言えます。
 フォルダの中にファイルがあるように、オブジェクトはほかのオブジェクトに含まれている場合があります。
 フォルダのようにオブジェクトを含んでいオブジェクトを「コンテナオブジェクト(container object)」と言います。
 また、コンテナオブジェクトに含まれているオブジェクトを「要素(element)」といいます。

 オブジェクトに含まれるオブジェクトへの「参照」を書くには、「of」を使います。
「ワーゲンという車のエンジンの第2プラグ」という文章をAppleScriptの参照風にすると、次のように表現できます。

プラグ 2 of エンジン 1 of 車 "ワーゲン"

 階層が深いファイルを参照したい場合は「of」で区切るのは面倒なうえ、スクリプトが読みにくくなってしまいます。

tell application "Finder"
	file 1 of  folder 1 of disk 1
end tell

 この場合は、「tell」を使って基準となる参照を設定すればすっきりと表現できます。
 特に何度も同じファイル指定する場合に有効です。

tell application "Finder"
	tell folder 1 of disk 1
		file 1
	end tell
end tell

 このスクリプトでは、1行目のtell application "Finder"で参照する範囲をFinderに限定し、2行目の「tell folder 1 of disk 1」で1番目のボリュームの1番目のフォルダというふうにさらに範囲を絞り込んでいます。
 これで3行目の「file 1」は、「Finderにある1番目のボリュームの1番目のフォルダの中の1番目のファイル」ということになります。

属性ってなに?

 現実にある「物」には、高さや重さ、色などのさまざまな性質を持っています。
 Macで扱うオブジェクトも同様で、ファイルサイズや名前、作成日時などの性質があります。
 AppleScriptでは、これらの性質を属性(property)と呼びます。属性はオブジェクトに固有で削除できません。
 属性は、次のような形で表します。

属性 of オブジェクトへの参照

 また、属性を変更するには、set命令を使って次のように書きます。

set 属性 of オブジェクトへの参照 to 変更後の値

 ただし、属性の中には「size(ファイルサイズ)」や「creation date(作成日)」などの値を変更できない項目があります。
 このような属性は、各用語説明の末尾に読み出し専用(read only)という意味の[r/o]が記されています。

 では、Finderの用語説明で「Finder items(一般的項目)」に分類されている「item」の属性を紹介しておきます。
 これらの属性は、Macのデスクトップ上にあるフォルダ(folder)や書類(file)が備えている情報です。
 例えば、「home」フォルダ(注1)にある"test.txt"というファイルの、コメント(comment)を変更するには次のように書きます。

tell application "Finder"
	set comment of item "test.txt" of home to "変更しました"
end tell

「テキストエディット」などの適当なアプリケーションを使って、"test.txt"というファイルを作って"home"フォルダに保存しておき、スクリプトを実行してみましょう。

 スクリプトを実行したらFinderの[ファイル]-[情報を見る]を選択し、コメントが"変更しました"に変わっていることが確認してみてください。
 そうなるようにスクリプトが書かれていることはわかっていても、ちょっと不思議な気分ですね。

 次に書類(file)が持つ属性を使ってみましょう。拡張子を調べるには、次のように書きます。

tell application "Finder"
	name extension of item "test.txt" of home 
end tell

 結果ウィンドウには拡張子(txt)が表示されます。

windowを使ってみよう

 またウィンドウ(window)が備える属性を使えば、ウィンドウの移動や形状の変更を行えます。
 一番手前にあるウィンドウを画面の左上に表示にするには、次のように書きます(注1)。

tell application "Finder"
	set position of front window to {0, 44}
end tell

 アプリケーション(application)そのものもオブジェクトの1つです。
 当然のことながら属性を備えています。
 では、アプリケーションの属性を使ってみましょう。
 次のスクリプトは、Finderを非表示に切り替えます。

tell application "Finder"
	set visible to false
end tell

 すでに「tell」で命令する範囲(ここでは application "Finder")を決めているので、2行目のset visible to falseの前に、visible of application "Finder"と記述する必要はありません。

 このように属性には多くの種類があります。
 詳しくは「Finder用語辞書」を参照してください。
 もちろん、エディタでFinderの用語説明を開くのもいいでしょう。

 次に「スクリプトエディタ」を使って(注2)、アプリケーションの属性を紹介していきます。
 エディタの「application」の属性はFinderとよく似ており、「name」「frontmost」「version」「selection」——などを用意しています。
 これらの属性は多くのアプリケーションに共通するものです。

 エディタの「window」オブジェクトは、ウィンドウそのものを操作する場合に使用します。
 また「document」オブジェクトは、ウィンドウに含まれる文書を操作する場合に使います。
 テキストエディタなどでは、「window」と「document」は同じオブジェクトとして扱われることが多いですが、ウィンドウを扱う場合と文書を扱う場合を意識して、両者を使い分けるほうがいいでしょう。
 例えば、検索ウインドウはウインドウ(window)ですが、書類(document)ではありません。

 次のスクリプトは、エディタで開いた一番手前のウィンドウの位置と大きさを、左上100,100、右下600,500ピクセルの座標に変更しています。

tell application "Script Editor"
	set bounds of front window to {100, 100, 600, 500}
end tell

 エディタのウインドウにはposition属性がありませんから、近い属性で代用しています。
 このように、ある程度AppleScriptの用語はアプリケーション間で共通しているものの、違いも多くあります(注3)。
 とはいえ、目的の命令や属性がなくても、ちょっとした工夫でなんとかなる場合も多いのです。

オブジェクトの内容

 テキストエディタの場合は、現在選択しているものを表す「selection」属性を使う事が多いでしょう。

tell application "Script Editor"
	selection
end tell

 現在の選択範囲への参照を結果ウィンドウに表示します。参照が表すオブジェクトの内容は「contents」属性で取り出せます。

contents of 参照

 例えば、次のスクリプトは文字列を結果ウィンドウに表示します。

tell application "Script Editor"
	contents of selection
end tell

 次のスクリプトは、エディタの選択範囲を「(* *)」で括ってコメントにします。

tell application "Script Editor"
	 "(*" & contents of selection & "*)"
	set contents of selection to result
end tell

 まず、選択している文字列(contents of selection)の前後にコメント記号を&で結合します。
 そして、出来上がった文字列(resultは前の行の結果でしたね)を、contents of selectionに設定して、選択範囲の内容を書き換えます。

 このスクリプトは、 resultを使わずにまとめて書くこともできます。

tell application "Script Editor"
	set contents of selection to "(*" & contents of selection & "*)"
end tell

 toの左右で同じcontents of selectionが使われているのが奇妙な感じもしますが、まずtoの右の内容が処理されて、それでできたものを左に設定される、という順に処理されるので、問題は起きません。

 このスクリプトは、エディタのコンテクストメニューに含まれる「Comment Tags」と機能的には似たようなものです。
 ですが、/Library/Scripts/Script Editor Scripts/Comment Tags.scptを開いてみると、大量のスクリプトが出てきて面食らうかもしれません。
「Comment Tags」のスクリプトは、文字列が選択されていない場合に適切なメッセージを表示したりなど、例外的な処理も行っているため、長くなっているのです。
 普段AppleScriptを使う分には、こんなに丁寧に書かずに先ほどの3行のスクリプト程度で十分実用になります。
 Appleが作っているスクリプトなんだから、自分もあんな風に書かないといけないんだ、とか思う必要はありません。
 楽をするためにAppleScriptを使うんですから、必要なところだけ書いて楽をすれば良いのです。

文字オブジェクト

 さて、「character」「word」「paragraph」の3つの単語を覚えているでしょうか?
 これらは第3回の「Macも計算機なんだし」で、「文字列」を扱う単語として紹介しました。
 ここでの使い方もほぼ同じで、値の部分に文字列の代わりにオブジェクトへの「参照」を書くだけです。例えば文字列の場合は次のように。

word 2 of "test text"

 オブジェクトへの参照の場合は、次のようになります。

tell application "Script Editor"
	word 2 of document 1
end tell

 書式はほとんど一緒ですね。
 ただし、文字列は値なのでオブジェクトへの参照と同じ文字を扱う場合でもアプリケーションに依存しません。
 つまり「tell」ブロックの中でも外でも使えます。
 しかし、オブジェクトへの参照はアプリケーションに依存するため(注1)、必ず「tell application〜」のブロックの中で使わなければなりません。

 命令とオブジェクトの使い方が分れば、記録機能を使って作成したスクリプトはほぼ理解できます。
 ですが、AppleScriptが持っているのは、記録して再生するだけの機能ではありません。
 次回からは記録機能だけでは作れないスクリプトを作っていきます。

【今回のまとめ】

オブジェクトは、

  • コンピューターの中のモノ
  • 名前や番号で指定する

参照は、

  • オブジェクトの住所
  • オブジェクト同士を「of」でつないで書く
  • 「tell」で基準オブジェクトを変更

属性は、

  • オブジェクトの性質
  • 「set」で値を変更する