AppleScript 救急隊

The ForeSight Inc. AppleScript救急隊 ASQsについて Download (サンプル&デモ)


ビジネスで有効活用を目指す

われらがAppleScript救急隊


MacPower誌




Vol.9 DTP スクリプティング(2)

前回は、Photoshop上でのアクション機能の限界についての解説と、AppleScriptによるスクリプティングの入門編だった。その続編として、多数のファイルに対して連続的に実行する本格的なバッチ処理に挑戦し、もう少し上級ステップへ進んでもらおう。



実用的なスクリプトを目指そう!

単純にひととおりの処理の流れを記述しただけだったり、自動記録しただけのスクリプトは、そのままではバッチ処理(自動繰り返し処理)や条件判断には対応していない。FinderやExcelのレコーディング機能をはじめ、QuarkXPressのレコーディング用XTensionである「ScriptMaster」、あるいは汎用レコーディング対応ツール「ScriptMatic」などを使って作成したスクリプトも同様だ。
バッチ処理で何百回も繰り返したり、例外処理に対応できるようなスクリプトを、たった1回の自動記録で可能になる、なんて考えるのはちょっとムシがよすぎる。決まったことを1回だけ実行する単純なスクリプトは別にして、レコーディングしたスクリプトの一部を書き換える必要が出てくるのは、むしろ当然なわけだ。
では、AppleScriptでのバッチ処理はどう書けばいいのか?が今回の課題だ。


TOPへ

エラーを防ぐために必要なrepeat文の正しい使い方は?

 まず必要になるのが、ループによる繰り返し機能だ。
例えば、指定したフォルダー内のすべてのファイルに対して、開く/実行/閉じるといった流れで繰り返して処理を行う。SampleScripts Vol.9に収録している、前回の完成スクリプト「Simple Save As」を開いてみよう。これを繰り返す場合、その対象は「別名で保存して何らかの処理を実行し、ファイルを閉じる」部分までだ(図1)。
それ以前は、スクリプトの起動時にチェックするための機能だ。
では、必要な部分をAppleScriptの繰り返し構文の基本であるrepeat〜end repeatで囲んで実行してみよう。

tell application "Adobe Photoshop(R) 4.0J"
activate

tell application "PreFab Player"
repeat
do menu menu item "別名で保存" of menu "ファイル"
try
do menu popup item "JPEG" of popup "ファイル形式"
type {down arrow, ".jpg"}
type enter
on error
do menu popup item "Photoshop EPS" of popup "ファイル形式"
type {down arrow, ".eps"}
type enter
end try
try
click button "入れ換え"
type enter
on error
end try
type enter
do menu menu item "閉じる" of menu "ファイル"
end repeat
end tell
end tell

図1 繰り返し処理の対象となる範囲

さて、どうなったか。スクリプトは、メニューがないよ、といった意味のダイアログを表示して止まったはずだ(図2)。ファイルを開いてあった人は1回目の処理が終わって閉じた直後に、開いていなかった人はいきなり、このエラー・メッセージに出くわすことになる。ファイルが開かれていなければ保存できるわけがないので、これは当然だ。
repeat文に合わせてスクリプトの内容を修正する必要がある。


図2 処理対象ファイルがなかったり、指定したメニューが使用不能になっている場合に表示するエラーメッセージ

本連載では、これまでほとんど説明せずにrepeat文を使ってきたが、ここでループに最低必要な条件をまとめておく。
@処理の対象が特定されていること
A繰り返す回数が決まっていること
B回数が未定のときは、ループから抜け出あす条件があること

対象ファイルを指定し繰り返す回数を決める

では、これらの条件に従ってスクリプトを修正しよう。
まず、1回繰り返すたびに次のファイルを開いて、前回の処理の開始時と同じ状態に戻す必要がある。そのためには、繰り返して処理するファイルがあるフォルダーを指定しなければならない。対象フォルダーを指定するには、Photoshopへのactivateの前に次のような1文を入れておけばいい。

set batchFolder to (choose folder with prompt "好きなフォルダーを選んでね!")


図3 choose folder命令でフォルダーを選択するダイアログ


実行すると、フォルダーを選択するダイアログを表示する(図3)。
ここで指定したフォルダーへのパス[*1]がbatchFolderに代入される。batchFolderというのは単なる変数名なので、名前は何だってかまわない。また、""で囲まれたテキストも、文字数の制限はあるが何でもいい。何も書かなくてもちゃんと動く。
次に、処理対象のファイルについてもパスなどの情報を取り出しておく。今回は、フォルダー内のすべてのファイルに対して処理を行うので、繰り返しの回数になるファイル数も計算しておこう。
そのためには、以下のスクリプトをchoose folderの直後に書き加える。

tell application "Finder"
set targetFiles to (every file of batchFolder)
set fileCount to count (every file of batchFolder)
end tell

targetFilesにはすべてのファイルへのパスが、fileCountには全ファイル数が取り込まれる。
これで、上記の3条件の内の2つはクリアしたことになる。


TOPへ

repeat回数の指定とファイル・オープン

前提条件は整ったが、実はまだしなければならないことがある。1つは、繰り返し回数の指定だ。
回数はfileCountという変数に取り出しているので、今度はrepeat文にこの数値を伝えてやる必要がある。
さもないと、このスクリプトは永遠に回り続けることになる。

repeat文には何種類かの書き方があるが、今回は次の構文を使う。

repeat with i from 1 to fileCount

最初に書き加えたrepeatを、この命令に書き換える。
これで「1つめのファイルからfileCount内の値まで処理を繰り返せ」という指示になる。
iは、1から始まって2、3……と繰り返すたびに増加する変数で、i=fileCountになると終了する。
もう1つ、repeatするたびに次のファイルを開く、という手順も必要だ。前回作成した1回ポッキリのスクリプトは、Photoshopでファイルが開いている状態を前提にしていた。しかし、2回目以降の繰り返しの場合には、もうファイルは閉じられている。そこで、繰り返しごとにファイルを開く命令をrepeatの直後に加える。

tell application "Finder" to open (item i of targetFiles)

これは、targetFilesという変数に代入されている多数のファイルを、上記のrepeat回数に合わせて1から順番に開かせるための命令だ。この場合も、もちろんiではなくkでもwでもいいが、repeat文のwithの直後のiと同一の名称にする必要がある。

PreFab Playerを使って保存先のフォルダーを指定する

これでほぼ完成に近いのだが、このままでは作業元のフォルダーの情報はあるが、それが保存先のフォルダーなのかどうかはわからない。
さて、PhotoshopはもともとAppleScriptをほとんど理解できないアプリケーションだった。
そこで、PhotoshopがAppleScriptを理解できるようにする必要がある。そこでPreFab Player[*2]の出番になる。

set dialog folder to batchFolder

という命令を、ファイルを開いた直後に入れておく。 これでPreFab Playerが「保存先のフォルダーはbatchFolderっていう変数に入っているフォルダーなんだな」と認識し(図4)、この情報をPhotoshopに受け渡す。元のフォルダーと保存先のフォルダーを別にしたければ、元フォルダーを選んだあとに次の命令を加えておけばいい。


図4

set dialog folderというPreFab Playerの命令で保存先のフォルダー(ここではdone Folder)を指定すると、
「別名で保存」の際に自動的にそのフォルダーが開かれる。

set doneFolder to (choose folder with prompt "保存先のフォルダーを選んで頂戴!")
これで、保存先フォルダーはdoneFolderということになる。
ただし、
set dialog folder to doneFolder に変更するのを忘れてはいけない。


ついに完成!さて、結果はどうだ?

さあ、これでバッチ処理スクリプトが出来上がった。アナタが作ったスクリプトは正常に動いただろうか?
今回の最終スクリプト「Simple Save As with repeat.1」は、多少の制限付きにはなっているが、SampleScripts Vol.9に収録している。ついでに、このスクリプトにもう少し手を入れたバージョンも2つあるので、動作を比べてみよう。また、今回の作例のほかにも数種類のASQ'sのPhotoshop用デモスクリプトを添付しておく。
こんなことまでスクリプトでできるんだ、と感涙にむせんでほしい。
次回は、AppleScriptにまったく対応していない「はず」のIllustratorでのスクリプティングに挑戦する。
Adobeのアプリケーションでのスクリプティングはどれでもほとんど同じようなものなので、今回同様、アッという間にIllustratorのスクリプトライターになれるだろう。


[*1]
パス(path)

階層構造のファイルシステムで、ファイルを特定するた めの階層の位置のこと。ディスクのボリューム名、フォルダー名、ファイル名と続く。

[*2]
AppleScript非対応のMac用アプリケーションをスクリプタブルにするためのツールで、(株)フォーサイトが開発・販売している。SampleScripts Vol.9の「ScriptMatic b1.0J」(使用期限'98年4月30日版)をインストールすると、30日限定の「PreFab Playerデモバージョン」が使用できる。

TOP

AppleScript救急隊事務局(ASQs) info-asqs@fsight.co.jp

主催 株式会社フォーサイト   後援 アップルコンピュータ株式会社

(c)1996-2010 The ForeSight Inc. All rights reserved.
Appleは、米国アップルコンピュータ社の登録商標です。
AppleScriptは、米国アップルコンピュータ社の商標です。
その他記載の会社名・製品名・ソフトウェア名は一般にその会社の登録商標または商標です。