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

・・・というのをハンドラと呼ぶのだとしたら、
上記のヤツはハンドラは使ってないのですね。
いま気付きました。
返信する

post a comment

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