GO BACK

初心者のためのAppleScript教室


「スクリプト作成の実際」


■オブジェクトの参照について


では、具体的に属性を操作するスクリプトを作ってみましょう。

 Finder上のオブジェクト(ファイル、フォルダなど)を操作する場合、オブジェクトの指定は「参照」というものを使って行なわれます。参照とは、そのファイル/フォルダそのものを示す値のことです。Finderでは、


file "サンプル" of folder "書類" of startup disk


などという形でファイルを指定していましたね。これが「参照」です。参照は、オブジェクトを示すAppleScriptの形式であり、文字列ではありません。例えば、上のファイルの参照を文字列に変換してみると、


“HD-300SC:書類:サンプル”


といった形になってしまいます。つまり、参照は「『file "サンプル" of folder "書類" of startup disk』という文字列」ではなく、オブジェクトそのものなのです。ただ、オブジェクトそのものをスクリプトの中に貼りつけるわけにはいかないので、仮に「起動ディスクのフォルダ“書類”のファイル“サンプル”」という形の文字で表現してある、というわけです。

 Finderでは、よく「○○の参照をお使いください」といったエラーが現われます。これは、使っている値がオブジェクトの参照ではない場合などによく現われるのです。

 また、それぞれの属性は、値の型(クラス)が異なっているということに注意して下さい。型が異なっていると、うまく値をやり取りできません。


■一般的ドラッグ&ドロップの間違いどころ


さて、例題として、第4回で勉強したドラッグ&ドロップ用のハンドラ「〜を開くとは」を使って、「ドロップしたファイルのコメントに、修正日をセットする」というスクリプトを考えてみましょう。

 まず、考え付くのはこんな感じのものです。


on open drop_items
	tell application "Finder"
		set comment of drop_items to modification date of drop_items
	end tell
end open

 これをアプリケーション形式に保存して、実際にファイルをドラッグ&ドロップしてみると、エラーが起きてしまいます。


■問題の多くは「リスト」と「型」にある


このスクリプトの問題は、次のようなものです。


1.「選択書類」はリストであることを忘れている。

 これがまず最初の問題です。ドラッグ&ドロップは、必ずしも1つのものだけがされるわけではありません。したがって、複数の項目がドロップされた場合を考えて、「〜を開くとは」で送られるパラメータは、リストの形になっているのです。

 ですから、スクリプトも、複数項目に対応した形にしてやる必要があります。


on open drop_items
	tell application "Finder"
		set dropNum to count drop_items
		repeat with i from 1 to dropNum
			set Obj to item i of drop_items
			set comment of Obj to modification date of Obj
		end repeat
	end tell
end open

 これでちゃんと動くようになります。ただし、できるならもうちょっと手を加えておきたいところです。


2.修正日の属性は文字列ではないことを考慮する。

とりあえず、現段階でも問題はありませんが、場合によっては日付のフォーマットは文字列に変換しないとうまく動かないことがあります。


on open drop_items
	tell application "Finder"
		set dropNum to count drop_items
		repeat with i from 1 to dropNum
			set Obj to item i of drop_items
			set comData to modification date of Obj
			set comment of Obj to comment of Obj & (comData as text)
		end repeat
	end tell
end open

 これで、日付は文字列として扱われるようになります。これなら、文句なしのスクリプトです。

 もし、もうちょっとスクリプトに詳しい人なら、更にスクリプトをまとめてしまうでしょう。


on open drop_items
	tell application "Finder"
		repeat with Obj in drop_items
			set comData to modification date of Obj
			set comment of Obj to comment of Obj & (comData as text)
		end repeat
	end tell
end open

 ここでは、繰り返し部分で見慣れないものを利用しています。「repeat with 〜 in 〜」というものですね。これは、リストの各項目にすべて同じ処理をする場合に使われる特別な繰り返しです。


repeat with《変数》in {《リストの値》}
	…… 命令を書く ……
end repeat

 こんな形をしています。こうすると、リストの各項目を《変数》に順番に収めて実行してくれるのです。ドラッグ&ドロップのように、リストで値を得ることが多いFinderの操作では、多用される繰り返しです。

 …まあ、こんな感じでスクリプトは書かれていきます。Finderのスクリプトでエラーが起きたら、次の点があやしいと思ってください。


1.リストの処理は完璧か?
2.オブジェクトはきちんと参照されているか?
3.型の異なるものを操作していないか?

 これが、エラーの3大要素なのです(あ、シンタックスエラーは、それ以前の問題ですが…)。

GO NEXT


GO HOME