choose from list で表示した候補のうち、ユーザーがクリックし選んだものがどれかを取得します。
AppleScript 0005 - Display dialog ボタンの結果の取得のスクリプトを修正してみます。
リストされる選択肢にはリスト型の値を与えます。( 例: {"札幌", "大阪", "博多"} )
on test() からの return kotae には 文字列 が保持されています。"札幌", "大阪", "博多"のどれかを選ばずに キャンセルボタンをクリックしたときは『false』が return されました。
選択肢に {"札幌", "大阪", "博多"} の代わりに {5, 10, 15} を与えたときの実行したら {5} がサブルーチンから返ってきました。
choose from list でユーザーが選択した結果は、リストに与えたときの値({"札幌", "大阪", "博多"} のように文字列で与えれば結果も文字列、 {5, 10, 15} のように数値で与えれば結果も数値)がそのまま返ってきます。
なお、Display dialog を使ったときに返ってくるのはレコード型( {ラベル名:値} )でした。
<環境>
Mac OS X バージョン10.4.1 標準
(スクリプトエディタ バージョン2.1)
AppleScript 0005 - Display dialog ボタンの結果の取得のスクリプトを修正してみます。
--サブルーチンを実行し、結果を変数kotae3に保持する
set kotae3 to my test()
--ユーザーの選択結果("札幌", "大阪", "博多"のどれか)を表示する
display dialog kotae3
--サブルーチン部
on test()
--選択候補をリストする
set theList to {"札幌", "大阪", "博多"}
--ユーザーに候補リストからの選択を促す
set kotae to (choose from list theList default items "博多")
--変数kotae("札幌", "大阪", "博多"のどれか。文字列)を返す
return kotae
end test
リストされる選択肢にはリスト型の値を与えます。( 例: {"札幌", "大阪", "博多"} )
on test() からの return kotae には 文字列 が保持されています。"札幌", "大阪", "博多"のどれかを選ばずに キャンセルボタンをクリックしたときは『false』が return されました。
選択肢に {"札幌", "大阪", "博多"} の代わりに {5, 10, 15} を与えたときの実行したら {5} がサブルーチンから返ってきました。
choose from list でユーザーが選択した結果は、リストに与えたときの値({"札幌", "大阪", "博多"} のように文字列で与えれば結果も文字列、 {5, 10, 15} のように数値で与えれば結果も数値)がそのまま返ってきます。
なお、Display dialog を使ったときに返ってくるのはレコード型( {ラベル名:値} )でした。
<環境>
Mac OS X バージョン10.4.1 標準
(スクリプトエディタ バージョン2.1)
コメント欄でははじめまして。
リストで「Aが選択されたらカクカクを実行、Bが選択されたらシカジカを実行」
というものを作りたい(ダイアログではボタンをみっしか使えないが、
4つ以上の選択肢が欲しいため)うまくいきません。
set kotae3 to my test()
if kotae3 is "札幌" then
beep
else if kotae3 is "大阪" then
beep 2
else if kotae3 is "博多" then
beep 3
end if
on test()
set theList to {"札幌", "大阪", "博多"}
set kotae to (choose from list theList default items "博多")
return kotae
end test
勝手なお願いですが、できましたら
どうしたらいいのかご指導ください。よろしくお願いします。
(ちなみに「サブルーチン」「変数」などの意味も知らない素人です)
http://e-deep.org/iblog/C535725699/E20080108155938/index.html
ですがこのたびやりたいのは具体的には
・Aだったら inDesign の document1 を PDF に書き出せ
・Bだったら PDF を書き出した上でパッケージして、
パッケージしたフォルダを Finder でリネームしてから zip 圧縮せよ
みたいな複雑なものです。そういうのも「ハンドラ」でなんとかなるものでしょうか。
例えば、4つのリストから選択した結果を変数 kotae とし、その kotae に "を選びました" を付加した文字列 theMessage を表示するのが、次のようなコードです。
set kotae to item 1 of (choose from list {"1番目", "2番目", "3番目", "4番目"})
if kotae is "1番目" then set theMessage to "1番目" & "を選びました"
if kotae is "2番目" then set theMessage to "2番目" & "を選びました"
if kotae is "3番目" then set theMessage to "3番目" & "を選びました"
if kotae is "4番目" then set theMessage to "4番目" & "を選びました"
display dialog theMessage
なお、inDesign は所有していないし、どのような機能が実現できるか知りません。悪しからず。
まず、ハンドラとは「ひとまとまりの処理として記述し、独立させたスクリプト部分のこと」です。
ひとまとまりの処理を記述するハンドラ部は「on ハンドラ名() ~ end ハンドラ名」とし、ハンドラが
受け取るデータがあれば()内に記述します。ハンドラを実行するには、スクリプトに「my ハンドラ名()」とし、
ハンドラに渡すデータがあれば()内に記述します。
先ほどのコメントに記述したスクリプトを、ハンドラとしてまとめると、例えば次のようになります。
set theList to {"A番目", "B番目", "C番目", "D番目"}
my dispMessage(theList) --ハンドラの実行
on dispMessage(theList) --ハンドラの始まり
set kotae to item 1 of (choose from list theList)
if kotae is "A番目" then set theMessage to "A番目" & "を選びました"
if kotae is "B番目" then set theMessage to "B番目" & "を選びました"
if kotae is "C番目" then set theMessage to "C番目" & "を選びました"
if kotae is "D番目" then set theMessage to "D番目" & "を選びました"
display dialog theMessage
end dispMessage --ハンドラの終わり
ハンドラとは、仰るように「定型的な処理」をまとめて記述する手段です。
フォルダ名を変更するには、例えば次のようなスクリプトを使います。
tell application "Finder"
set targetFol to folder "original" of desktop
set name of targetFol to "renamed"
end tell
上のコメントの流れで、"renamed" という名前のフォルダをzip圧縮するために、リンク先のコードを修正して以下のようなスクリプトを書いてみました。
--set aFol to choose folder
tell application "Finder"
set aFol to folder "renamed" of desktop
end tell
compressFolderByZip(aFol) of me
on compressFolderByZip(aFolder)
tell application "Finder"
set aFolName to name of aFolder
end tell
set ptd to (path to desktop folder from user domain) as text
set source to quoted form of POSIX path of (ptd & aFolName) -- a folder
set dest to quoted form of POSIX path of (ptd & aFolName & ".zip")
do shell script "ditto -ck " & source & " " & dest
end compressFolderByZip
なお、エラー対策をしていませんので、決め打ちしたフォルダが存在しない場合などにはエラーが発生します。
set kotae to item 1 of (choose from list {"A番目", "B番目", "C番目", "D番目"})
if kotae is "A番目" then
set theMessage to "A番目" & "を選びました"
end if
if kotae is "B番目" then
tell application "Finder"
set targetFol to folder "original" of desktop
set name of targetFol to "renamed"
--end tell
--tell application "Finder"
set aFol to folder "renamed" of desktop
end tell
compressFolderByZip(aFol) of me
end if
if kotae is "C番目" then
set theMessage to "C番目" & "を選びました"
end if
if kotae is "D番目" then
set theMessage to "D番目" & "を選びました"
end if
on compressFolderByZip(aFolder)
tell application "Finder"
set aFolName to name of aFolder
end tell
set ptd to (path to desktop folder from user domain) as text
set source to quoted form of POSIX path of (ptd & aFolName) -- a folder
set dest to quoted form of POSIX path of (ptd & aFolName & ".zip")
do shell script "ditto -ck " & source & " " & dest
end compressFolderByZip
AppleScript でアプリケーションの機能を使うには、そのアプリケーションに tell (命令)します。
例えば、Safari で今見ているサイトの URL を クリップボードへコピーするには、例えば、下記のようなスクリプトを書きます。
tell application "Safari"
set the clipboard to (URL of document 1) as text
end tell
inDesign の機能を使うには、inDesign に tell命令することになります。
AppleScript からコントロールできるアプリケーションの機能を確認するには、AppleScriptエディタを立ち上げて、メニューバーの「ファイル」ー「用語説明を開く…」ー確認したいアプリケーションを選択、というのが一助になりますが、簡単な説明しかないので、ウェブで検索など詳細はまた確認することになりそうですね。
何度も読んだのですが、残念ながらすべて理解してからお返事するには
何週間もかかりそうなので、ゼロから改めて説明します。
まず、フォルダ名の変更の仕方、zip圧縮の仕方、inDesign への命令の書き方などを
お尋ねしたつもりはないのです。紛らわしい書き方で申し訳ありません、
やりたかった(あるいは可能かどうか知りたかった)のは
「2つの、定型的では 【ない】 作業を、ハンドラで実行させる」ことです。
ではまず、テストのためにふたつの無関係な tell ブロックを用意します。
[A]
tell application "Finder"
set visible of every process whose visible is true and name is not "Finder" to false
close every window
end tell
[B]
tell application "Safari"
activate
end tell
なんでもいいのですが、仮にこうします。
さて、
A、Bふたつの選択肢を表示し、
Aが選択されたら上記 [A] を、
Bが選択されたら上記 [B] を実行させることが、
"display dialog" を使えば、僕にもできます。が、
最大3択というバカバカしい(としか僕には思えない)制限があります。
同じことが "choose from list" でも可能でしょうか。
もしこれができれば、4択以上のいろんな(複雑な)作業を
リストから実行させることができるでしょう。たぶん。
それで、「まとめると」に挙げていただいた例を参考に、やってみました。
set kotae to item 1 of (choose from list {"A", "B"})
if kotae is "A" then
tell application "Finder"
set visible of every process whose visible is true and name is not "Finder" to false
close every window
end tell
end if
if kotae is "B" then
tell application "Safari"
activate
end tell
end if
見事に動きました。感謝感激です。
前のじゃ何故ダメで今度のとどこが違ったのか、後でゆっくり見直してみます。
ありがとうございました。
そこでもうひとつ新たな、小さな疑問が生まれたのですが、この場合
「else if kotae is "B" then」と
「if kotae is "B" then」は、同じでしょうか。
つまり、else はあってもなくてもどっちでもいいのでしょうか。
命令文
end honyalala
・・・というのをハンドラと呼ぶのだとしたら、
上記のヤツはハンドラは使ってないのですね。
いま気付きました。
当初、私がnobioさんの質問へコメントしようとしたのは、1つめ(「・・・悪しからず」まで)のコメントだけでした。
普段は台風でも来ないと毎日ブログをチェックすることはないのですが、今回は時間があったため、要らぬものかもしれないと思いながらも、また答えがすぐ手元あるいはすぐに手が届くところにあったものばかりでしたので、参考になればとの思いで付け足したものです。だから気にしないでください。関係ないと感じた部分については返信不要です。
さて、「else if kotae is "B" then」と「if kotae is "B" then」が同じかどうかという、今回のご質問ですが、私の理解では、以下のような動作の違いがあります。一問一答でnobioさんの解決への近道になるかどうか分かりませんが、今回は、質問へのダイレクトな返信と簡単な解説ということにします。
コメント末尾の質問について、、、
nobioさんの上記スクリプトが「else」なしの場合:
ABCDの4つからなるリストから1つを選ぶ
↓
その結果(List形式)にある1つ目のitemを変数kotaeに代入する
↓
もし、kotae が "A" なら、Finderに命じて、カクカクの処理を行なう。違ったら何もしない。
↓
もし、kotae が "B" なら、Safariに命じて、シカジカの処理を行なう。違ったら何もしない。
nobioさんの上記スクリプトが「else」ありの場合:
ABCDの4つからなるリストから1つを選ぶ
↓
その結果(List形式)にある1つ目のitemを変数kotaeに代入する
↓
もし、kotae が "A" なら、Finderに命じて、カクカクの処理を行なう。
あるいはもし、kotae が "B" なら、Safariに命じて、シカジカの処理を行なう。
それ以外の場合は、何もしない。
動作としては、「elseなし」の場合は、if条件ひとつ毎に判定して処理し、次のif条件に流れてゆくのに対して、「elseあり」の場合は、条件がAならカクカク、Bならシカジカ、それ以外なら何もしないという3つの条件/動作をまとめて処理するという、微妙な違いがあります。違いを感じない場合はどちらでもいいと思いますが、困ったときにはこのことを思い出して対処するのが良いかと思います。
ここは参考用ですが、
> やりたかった(あるいは可能かどうか知りたかった)のは
> 「2つの、定型的では 【ない】 作業を、ハンドラで実行させる」ことです。
「定型的では【ない】」作業はハンドラどころかスクリプトにさえできないというのが、私の理解ですが、
ハンドラとは、nobioさんが最初に仰ったように「定型的な処理」をまとめて記述する手段ですので、全体的には「定型的では【ない】」のであっても、「定型的な部分」についてはハンドラとしてまとめることができます。ハンドラというのは、他の表現ではサブルーチンとか、関数などと表現します。一定のまとまった処理を行なうものです。以上、参考まで。
さて、条件によって処理方法を分けるのであれば、今回のように、条件式を使って処理を分岐させるということになります。入力を"choose from list" に頼れば、4つ以上でも選択肢を提示できますし、"display dialog" でも、入れ子状に、条件式の中に条件式を入れると同様の機能が実現できます。
いちばん驚いたのは「ハンドラ」と「サブルーチン」が同じものだと知ったことです。
そ、そうだったのか・・・
>定型的でない作業はスクリプトにできない
なるほど。たしかにそうですね。
相互に独立(無関係)の処理、と言うべきでした。
それと「フォルダ名の変更」も大層勉強になりました。
「set name of selection to doc_name」で何故かうまくいかないので、現在
set the clipboard to doc_name
select folder "honyalala" of desktop
delay 0.03
tell application "System Events" to key code 76 --return
delay 0.03
tell application "System Events" to key code 9 using {command down} --ペースト
delay 0.03
tell application "System Events" to key code 76 --return
というかなりバカバカしいスクリプトを使っているのですが、
(バカバカしいけど面白いので気に入ってはいるのですが)
おかげさまで、たぶん改善できそうです。
こんなのはどうでしょうか
set doc_name to "newName"
tell application "Finder"
set tmp to selection
set name of item 1 of tmp to doc_name
end tell
set name of selection to doc_name
ではダメで
set tmp to selection
set name of item 1 of tmp to doc_name
なら動く、という判断は、どうすれば身に付くのですか。
身に付けるのは無理でも、どうやって調べるのでしょうか。
例えば、下記のように。
set theString to "funya" --"funya"(文字列)
set theInteger to 10 --10(整数値)
set theList to {"honya"} --{"honya"}(リスト)
AppleScriptエディタを使っている場合は、メニューバーの「表示」-「結果」クリックすることで確認できます。
なお、リストから値を取出すには、前述の item ~ of を使います。
例えば、item 2 of {"1", "2"} では "2" が返ってきます。
ただ、完動品のサンプルを、もっとも手軽に手に入れるには適切な検索語を設定して google検索することです。例えば、「AppleScript ファイル名を変更する」など。