1read 100read
2013年05月新・mac281: AppleScript アップルスクリプト 質問、発表 5 (607) TOP カテ一覧 スレ一覧 2ch元 削除依頼
【iPhoneアプリ】 cocos2dスレ 【iOSアプリ】 (377)
PeerCast for Mac Part2 (744)
iOSアプリ 個人開発者の雑談スレ12 (490)
Macのテキストエディタ総合 Part12 (750)
iCalスレ 2 (240)
PeerCast for Mac Part2 (744)

AppleScript アップルスクリプト 質問、発表 5


1 :2012/02/27 〜 最終レス :2013/04/27
質問、発表どっちでもスレ。
■注意
安直なスクリプト作成依頼、丸投げ、「こういうの作ってください!」はお断り。
わからない点、エラーが解決できない点についてはスクリプト片を添えて質問すること。
OSバージョンも忘れずに。
■参考
AppleScript ヘルプ
http://docs.info.apple.com/help/guide.html?path=AppleScript/2.1/jp/
発表まとめ (過去ログなども)
http://members.at.infoseek.co.jp/obto/script/script.html ※消失?
MacWiki - AppleScript
http://macwiki.sourceforge.jp/wiki/index.php/AppleScript
AppleScript PARK
http://www.tonbi.jp/AppleScript/
AppleScript Lab.
http://www.drycarbon.com/applescript/
TN2065: do shell script
http://developer.apple.com/jp/technotes/tn2065.html ※消失?
http://developer.apple.com/technotes/tn2002/tn2065.html
AppleScript: The Language of Automation
http://www.macosxautomation.com/applescript/
AS Hole(AppleScriptの穴)
http://piyocast.com/as/
■過去スレ
1 http://pc11.2ch.net/test/read.cgi/mac/1174045850/
2 http://pc11.2ch.net/test/read.cgi/mac/1197443062/
3 http://pc11.2ch.net/test/read.cgi/mac/1223026902/
4 http://anago.2ch.net/test/read.cgi/mac/1256127156/

2 :
1 Oats

3 :
1乙
さっそく今日どうしてもできなかったのでだれかヒントをくれるとありがたいのですが。
フォルダを参照するときにPOSIX形式のパスがtextで与えられたとき、それから
普通のalias参照に戻して変数に格納するにはどうすればいいんでしょ?
applescript studioでの話です。ファイルなら 〜 as POSIX fileとかだと思うけど、
フォルダの場合はどうすれば? POSIX path of 〜 として変数に格納しようとしても
エラーが出るなどしてだめのような、、、、、、。

4 :
1おつ
POSIX file thePOSIXPATH
file だけど thePOSIXPATH の指すのがディレクトリでも大丈夫
POSIX path of ...
はPOSIXパスへ
POSIX file ...
はaliasへ
なんじゃそらっw

5 :
>>4
なんか俺、ものすごく基本的なことで間違ってる?
tell application "Finder"
set a to "/User/xxxx/Desktop/"
set POSIX file a
open a
end tell
とすると開けないし、そもそもイベントログ見ても get POSIX file〜でエラー出てる。
POSIX fileの文字列は同様にして
tell application "Finder"
set a to selection as alias
set a to POSIX path of a
end tell
で得た文字列なので間違いないと思うんだけど、、、、、、。

6 :
間違えました。
tell application "Finder"
set a to "/User/xxxx/Desktop/"
set a to POSIX file a ←この行
open a
end tel
でした。l

7 :
もひとつ。
よくわからないのだけど、フォルダ参照が入った変数をuser defaults で
プロパティリストに書き出すと、
/User/xxxx/Desktop
というように最後の/が記録されてない。サンプルコードとか見ても
そのままdo script shell的なことをするにはOKみたいだけど、applescriptエディタの
出す結果とplistに書かれている形が違うのは気味が悪いんだけど。正しくは
最後に/が入るんだと思うけど、なんでそうなってないんでしょう???

8 :
すみません。この件で悩みすぎてカゼをこじらせているので寝ます。ズビ。

9 :
>>5,6
なんかFinderが余計なことをしている
POSIX file ... を tell application "Finder" の外(前)に置けばよろしい
>>7
そういうもんじゃないの
ディレクトリを示すのに最後の'/'が必要というわけじゃなく、また、最後に'/'が付いていないのはいくらでもあるので

10 :
set a to POSIX file a
を tell application "FInder" 内のままで
tell me to set a to POSIX file a
としてもおけ
他にもっとカッコいい書き方あるかな??

11 :
set a to a as POSIX file

12 :
それはカッコいいっ!ぐぬぬっw

13 :
fileキーワードの解釈が衝突してるんだろうね。my付けてglobalな定義優先すれば良い。
homeのパスも直書きせずこんな感じで。
tell application "Finder"
set homePath to POSIX path of (home as alias)
set aPath to homePath & "Desktop/"
open my POSIX file aPath
end tell

14 :
いろいろ勉強になります。こちらのことを参考に本日もこじらせて参ります。
とかいいつつ、プロパティリストに登録するときにPOSIX形式でなく、aliasを
テキスト形式で保存することで、回避しちゃったけど、試してみます。
テキスト形式から復元するときは日本語注意だけど。うちだけかな?

15 :
>>13
それはそれでカッコいいねえ。他でも使えるしぃ
一つ賢くなれた気がする。どうもっす

16 :
昔 POSIX file ... でエラーになるものが ... as POSIX file で上手く動いたのでそれ以来後者の書き方を使うようにしていたけど、
>>13が理由だったのかな
>>7
StandardAdditions の POSIX file クラスの属性である POSIX path は何故か末尾にスラッシュが付くね
一方で System Events の disk item クラスの属性としても POSIX path が存在しているのだけど、こちらは末尾にスラッシュが付かない
スラッシュは区切りであって、フォルダやディレクトリそのものを意味する訳じゃ無いので、本来は要らないものだと思う
ちなみに前者はテキストに対しても実行できる様になってるので、
実際には存在しないパスでも変換できるという利点があったりはする
>>14
コロン区切り式でテキスト保存すると、同名ボリュームが複数ある場合なんかに問題が無い事も無い
とはいえまぁレアケースだとは思う

17 :
on awake from nib theObject
tell theObject to register drag types {"file names"}
end awake from nib
on drop theObject drag info dragInfo
set dataTypes to types of pasteboard of dragInfo
if "file names" is in dataTypes then
set preferred type of pasteboard of dragInfo to "file names"
set theFiles to contents of pasteboard of dragInfo
set theFiles to POSIX file theFiles
tell application "Finder"
set theFiles to theFiles as alias
duplicate theFiles to desktop
end tell
end if
return true
end drop
あーもうわからん。テーブルやBoxにドラッグアンドドロップしたら
そのオブジェクトをデスクトップにコピーするスクリプトを初歩の初歩
としてサンプルスクリプトを参考にいじっているのだが、うまくいかんorz
上の例でなんとかコピーはされるのだが、なぜかたった数十字のテキスト
ファイルでも20秒くらい時間がかかる。明らかにおかしい。でも
どこが悪いかわからない。duplicateもtell "Finder"しなくてもいいような
気がするけど、こうじゃないとエラーを吐く。なんで???

18 :
Drag and Drop及びAppleScriptの処理(tell application) はアプリケーション間通信(AppleEvent)を通じで行なわれている
Finderはアプリケーション間通信は1度には1つしか行なわない
FinderからそのAppleScriptアプリへ通信中(on drop を抜けるまで)に、そのAppleScriptアプリからFinderと通信(tell application "FInder")を行なおうとするので、Drag and Dropの通信中なので止まる
Drag and Dropの通信が時間切れになって、やっとこさduplicateが行なわれる
てとこかなあ
on drop で tell application "Finder" せずに、property に対象をセットし、on idle でそれをチェックして tell application "Finder" するとスムースに行くよ(1秒間隔のチェックなのでちょっと間があるけど)
AppleScriptで遅延ハンドラ呼び出しってなんかあったかなあ

19 :
あと、
set theFiles to POSIX file theFiles
って、地道に1個ずつ処理しなければなさげだけど?
こんなんできんのかっ!と思ったけど、複数ドロップだとエラるようだけど

20 :
StandardAdditions のライブラリより
> POSIX file n : A file object specified with a POSIX (slash)-style pathname
そりゃそうだろうね
あとdupulicateはFinderのcommandだから当然tellってないと無理

21 :
非常にキケンなコードができましたw ほかへの影響はまったく考慮なしw
これ、実装してみようかなw 10ファイルくらいなら問題なさそうw
on awake from nib theObject
tell theObject to register drag types {"file names"}
end awake from nib
on drop theObject drag info dragInfo
set dataTypes to types of pasteboard of dragInfo
ignoring application responses  ←危険な香り
if "file names" is in dataTypes then
set preferred type of pasteboard of dragInfo to "file names"
set theFiles to contents of pasteboard of dragInfo
set FileList to {}  ←適当に複数ファイルも対応してみました
repeat with aFile in theFiles
set aFile to POSIX file aFile
set end of FileList to aFile
end repeat
tell application "Finder"
duplicate FileList to desktop
end tell
end if
end ignoring
return true
end drop
>>20
duplicateはFinderのコマンドというのはなんとなく分かるのですが、
自分が作ったアプリの用語辞書にはduplicateが載ってる。
それってつまり、もともとのテンプレートがduplicateに対応している
のかな、と。

22 :
Finderに、じゃこれらコピっておいてってメモ置いてって、あとは知らんふりってだけなので、それでもいいんじゃないの
Finderでduplicateに失敗しても特になにするわけでもないから ;)

23 :
ちなみに、AppleEvent(をFinder)は一度には一つだけ処理しないけど、キューはあるから、どこどこメモ置いていっても構わないよ
例えば
repeat with theItem in FileList
duplicate theItem to desktop
end repeat
でも構わない(まあ、あんまりキューに貯めるのはよくないし、これだと、エフェクト音が煩いしw)
なので特にそれだけでは危険というわけでもなく、単にエラー処理ができないってだけだね

24 :
全部
ignoring application responses
するから怖い訳で、tell "Finder"のとこだけignoreすりゃいいかな。
それでも動く模様。これならファイルコピーの部分だけケアすりゃいいから、
大事にはいたらない。うんこれでいこう。ハンドラとハンドラのFinder上の
処理がぶつかってエラーというのはよくあるけど、こんなこともあるんですね。
ありがとうございました〜♪

25 :
>>21
確かにduplicateは載ってるね
だけど比べてみると多少内容は違うみたい
FinderのStandard Suite
>duplicate v : Duplicate one or more object(s)
>duplicate specifier : the object(s) to duplicate
>[to location specifier] : the new location for the object(s)
>[replacing boolean] : Specifies whether or not to replace items in the destination that have the same name as items being duplicated
>[routing suppressed boolean] : Specifies whether or not to autoroute items (default is false). Only applies when copying to the system folder.
>[exact copy boolean] : Specifies whether or not to copy permissions/ownership as is
>→ specifier : to the duplicated object(s)
Finder以外のStandard Suite
>duplicate v : Copy object(s) and put the copies at a new location.
>duplicate specifier : the object for the command
>[to location specifier] : The location for the new object(s).
>[with properties record] : Properties to be set in the new duplicated object(s).
objectをコピーする点は変わりないのだけど、じゃあobject=fileとかの定義があんのかってーと、
自作アプリには無いんじゃね
ちなみにSystem Eventsは後者でしかもfileやらfolderの定義もあるのでじゃあduplicateで複製出来るのか?と思ったら出来ないし
その辺の理屈はよくわからん

26 :
ちょっと環境がないから分かりませんし、スレ違いかもしれませんが、ここで質問。
OS10.5でXcode3を使ってapplescriptでプログラミングしています。
OS10.4をターゲット?にしてコンパイルして10.5と10.4でプログラムを
動かしていました。しかし、10.5のほうは快調に動いていますが、
10.4でよく分からないのですが、特定の条件でエラーを吐きます。
Finder can't get Unknown objectとかなんとか。
実際にはDVDなどのメディアをFinder上から取得する動作で
詰まっているようです。
tell application "Finder"
set DiskDVD to selection as alias
end tell
というようなことをしているのですが、いろんな種類のメディアで
エラーになったりならなかったりします。考えたことは
続きます。

27 :
・特定のメディア(DVDならDVD、MOならMOなど)に起因するのでは
→多種類にわたりエラーが出る。
・マックのデータをウインドウズで焼くなどしてリソースフォーク系が変になっている。
→そうなっていないであろうデータでも発生している。
・メディアのフォーマットが変
→「情報を見る」で見る限りはMacOS拡張で変わりなし。
いずれのディスクも開発環境である自分の10.5のマシンではまるで問題ないのですが、
10,4のマシンだと、たまにエラーが起きます。
自分のマシンで該当箇所をデバッグできればいいんですが、10.4のマシンにXcode3は
入れられませんし、自分のマシンでは快適に動きます。
素人サンデープログラマーなので正直これ、どーすんの? って感じです。
10.4をターゲットにしてコンパイルしてるんだからapplescriptだったら簡単にできることが
なんでできなくなるのか不思議でたまりません。しかも10.5ではすいすい動きます。
こういうときはやはり10.4にXcodeを入れてデバッグするしかないんでしょうか。

28 :
入れられるなら入れちゃえばいいんじゃないの?と思う一方、
エラー箇所が特定できてるなら得るものないかなとも思う
10.5のリリースノート漁るのもいいんじゃないの?とも思うし
applescript-studioやapplescript-usersのML漁るのもいいんじゃないの?とも思う

29 :
>>26,27
AppleScriptはFinderにAppleEvent送ってるだけだよ。
問題があるとしたら原因はFinderの方。
データがキャッシュされてないと上手く取れなかったりとかFinderはバギーだった
記憶あるから、おまじないに一回update呼んでみるとか。

30 :
Finderにイベント投げてるだけならASSでないとダメってわけじゃないんだから、
必ずしもXcodeが必要とは限らんだろう
まずはスクリプトエディタで試せばいいんじゃね

31 :
今頃遅レスで申し訳ないが、
>>29
updateなんつーコマンドあるんですね。今度ちょっと試してみます。
>>30
それがスクリプトエディタで試すと問題は起きないのにXcodeで組んだものだと
該当部分でエラーがでているような気がします。
しかし、こんなに便利な言語なのにXcodeで切り捨てなんてさびしい限り。
Automatorに合流しろってことだとは思うけど、どうにもあれは好きになれませんorz

32 :
でも、Cocoa-AppleScriptの方がなんでもできちゃんだよね。慣れればより簡単に
慣れるまでが大変だと思うけど
Automator はあれはあまり使えないw

33 :
もうプログラム自体もおぼつかない初心者も初心者なんだけど、あらためてAppleScriptってなんでも
できるんだね。うちの会社にも100台くらいはMacありそうだけど、ぜんぜん使われてないよorz
AS使えば、まだまだ省力化、効率化できるなあ、と思った。でも、それを俺がやったって出世するわけ
でもないし、新しいものを導入したらトラブルは必然だし、楽になったらクビ切られる人は怒るだろうしねw
ところで、ASとXcodeを使って、それなりのアプリを作ったんだが、次は何を学べばいいんだろう?
Objective-Cの本とかは買ってきて読み始めようか、というところなんだけど、今まで作ってきたコード資産
をうまく活用したり、うまくASと連携させたり。どういう風にバランスをとればいいか分からないんだけど。
どなたか勉強の指針を教えてください。

34 :
なんか周りの見えないバカが湧いてる?

35 :
>>31
tell application "アプリの名前かパス"
...
end tell
てな感じで囲んでやれば、Xcodeなしでもテスト出来るよ
イベント呼ばれる部分は無理だけど
Automatorはあんま関係無いよ
切られたAppleScript Studioの代わりはAppleScript Obj-Cであって、
どちらもAppleScriptには違いない

36 :
>>35
そうだよね、時代はAppleScript Obj-Cだよ、と思ったら手持ちのOSが10.5だったでござる、の巻

37 :
Mail.appで受信ボックスの未読メールを全て選択して.txtに書き出したいのですが、
「未読メールを全て選択」という所がどうやればいいのか分かりません。
check for new mail for account "accountname"
keystroke "1" using {command down}
こんな感じに、メールを受信して受信ボックスを開いたところまではできたのですが、未読メールを全て選択するにはどうすればいいでしょうか?
.txtで書きだすのは、
System Eventを使って
pick menu bar 1's menu bar item "ファイル"'s menu "ファイル"'s menu item "別名で保存..."
delay 1
keystroke "UnreadMail"
keystroke return
こんな感じに書きました。

38 :
tell application "Mail"
set MessageList to (every message of mailbox "INBOX" of account accountname whose read status is false)
set theText to ""
repeat with theMessage in MessageList
set theText to theText & content of theMessage
end repeat
end tell
みたいな感じで

39 :
>>38
ありがとうございます。完璧です。

40 :
Skypeでapplescriptの設定する方法教えてくれるかたいませんか?
ID co-ca-co-la.jp

41 :
美人集め ※ワールド非対応
set BIJIN to "bijin"
display dialog "エリアは" default answer "jp"
set AREA to text returned of result
display dialog "開始時間は" default answer "0000"
set STARTTIME to text -4 thru -1 of ("0000" & text returned of result)
display dialog "終了時間は" default answer "2359"
set ENDTIME to text -4 thru -1 of ("0000" & text returned of result)
set H to text 1 thru 2 of STARTTIME as number
set M to text -2 thru -1 of STARTTIME as number
tell application "Finder"
set picFolder to folder "Pictures" of home
set bijFolder to folder BIJIN of picFolder
if not (exists bijFolder) then make new folder with properties {name:BIJIN} at defFolder
if not (exists folder AREA of bijFolder) then make new folder with properties {name:AREA} at bijFolder
end tell
repeat
set HH to text -2 thru -1 of ("0" & (H as text))
set MM to text -2 thru -1 of ("0" & (M as text))
set CURRENTTIME to HH & MM
do shell script "curl -o ~/Pictures/" & BIJIN & "/" & AREA & "/" & CURRENTTIME & ".jpg -e http://bijint.com/jp/ http://www.bijint.com/" & AREA & "/tokei_images/" & CURRENTTIME & ".jpg"
if CURRENTTIME = ENDTIME then exit repeat
set M to (M + 1) mod 60
if M = 0 then set H to (H + 1) mod 24
end repeat
自分の環境だと1日分で10分ちょい

42 :
すいません、全く畑違いの職種なんで、的を得てないかもしれませんが質問お願いします
PDFファイルやJPGファイルが200〜300くらいあって、その情報をエクセルで管理しているのですが
Finderの「情報を見る」で表示される「詳細情報」をAppleScriptから取得する事は可能でしょうか
名前や一般情報の種類やサイズはitemのpropertiesで取れるのですが…

43 :
>>42
そこの情報はSpotlightが集めたメタデータを表示してるから、mdls使えば
得られるよ。shellからでも良いし、do shell script "mdls うんたら"みたいに
AppleScriptからも得られる。
Terminalでmdlsいじってみると勘所はつかめると思う。

44 :
>>43
遅ればせながら情報ありがとうございます
全くの初心者の為、「do shell script "mdls うんたら」など少々ハードルが高くて焦りましたが、
何とか希望の詳細情報を取得できました。
でもこのこの返り値ってレコードじゃなくて文字列なんですね…

あとはAutomatorと繋げて最終的にはテキストに書き出して〜などと妄想は膨らましながらも
なかなかスキルが追いつかなく、もどかしい限りですが、少しずつ習熟していきたいと思います

ありがとうございました

45 :
どなたか御知恵を
info forで得られるファイル情報のlong versionのみを参照したいのですが方法がわかりません。
作成、保存バージョン別に分岐させ、開くアプリケーションを選びたいのです

46 :
long version of (get info for ~ )

47 :
>>46
set X to long version of (get info for Y)
set Z to (X) as text
で文字列にまでできました。
ありがとー

48 :
10.6.8で見直してみたが()で括ってさえいればgetも要らなかったな
long version of (info for ~ )
てゆーかハナから文字列なんだけど、
変数に代入した上で更に文字列化する必要なんか無くない?

49 :
>>48
質問前の勘違いを引きずってました。お恥ずかしい。
getは10.5.8でも不要でした。
連休明けに10.4.11でも検証してみます。

50 :
携帯から送られたメールがmail.appで文字化けするので
mail.appのルールを使ってテキストエンコーディングを任意のものに変更したいと思いますが
AppleScriptはどのようなのを使えばいいのでしょうか?
どなたか教えていただけませんか?

51 :
最近は例題スクリプト付属してない?
/Applications/AppleScript/Example Scripts/Mail Scripts/Rule Actions 下
同じものになるけど /Library/Scripts/Mail Scripts/Rule Actions 下

52 :
>>51
レスどうも。
なんだか難しそうですね。
スクリプトに出てくる用語をぐぐって勉強してみようと思います。
ありがとうございました。

53 :
あーここのところ冬眠してたけど、また復活しようかな。
つってもやりたいことは大体できるようになった。
すばらしきかなAppleScriptさまさま。

54 :
すみません、ググっても試行錯誤しても解決出来ないので質問失礼します。
やりたい事は非常に単純で、画面の操作ロックを掛けさせたいのです。
(WindowsでいうWin+Lに近い動作を、デスクトップ上に置いておきたい)
ググると、要はScreenSaverEngine.app叩けば良いですよと言われて
tellなりdo shell scriptなりが出てくるのですが、この方法でやると
ScreenSaverEngine.appが起動している最中(AppleScript起動直後とか)にマウスイベントが発生すると
正しくスクリーンセーバーが起動せず、正しく終了もせず、そのまま操作不能になってしまいます。
OSはLionです。
Lion特有の問題なのかもしれませんが、Terminalから呼ぼうがFinderから直で呼ぼうが同じ状態になるので
ScreenSaverEngineを叩くという方法そのものを変えないといけないかなと思いつつも、代替方法が見つからず。。
長文申し訳ありませんが、どなたか知恵をお貸しください。。。。。。。

55 :
ちなみに、ホットコーナー等から正規にスクリーンセーバー起動させた場合
起動中にマウス動かすと、起動せずそのまま終了します。
実現したいのはこの動作です。
(説明べたで申し訳ないです)

56 :
すみません、自己解決しました。
「スクリーンをロック」でもスクリーンセーバー起動するみたいなので
これで問題なく動いてくれました。
スレ汚しすみません(寝ます)
ttp://memogaki.soudesune.net/AppleScript.html

57 :
えらい

58 :
javascriptでsafariから取得した値をapplescriptに渡すことってできないんでしょうか。

59 :
AppleScriptからdo JavaScriptでJavaScriptを実行するとか?

60 :
どうもありがとうございます。すみません自己解決しました。

61 :
>>60
だからすべてとは言わんがほかの人がわかる程度に結果を書けよ。いや書いてください。

62 :
ものすごく基本的なことなんだけどなにやらわからないので教えてくれ。
Xcodeでインターフェイスつけてデータを加工するのだが、毎回毎回繰り返す。
そのとき、前の変数の値を引きずらないように初期化的な処理をするんだが、
どうするのがいいのかよくわからない。
普通の文字列とかなら
set a to ""
とかすればいいと思うんだけど、ファイルやフォルダなんかを保持する変数の場合
上と同様でいいんでしょうか? 上と同じことをすると変数の型が変わってしまうような。
それから、defaultつーかplistつーかにレコードって保持できるんでしょうか?
いまいちどうすればいいかわからない。
どなたかご回答を。

63 :
>>62
AppleScript の変数に型は無いよ。型を持っているのは値。 a に何入れても、そのときに入れた値の型がその変数の型
Cocoa-AppleScript なの?
レコードってのは
{ name:"Name", address:"Address", realname:"Real Name" }
のようなこと?

64 :
テキストファイルの文字コードを変更するAppleScriptってどんなコードになるのかな?

65 :
>>64
どんな離隔ションを求めているのか?w
てか、まずはググれカス。

66 :
do shell scriptでiconv使っとけば

67 :
>>62
>set a to ""
初期化を明示したいなら
set a to null
>それから、defaultつーかplistつーかにレコードって保持できるんでしょうか?
http://www.latenightsw.com/freeware/PListTools/index.html

68 :
>>67
nullでいいんだ。なんか気持ち悪くて避けてました。
ありがとうございます。

69 :
あるクラスのオブジェクトを指定するときにindexを使って以下のようなことができますが、
tell application "iTunes"
set aSong to track index 1 of current playlist
逆にある曲の参照番号を知りたいときはどのようにすればいいのでしょうか?
具体的には、以下のようなことがしたいです。
set aTrackNo to |aSongの番号|
set bTrackNo to |aTrackIDを加工|
play track index bTrackNo of current playlist
id of aSong は必ずしも表示順と一致しないので使えませんでした。
またiTunesでは、再生中のものとは異なるプレイリストを表示した状態だとpause中のnext trackが動作しないというバグ?があるようですが、GUIスクリプティング以外にこれをworkaroundする方法はあるでしょうか。
idを使う方法だとシャッフル時はうまくいきません。
長文になってしまいましたがご回答お待ちしております。

70 :
ちょっとやってみた
tell application "iTunes"
set theID to id of track 1 of current playlist
end tell
--ある曲が持つ固有の"ID"をtheIDに入れておく
tell application "iTunes"
set theList to id of tracks of current playlist
repeat with i from 1 to count of theList
if item i of theList is equal to theID then exit repeat
end repeat
i
end tell
--current playlistに含まれる曲のIDのリストを作り、そのリストの中でtheIDの位置を調べる
current playlistの並び順は、その時のiTunesでの表示順になっているようです。

71 :
>>69
>またiTunesでは、再生中のものとは異なるプレイリストを表示した状態
iTunes自体がそういうものだからじゃないの。普通に使っていても
current playlist に対してだから、current playlist にするために、play してすぐ pause するとか
tell application "iTunes"
set thePlaylist to playlist "Any playlist of any song"

try
if thePlaylist is not current playlist then
play thePlaylist
pause
end if
on error
play thePlaylist
pause
end try
next track
end tell
try - on error は current playlist が現在存在していない(iTunes起動直後とか)場合のお

72 :
ありがとうございます。
>>70
なるほど、こんなやり方ができるとは。懸案が解決しました。
ところで、より一般的に、あるオブジェクトがindex 何番で指定できるかを調べる命令は存在するのでしょうか?
命令 second_item for item in aList
-->2
のような感じで。
今回教えていただいた方法を元にハンドラを定義すれば実現できそうではありますが、標準でそういった命令があるのであれば。
>>71
申し訳ありません、言葉が足りませんでした。
通常iTunes起動後 1.曲をplay 2.pause 3.ほかのプレイリストをクリックして表示 するとウィンドウ上部がリンゴマークに戻り停止状態になりますが、1-3-2の順では結果が異なります。
この後(current playlistは変化していません)に次の曲へ移動したいのです。
たとえば、曲を再生中に別プレイリストをブラウジングしながらpause→フェードアウト処理→next track→playといった流れです。
どうもこれは仕様のようなので、現状思いつく策といえばnext track→pauseを連続で行うことくらいでしょうか……。

73 :
>>72
current playlist が現在見ている/表示している playlist ではないが、その current playlist 内での次の曲ってこと?
play
next track
(必要ならすぐpause)
よくわからないけど、play とすぐに pause を組み合わせればどうにでもなりそうだけど

74 :
>>69
曲を取得した時のプレイリストとインデックスを求めるプレイリストが同じなら
index of aSong
で取得できそうだけど

75 :
>>73
そうそう、そうなんです。
すぐpauseだとたまに一瞬再生されてしまうのが気になって……。
仕方ないのかもしれませんね。
なんでこんなことをやっているかというと、曲送り時にフェードアウトを伴うような再生用スクリプトを自作して使っているのですが、音量ゼロに→pause→next track→playと処理しているためです。

76 :
>>74
うわ、本当ですね! いままで
index of aSong of current playlist
とよけいなof current playlistを附けていたためエラーが出てできませんでした。
こういう見落としはやっぱり人に訊くとすぐにわかりますね。
ありがとうございます。

77 :
ぬるぽ

78 :
>>64
AS内部では基本的にUTF-16BEだったかな
ファイルからread/writeする場合はas Unicode textでUTF-16BE、
as <<class utf8>>でUTF-8、何も付けなきゃShiftJIS
do shell script内ではUTF-8からiconvで好きな形に
>>68
missing valueってのもあるよ

79 :
>>77
say "がっ" using "Kyoko"

80 :
15組の値のペアがあり、その片方がさまざなま条件で決まる。
そのときのもう一方の値を変数に設定したい。
たとえば{AAA,あああ}でAAAが決まったときに変数にあああを
設定する、みたいな。

けっこう悩むのですが、みなさまならどうされます?
レコード使えば簡単かと思ったけど、意外にスマートでなかった。
ペアのリスト内容は固定の15組です。

81 :
ひとつずつif文連ねるのはちょっと避けたいです。

82 :
条件をメソッドにしたスクリプトオブジェクトを条件の数だけ作って、
配列に突っ込んで、ループすれば?
スマートかどうか知らんけど。

83 :
スマートではないんだけど
set xxx to "AAA"
set theVal to "{AAA:¥"あああ¥", BBB:¥"いいい¥", CCC:¥"ううう¥"}"
set theScript to "get " & xxx & " of " & theVal as string
run script theScript
set yyy to result

84 :
AとBという対のリストならAのリストで一致した時のアイテム番号でBのリストの要素を指定するとか。

85 :
>>80
-- 対応する値を同じ順番で二つの変数へ入れる
set listA to {"a", "b", "c"}
set listB to {"あ", "い", "う"}
set theVal to "b" -- これが決まった値とする
set theNum to offset in (listA as text) of theVal
set theResult to item theNum of listB
return theResult
スクリプト書いてから84と一緒だということに気付いた
まあ、せっかくなので晒しとく

86 :
>>83
いや、それが俺はいちばんスマートだと思うんだけど、なぜかできない。
getとかas stringが決め手かな、、、、、と思ったけどtell application Finder内でやってるからかも。
というか、レコードは文字列としてsetせなあかんのかな? theScriptに設定するときにas stringするのと
なにが違うのか、、、、、。
とても勉強になりました。あとで試してみます。
で結局、いまのところ15個のレコードのリスト作ってrepeatで照合してる。
別のところでは>>85も使ってる。>>82は意味がわかりません。もうちょっとヒントを。
15個くらいじゃ速度なんてどれも変わらないかな?

87 :
83はバックスラッシュが円記号置き換えられているみたいだけど、ちゃんとバックスラッシュに直してる?

88 :
あ、コピペしたときに化けた…
¥は¥に直して
>>86
getやas string部分はなくてもたぶん動くよ。
レコードのキーはソースコードでしか指定できないので
キー部分を変数にしてソースコードとなる文字列を作成。
それをスクリプトとして実行。
なので2行目のレコード部分はただの文字列。

89 :
バックスラッシュ出せないんだ…

90 :
2chはShiftJISだからな
どうしでも区別したければ実体参照で

91 :
¥

92 :
>>83の変形版というかrecordを実体で持つ場合
set theKey to "AAA"
set theRecord to {AAA:"あああ", BBB:"いいい", CCC:"ううう"}
run script "on run {theRecord}
|" & theKey & "| of theRecord
end run" with parameters {theRecord}
recordの持ち方が違うだけなので速度的には同等
パイプは念の為に書いてるけどこの例なら無くても動きます

93 :
もいっちょ
殆ど一緒だけどちょっとだけ速い気がする
set theKey to "AAA"
set theRecord to {AAA:"あああ", BBB:"いいい", CCC:"ううう"}
keyOfRecord(theRecord) of (run script "on keyOfRecord(theRecord)
|" & theKey & "| of theRecord
end keyOfRecord
it")
とまぁ書いておいてなんだけど…
recordを使う方法は分量は短くなるけど、初見では何をやってるのか解り辛いかもね
2つのlistを使う方が内容的にはシンプル
でもって速度的な面でも結局listの方が速いんじゃないかなという気が;
いずれにしてもミリ秒以下の話だけども

94 :
もうレコードのキーを取り出すのはあきらめるというのはどうだろう。
set theRec to {{label1:"AAA",Label2:"あああ"},{label1:"BBB",Label2:"いいい"},{label1:"CCC",Label2:"ううう"}}
set theKey to "AAA"
repeat with i in theRec
if label1 of i = theKey then set theResult to label2 of i
end repeat
速度が早いかどうかは知りません。
ところでどなたかご存知なら。
フォルダtheFolderの中にあるファイルを取得する命令
set allFiles to every file of theFolder
これとほぼ同じことをevery file ofを使わずに実現するにはどうすればいいんでしょう。
do script shell cat POSIX path of theFolder←すんません。知識がなく適当です。
とか
call method 〜
とかそんな方法で。なぜか分からないのですが、特定のネットワーク上のフォルダについて
every file of を使うとなぜか固まり、まったく原因がつかめないため、違う方法を
試してみたいのです。どなたかヒントを。

95 :
処理時間測定してみた。マシンは2GHz Core i7
素直なループ処理使う方が30倍速い。
(1) 0.65秒
set xxx to "CCC"
set theVal to "{AAA:¥"あああ¥", BBB:¥"いいい¥", CCC:¥"ううう¥"}"
repeat 1000 times
set theScript to "get " & xxx & " of " & theVal as string
run script theScript
set yyy to result
end repeat
(2) 0.022秒
on getIndex(aItem, aList)
set idx to 0
repeat with x in aList
set idx to idx + 1
if (contents of x is aItem) then return idx
end repeat
return 0
end getIndex
set listA to {"AAA", "BBB", "CCC"}
set listB to {"あああ", "いいい", "ううう"}
repeat 1000 times
set yyy to item getIndex("CCC", listA) of listB
end repeat

96 :
>>94
set theFiles to do shell script "cd " & quoted form of POSIX path of theFolder & " && /bin/ls -1 | while read item; do [ -f ¥"$item¥" ] && echo ¥"$item¥";done;exit 0"
set saveDelimitters to text item delimiters of AppleScript
set text item delimiters of AppleScript to return
set theFiles to text items of theFiles
set text item delimiters of AppleScript to saveDelimitters
¥ はバックスラッシュ

97 :
|はパイプではないと云々
それはそうとAppleScriptはもっと機能拡張してくれないかなあ
特にリスト系をね

98 :
>>97
おお、パイプは仕組みの名前であって、記号としては単に縦線でいいのか
素で知らなかったわ…お恥ずかしい限り

99 :
>>96
なんとか分かる部分だけ使って残りはapplescriptで書いて、get every file of 〜を置き換え、
同様にget name of 〜も
do shell script "ruby -e \"puts File::basename(" & (POSIX path of theFolder)'s quoted form & ")\""
にすべて置き換えてみたところ、2分15秒かかっていた処理が、1分15秒になりました。
考えて見たら、get every file of とかしたあともいろいろファイル操作しているのですが、
それもUNIXのコマンドのオプションで対応できそう置き換えてみる予定です。
とても勉強になりました。ありがとうございます。

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼
【iPhoneアプリ】 cocos2dスレ 【iOSアプリ】 (377)
AppleWorks 6 使ってる?4 (815)
iPad miniの画質を見て一言、Retinaはいらんかった (341)
MacでOpenOffice.org part3 (478)
[SDK]iPhoneアプリ開発初心者質問箱33[touch][iPad] (611)
[SLC] SSD Part10 [MLC] (580)
--log9.info------------------
【アマゾン】amazon.co.jp 書籍板総合スレ【part30】 (651)
橋本治★3 (484)
■■■新聞連載小説■■■Part15 (336)
歴史・時代小説ファン集まれ その7 (563)
【京都の渋沈】大垣書店 4【炎上マーケティング中】 (215)
20歳若く見える医師 南雲吉則 (346)
日本の書店の衰退を食い止めるのはもう無理なのか? (867)
【人類滅亡】五島勉2【ノストラダムス】 (505)
【amazonレビュー】醜い嫉妬レビュー【1つ星】 (518)
極悪人 後藤芳徳(後藤よしのり) 追及スレ 4 (805)
【ものぐさ】岸田秀【精神分析】 (299)
大阪の図書館 3 (469)
『ふしぎなキリスト教』論争 (421)
【早大】早稲田の古書店【高田馬場】 (232)
★こうなったら読書マラソンしません? ★第八戦目 (261)
村上春樹って不細工なのにナルシストだよな 2 (372)
--log55.com------------------
虹ヶ咲暗黒時代の思い出
ニジガク3大カプは「しずかす」「りなあい」
Aqoursのことを叩いてる人々って
フェスのμ'sメドレーで確信したけどさ
ゆみ先生「μ'sの前でも泣いた事はない」「Aqoursはどこに出しても恥ずかしくない」
1月30日発表の新プロジェクト予想スレ
かすみんの中の人はブスにしちゃダメだったよな
畑亜貴ラブライブ!曲三大フレーズ「涙は青春のダイヤモンド」「いいよいいよ何度だって青春!」