GameSprit

自転車やMac・AppleScript、映画・小説やドラマのレビュー、備忘メモ・クイズなどを置いています。

AppleScript 0006 - choose from list の結果の取得

2005-06-19 23:31:11 | AppleScript
choose from list で表示した候補のうち、ユーザーがクリックし選んだものがどれかを取得します。

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)

最新の画像もっと見る

15 Comments

コメント日が  古い順  |   新しい順
AppleScriptでリスト (nobio)
2012-09-29 15:35:01
これまで何度か一方的にお世話になってるのですが、
コメント欄でははじめまして。
リストで「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

勝手なお願いですが、できましたら
どうしたらいいのかご指導ください。よろしくお願いします。
(ちなみに「サブルーチン」「変数」などの意味も知らない素人です)
返信する
ハンドラについて学びました (nobio)
2012-09-29 19:14:35
その後、定型的な処理、例えば「Finder に命じてAならアイテムAを開け、BならアイテムBを開け」というようなことは「ハンドラ」でやるのだ、ということを、このページ↓で学びました。
http://e-deep.org/iblog/C535725699/E20080108155938/index.html
ですがこのたびやりたいのは具体的には

・Aだったら inDesign の document1 を PDF に書き出せ
・Bだったら PDF を書き出した上でパッケージして、
 パッケージしたフォルダを Finder でリネームしてから zip 圧縮せよ

みたいな複雑なものです。そういうのも「ハンドラ」でなんとかなるものでしょうか。
返信する
こんばんは! (vallie)
2012-09-29 23:41:49
選択肢が3つまでなら "display dialog" が良いのですが、4つ以上の場合には、正しく"choose from list" を使います。

例えば、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 は所有していないし、どのような機能が実現できるか知りません。悪しからず。
返信する
ハンドラについて (vallie)
2012-09-29 23:42:34
ご質問に対する解決にならないのは承知ですが、誤解があるかもしれない部分についてコメントします。

まず、ハンドラとは「ひとまとまりの処理として記述し、独立させたスクリプト部分のこと」です。
ひとまとまりの処理を記述するハンドラ部は「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 --ハンドラの終わり



ハンドラとは、仰るように「定型的な処理」をまとめて記述する手段です。
返信する
フォルダ名の変更 (vallie)
2012-09-29 23:43:05
デスクトップやディスク内にあるフォルダ名やファイル名を変更するには、Finder に命令します。

フォルダ名を変更するには、例えば次のようなスクリプトを使います。


tell application "Finder"

set targetFol to folder "original" of desktop
set name of targetFol to "renamed"

end tell
返信する
フォルダのzip圧縮 (vallie)
2012-09-29 23:43:39
フォルダをzip圧縮するスクリプトですが、その機能を実現するコードが http://piyocast.com/as/archives/61 にあります。

上のコメントの流れで、"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
返信する
まとめると (vallie)
2012-09-29 23:47:59
さて、ここまでの部分を、私が理解できた範囲で、また、私が知っている範囲でまとめると、以下のようなスクリプトになります。ご参考まで。
なお、エラー対策をしていませんので、決め打ちしたフォルダが存在しない場合などにはエラーが発生します。


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 を使ってアプリケーションの機能を利用するには (vallie)
2012-09-30 11:24:42
私の思い違いかも知れません。ひょっとしたら要らぬコメントをしておきます。

AppleScript でアプリケーションの機能を使うには、そのアプリケーションに tell (命令)します。
例えば、Safari で今見ているサイトの URL を クリップボードへコピーするには、例えば、下記のようなスクリプトを書きます。


tell application "Safari"

set the clipboard to (URL of document 1) as text

end tell




inDesign の機能を使うには、inDesign に tell命令することになります。

AppleScript からコントロールできるアプリケーションの機能を確認するには、AppleScriptエディタを立ち上げて、メニューバーの「ファイル」ー「用語説明を開く…」ー確認したいアプリケーションを選択、というのが一助になりますが、簡単な説明しかないので、ウェブで検索など詳細はまた確認することになりそうですね。
返信する
ありがとうございました。 (nobio)
2012-09-30 18:37:32
望外のお返事をいただきまして恐縮です。
何度も読んだのですが、残念ながらすべて理解してからお返事するには
何週間もかかりそうなので、ゼロから改めて説明します。

まず、フォルダ名の変更の仕方、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 はあってもなくてもどっちでもいいのでしょうか。
返信する
あっ、ハンドラじゃないのか。 (nobio)
2012-09-30 18:48:34
on honyalala(変数)
命令文
end honyalala

・・・というのをハンドラと呼ぶのだとしたら、
上記のヤツはハンドラは使ってないのですね。
いま気付きました。
返信する
条件式について (vallie)
2012-09-30 23:08:32
こんばんは、nobioさん。
当初、私が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" でも、入れ子状に、条件式の中に条件式を入れると同様の機能が実現できます。
返信する
ありがとうございました。 (nobio)
2012-10-01 23:50:46
ありがとうございます。いろいろと勉強になりました。
いちばん驚いたのは「ハンドラ」と「サブルーチン」が同じものだと知ったことです。
そ、そうだったのか・・・

>定型的でない作業はスクリプトにできない

なるほど。たしかにそうですね。
相互に独立(無関係)の処理、と言うべきでした。

それと「フォルダ名の変更」も大層勉強になりました。
「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

というかなりバカバカしいスクリプトを使っているのですが、
(バカバカしいけど面白いので気に入ってはいるのですが)
おかげさまで、たぶん改善できそうです。
返信する
Finderで選択したitemの名前変更 (vallie)
2012-10-02 22:51:21
>「set name of selection to doc_name」で何故かうまくいかない

こんなのはどうでしょうか

set doc_name to "newName"

tell application "Finder"

set tmp to selection
set name of item 1 of tmp to doc_name

end tell
返信する
Finderで選択したitemの名前変更 (nobio)
2012-10-03 20:02:33
ありがとうございます。

set name of selection to doc_name
ではダメで
set tmp to selection
set name of item 1 of tmp to doc_name
なら動く、という判断は、どうすれば身に付くのですか。

身に付けるのは無理でも、どうやって調べるのでしょうか。
返信する
AppleScript の変数の型について (vallie)
2012-10-04 19:44:15
その変数の型、あるいは使ったコマンドから返ってくる型を意識することです。
例えば、下記のように。

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 ファイル名を変更する」など。
返信する

post a comment

ブログ作成者から承認されるまでコメントは反映されません。