|
《 choose folder…でダイアログボックスが
》
|
|
|
先生
|
だろう?それほど簡単にスクリプティングが理解できたら、私の立場はどうなるんだね。では1行ずつ行こうか。 まず、図2(別ウィンドウのスクリプト)の1行目から行こうか。「set ○○ to △△」という構文は分かるね? |
|
」
|
はい、さっき出てきましたから。でも「set aFolder to…」の「aFolder」っていうのは? |
|
先生
|
これは単なる「変数」なんだ。データを入れておく器みたいなものだ。方程式のxとかyと同じで、中の値は変化する。 1文字だけでなく「aFolder」のように複数の文字を使って分かりやすい名前を付けることができるんだ。 ちなみに「aFolder」という名前は私の好みで「a folder(1つのフォルダ)」をくっつけただけだ。 単なる「x」でも「theFolder」でも構わないよ。 |
|
」
|
なるほど。つまりテンポラリーな値を格納するデータということですね。 次の「to (choose folder with prompt "名前を整理したいフォルダを選んで下さい")」っていうのは何なんですか。aFolderに何かを代入しているようですが、僕にはてんで意味不明なんですけど。 |
|
先生
|
これがちょっと複雑なんだ。というのは、変数に何を入れるかを選択するためにまず「名前を整理したいフォルダを選んで下さい」というダイアログを表示するんだ。そこで該当するフォルダを選択するわけだな。 |
|
」
|
さっき表示されたダイアログですね。でもそれが変数の中身になるんですか? |
|
先生
|
いや、そう早合点してもらっては困る。まず「choose folder」というのが「フォルダを選択しろ」という命令だってことは想像できるね。 |
|
」
|
はい。でもその後の「with prompt」っていうのは? |
|
先生
|
これはフォルダを選択する際に 「名前を整理したいフォルダを選んで下さい」というメッセージが付いたダイアログを表示して選ばせろ、ということなんだよ。 |
|
」
|
なるほど。マックでよく出てくるファイルやフォルダを選択するダイアログですね? |
|
先生
|
そうそう、それで変数aFolderには、選択したフォルダのハード・ディスク内の位置を示す「alias pathname」という道順が記憶されることになる。 |
|
」
|
すると先生、変数の中身はファイルやフォルダの名前だけじゃなくて「邪馬台国までの里程」みたいなものでもいいわけですね。 |
|
先生
|
うん、そうだよ。ただalias pathnameは倭人伝よりはもっと正確じゃないと困るがね。そうして、このダイアログで選ばれたフォルダの中のファイルが、名前を変える対象になるわけだ。分かったかな。 |
|
」
|
なぁるほど、これで本部長が名前を統一したがってるフォルダがどこにあるかを指定できるんですね。 |
|
《 Excelやファイルメーカーにもtellできる
》
|
|
|
先生
|
その通り。それで次の行以下は、そこで指定されたフォルダの中のファイルについて名前を変更する作業を行うわけなんだ。 |
|
」
|
2行目の tell application "Finder" は、さっきと同じだから分かります。でも今度は目的句がないですね。 |
|
先生
|
あぁ「to ××」というやつね。これは必ずしもtellの後に続かなくてもいいんだよ。 でサンドイッチされた部分が、アプリケーションに伝える内容だからなんだ。 |
|
」
|
ここでは「application "Finder"」にtellしていますが、ほかのアプリケーション、例えば「Microsoft Excel」とか「ファイルメーカーPro」とかにも命令をtellできるんでしょうか? |
|
先生
|
いい質問だ。もちろんできる。それができるからAppleScriptはすごいのさ。まぁそれはさて置き、次へ進もう。 |
|
《 すべてのファイルについてrepeat文で繰り返す
》
|
|
|
」
|
次に出てくる repeat with aFile in (every file of aFolder) ですが 「repeat」っていうのは「繰り返せ」っていうことですよね。 |
|
先生
|
これは、AppleScriptが作業の流れを制御する構文の1つで、 repeat という形で用いる。 |
|
」
|
特定の回数っていうと? |
|
先生
|
この場合は、aFolderの中にあるファイルの数だけさ。いつまで繰り返すのかを決めるのが、with aFile …なんだ。 repeat with ×× in △△ の形だと、△△の中の項目を毎回1つずつ××に代入して、すべての項目について繰り返せ という意味になる。 |
|
」
|
ということは、aFolderの中にあるすべてのファイルについて繰り返せ、ということですか?どうもよく分からないんですけど…。 |
|
先生
|
この構文では通常、in以下で指定されるものはリストになる。例えば、 だったら、xの値が10,50,100と次々に変化しながら「set s to s+x」という文が繰り返し実行される。repeat文を抜けると、sの値は160になるわけだ。 |
|
」
|
ちょっと待ってください。今度は「リスト」っていうのが分からないんですけど。 |
|
先生
|
要するにデータの集合でね、普通は{1,2,3}のようにカンマで区切って{ }で囲んで表現するんだな。 |
|
」
|
「every file of aFolder」っていうのはリストなんですか。あぁそうか、aFolderの全てのファイル、って言うとリストっぽいですね。 |
|
先生
|
「every ×× of △△」と指定した結果は、実はリストになることが決まっているんだ。 |
|
」
|
だいぶ分かってきました。 |
|
先生
|
xやaFileは「ループ変数」といって、in以下で指定されるリストの値を保存する。aFileには繰り返しの1回ごとに、リストの中にあるファイルが1つずつ格納されるんだよ。 |
|
」
|
なるほど、1回繰り返すごとに次々にファイルを変えて、すべてのファイルの名前を加工させようって企んでるわけですね。 |
|
先生
|
うん、企みというのは気に食わんが、まぁそう思ってくれていいだろう。ここまでは大体いいかな? |
|
」
|
はいっ、本部長に説明できるくらいは理解したつもりです。 |
|
《 国名の単語だけを取ってくる
》
|
|
|
先生
|
よしっ、ではrepeat文の中身すべてのファイルに対して繰り返す内容を見て行こう。 まず最初の set aFileName to name of aFile は、最初の例と同じだね。 |
|
」
|
えぇ、単純に考えると「aFileの名前をaFileNameに代入しろ」 ってことなんでしょう。 aFileNameっていうのは新しい変数ですね。 |
|
先生
|
その通り。そこで、次も同じ命令なんだが、分かるかな? set aNewFileName to (word 4 of aFileName) |
|
」
|
新しく作った変数「aNewFileName」を「word 4 of aFileName」にしろ、っていうことになりますが、問題は「word 4 of aFileName」ですよね。これは「aFileNameの4番目の単語」だから、そうかっ、ファイル名の最後についている国名を持って来るんだっ。どうですか、先生? |
|
先生
|
うん、まぁよしとしようか。答えはいいが、君の頭はマックより1000分の1くらい回転が遅いがね。 |
|
」
|
まいったなぁ、先生。ほかのことをやらせたら僕だってパソコンよりはるかに上手くやりますよ。 |
|
《 tellやrepeatはブロックに着目しよう
》
|
|
|
先生
|
まぁいいからいいから。だが次の、repeat with i from 1 to 3からend repeatまでの3行はどうかな?これもすぐに分かれば、大したものなんだが。 |
|
」
|
またしてもrepeat。よく見るとrepeat〜end repeatの中に、さらにrepeatがありますね。 |
|
先生
|
これまでは言わなかったが、スクリプトはタブでインデント(字下げ)されているだろう。実はこれが重要なんだ。 |
|
」
|
HyperTalkでもありましたよねっ。 |
|
先生
|
そうそう、HyperTalkと同じように、AppleScriptの「スクリプト編集プログラム」もただのエディターじゃなくて、自動的に最低限の構文をチェックしてくれるんだ。 |
|
」
|
そうです。とっても見やすいですよね、この機能は。 |
|
先生
|
いや見た目の機能だけではないんだ、これが。 同じ位置にインデントがあるステートメント(文)に挟まれた間は、ずぅっとその始まりの命令が生きているってわけだ。実はこのスクリプトは、図3のように3つの階層構造があるんだよ。 |
![]() 図3 3つのブロック |
|
|
」
|
tell〜end tellのブロックがFinderへの命令、repeat with aFile…〜end repeatのブロックがすべてのファイルについての繰り返し、そしてもう1つrepeat with i…〜end repeatがあるわけですね。 |
|
先生
|
2番目のrepeatは、 repeat with ×× from △△ to □□ という構造になっている。これは、1回繰り返すたびに××という変数に,自動的にある値が代入される。その値は最初は△△、1回繰り返すごとに1が加算され、最後の繰り返しでは□□になる。 |
|
」
|
はぁ。 |
|
《 単語を切ったりつないだり自由自在
》
|
|
|
先生
|
では、どうしてiなんていう面倒くさいものを使うかというとだね、繰り返される内容を見てくれたまえ。 ここに「word i of aFileName」という文があるだろう。 |
|
」
|
「&」っていうのは? |
|
先生
|
文字列と文字列をつなぐ演算子だ。 つまりaNewFileNameはrepeat with i…で繰り返すたびに「USA 94」「USA 94 12」「USA 94 12 01」と変化していく。いいかな? 分かったかね。 |
|
」
|
はいっ。あっ、もう1つありました。" "で挟まれた半角スペースがありますけど、これも何か意味があるんですよねっ? |
![]() |
|
|
先生
|
あぁそうか。説明するのを忘れていたんだが、これはね、前にも出てきたダイアログのメッセージにもあったよね。 |
|
」
|
えぇ、そう言えば付いていました。 |
|
先生
|
この半角の引用符は、その間に書かれたものがstring、つまり文字列だということを示している。 先ほどの「リスト」もそうなんだが、この「文字列」というのもAppleScriptで扱うことができるデータの一種でね「これは命令じゃないよ、文字としてのデータですよ」ということを意味しているんだ。 |
|
」
|
で? |
|
先生
|
詳しくは、また改めて説明するつもりだが、これは英語や日本語といったいわゆる文字でなくても、数字でも記号でもスペースだって構わない。だからさっきの引用符で囲まれた半角スペースは「そこに半角のスペースを入れなさい」ということになる。 だいたい分かったような気がします。 |
AppleScript救急隊事務局(ASQs) info-asqs@fsight.co.jp