「ほっ」と。キャンペーン
カテゴリ:├バカスクリプト( 15 )
|
キーボードとカーソルをAppleScriptで自動運転(RAWを別名で保存)
c0070938_10305147.png

写真をRAWデータで受け取ることが時々ある。というか本当はJPEGなのにPhotoshopがどこかのメタデータを読んでRAWだと誤認するっぽい。これを開いて必要な加工(リサイズとかキリヌキとか)を施すまではいいが、それを別名で保存するのがメンドくさい。まずこういう↓ウィンドウが出る。もしかすると通常は出ないのかも知れないが、ウチで使ってる「解像度変更して保存して閉じる」アクションを使うと、こういうウィンドウが出る。
c0070938_10305578.png
これを「IMGP3961_.jpg」という名前で保存したい。必要な手順はこうだ。

1)キーボードの右矢印キーを押してファイル名の選択を解除しカーソルを点滅させる。
2)deleteキーを5回連打して「 のコピー」を消し、代わりにアンダーバーを入力。
3)カーソルを「フォーマット」のところに移動してクリック。
c0070938_1031285.png
4)プルダウンメニューから「JPEG」を選択し、リターン。
c0070938_1031781.png
5)「JPEGオプション」で「12」を入力してリターン。
c0070938_10312035.png
6)最後に command + D を押して「保存しない」。おしまい。

キーボードだけでもマウスだけでも完結せず、両方必要なところがイヤだ。1枚や2枚ならなんてことないけど、この作業を何十回も繰り返すのはつらい。そこでAppleScriptだ。以下のAppleScriptにQuicksilverでキーボードショートカットを割り当てて実行すると、以上の作業が2秒で終わる。よりチューニングを施せば1秒でも可能だと思う。しかしありがたいのは2秒で終わることではなく、その間集中したり考えたり迷ったり判断したりということが一切不要になることだ。

ただしカーソルをAppleScriptで操作するには、Macに「cliclick」というものをインストールしておく必要がある。興味を持たれた方はザリガニさんのところでcliclickについて学んでください。ちなみに画面上の座標を得るには command + shift + 4 を押す。「右矢印のkey codeは124」というようなことは「Key Codes」で調べる。

◉後記:なんでPhotoshopのアクションでやらねーのよ、というツッコミをいただいた。いや、やろうとしたんですよ。でもどうしてもできなかった。そのうちに、もしかしてこのウィンドウいつも決まった位置に出るんじゃないか、だとしたら AppleScript と cliclick でイケるじゃん、と気付いたわけです。これはアクションで試行錯誤してた時とは全く違うアプローチなので、その頭で改めて考えると、アクションでできるのかも。

●サンプルスクリプト
delay 0.3 --0.3秒待て
tell application "System Events"
key code 124 --右矢印キーを押せ
delay 0.02
key code 51 --delete
delay 0.02
key code 51 --delete
delay 0.02
key code 51 --delete
delay 0.02
key code 51 --delete
delay 0.02
key code 51 --delete
delay 0.02
key code 102 --一応英数キーを押してから
key code 94 --アンダーバー
end tell
delay 0.1 --必要かどうかわからんけど習慣的に挟む

do shell script "cliclick -w 50 960 540 960 650"
--座標「960 540」と「960 650」を、50ms(0.05秒)開けて連続クリック
delay 0.1
tell application "System Events"
key code 36 --リターン
end tell

--ウィンドウ名『JPEG オプション』
--「画質」が選択状態にあるので「12」を入力
tell application "System Events"
keystroke "12"
delay 0.1
keystroke return
delay 1
keystroke "d" using command down
end tell
do shell script "afplay /System/Library/Sounds/Purr.aiff"
●このサンプルスクリプトの使い方

1行目の「delay 0.3」は何故必要かというと、これをQuicksilverで例えば「command + option + S」に割り当てた場合、「delay 0.3」がないと、押した瞬間に「command + option + S + 右矢印」を押したことになってしまい、誤動作するから。だから0.3秒以内に指を離す必要がある。
[PR]
by nobiox | 2014-02-19 10:35 | ├バカスクリプト | Comments(0) |
AppleScript で音を鳴らす
Mac OS 9 までは、「起動項目」や「終了項目」にサウンドファイルを入れておけば、それだけで音を鳴らしてくれた。OS X では、ログイン項目にサウンドファイルを指定しても、例えば iTunes が起動してしまう。起動して鳴らしてくれるならそれでもいいが、時間をかけて起動した挙句にウィンドウを開くだけで、鳴らすには三角ボタンをクリックする必要があったりとか、いろいろ面倒な仕様になった。

と、思っていた。しかしそれは、無知ゆえのストレスだったのかもしれない。

◆◆

Mac OS X で、Finder で「command +G」を押すと「フォルダへ移動」というダイアログが出てくる(OS X 10.7.5)。
そこに「/System/Library/Sounds/」と入れてリターンキーを押すと、「/System/Library/Sounds/」フォルダが表示される(いきなり「/」で書き出すと、それは「ルートディレクトリ」を意味する)。

「/System/Library/Sounds/」にはデフォルトで、いろんな AIFF ファイルが入っている。これがいわゆる「システムサウンド」だ。どれかひとつを選択してスペ−スキーを押せば、クイックルックで音が聞ける。ここに入ってるサウンドは、システム環境設定の「サウンド」→「サウンドエフェクト」で、警告音として表示される。つまりここにエッチなお姉さんの声を入れておくと、エッチなMacにすることも可能、ということだ。

AppleScript で、この中の好きな音を鳴らすことができる。例えば以下の1行を AppleScript エディタにコピペして実行ボタンを押せば、「Purr.aiff」が鳴る。「afplay」というのが「ユニックスコマンド」であるらしい。まあ、そう言われても何のことかはわからないが、我々バカスクリプターにとっては、使えさえすれば、わからなくてもいいのである。
do shell script "afplay /System/Library/Sounds/Purr.aiff"

別にシステムサウンドである必要はない。例えば自分のホームフォルダ(家のアイコンが付いたフォルダ)に「sound」というフォルダを作り、そこにファイル「OE-new-mail.aiff」を置いてみる。これを鳴らすAppleScriptは
do shell script "afplay ~/sound/OE-new-mail.aiff"
だ。「~/」がホームを意味する。ただし実験の結果、いくつかの制限がある模様。

・「~/sound/OE-new-mail.aiff」みたいなヤツを、ファイルの「パス」と呼ぶ。
 経路という意味。まあ「住所」です。パスの中に半角スペースがあるとダメ。
 例えばファイル名が「OE new mail.aiff」だとエラーになる。
 フォルダ名が「 Sound」とかもダメ。
・いくつかと書いたけど、今のところ確認できたのはそれだけか。
 半角ハイフンと半角アンダーバーはオッケー。
 意外なことに日本語は、全角スペースも含めてオッケー。
・AIFF 以外の、例えば MP3 とかでもいけるのかどうか、未検証。

●サンプルスクリプトの使い方

Objective-Cでコマンドの中身を作るまで - ザリガニが見ていた...。
徹底的にソフトウェアで豊かな音を奏でてみよう - ザリガニが見ていた...。
[PR]
by nobiox | 2014-02-05 21:23 | ├バカスクリプト | Comments(0) |
「a.indd」を閉じて「xxxa.indd」にリネームせよ
仕事してると、どうしても同じ名前の InDesign ファイルが複数できる。直しが出た場合などに、間違ったファイルで作業して矛盾が出たりする。割と頻繁にある。この問題に対する定石対処があるのかも知れないが、いろんな作業手順を検討した結果、「一度パッケージしたら二度と元ファイルは開かない」「そのために一度パッケージした元ファイルは強制的にファイル名を変える」ことにした。すでに「デスクトップにPDFとパッケージフォルダを書き出してパッケージフォルダをZIP圧縮する」作業は AppleScript で自動化してるので、「(InDesignで「a.indd」というファイルを開いているときに)『a.indd』を閉じて『xxxa.indd』にリネームせよ」というスクリプトができれば、それに合体させられるはずだ。

とりあえず準備体操として、「『a.indd』を閉じて Finder でラベルの色を着けよ」という AppleScript に挑戦してみよう。
--test 1
tell application "Adobe InDesign CS4"
save document 1
set doc_name to (name of document 1) as Unicode text
close document 1
end tell
tell application "Finder"
set label index of file doc_name of window 1 to 3
end tell
おお、機能するぞ。「a.indd」が「Finder window 1」にあるとは限らないという、けっこう重大な問題はあるけれど。

この書き方だとここまではあっさりできたみたいだが、実際はこの解に辿り着くのに1時間以上はかかった。また、こんな風に書くとまるで僕がAppleScriptの基本を理解してるように思われるかも知れないが、それも誤解だ。例えば「name of document 1」を何故カッコで挟む必要があるのか、その後ろに付いてる「as Unicode text」とはどういうことなのか、さっぱりわからないまま、継ぎはぎのコピペを繰り返しては試行錯誤の果てに、結果として機能したらオッケー、という、そんな感じ。まあ、逆に言うと、「save document 1」ぐらいはわかって書いてる。「document 1」は「最前面の書類」という意味。ちなみに Finder の最前面のウィンドウは「window 1」。

ちなみに数字とラベルの関係は、うどん県で働く Web ディレクターさんによると以下の通り。

0 ラベルなし
1 オレンジ
2 レッド
3 イエロー
4 ブルー
5 パープル
6 グリーン
7 グレイ

次はリネームだ。
--test 2
tell application "Adobe InDesign CS4"
save document 1
set doc_name to (name of document 1) as Unicode text
close document 1
end tell
tell application "Finder"
set xxxdoc_name to "xxx" and doc_name
set name of file doc_name of window 1 to xxxdoc_name
end tell
ダメだ。「error "xxx" のタイプを boolean に変換できません」とか言われる。

以下のスクリプトをアプリケーション形式で保存すると「ドロップレット」ができ、リネームは成功する。何故だ。Finder に命じるなら「as string」、InDesignに命じるなら「as Unicode text」ということだろうか。
--test 3
on open ObjList
tell application "Finder"
repeat with obj in ObjList
set aName to name of obj
set name of obj to ("xxx" & (name of obj) as string)
set _Name to name of obj
end repeat
end tell
end open

以下のスクリプトはエラーになる。
--test 4
tell application "Finder"
set aName to name of selection
set name of selection to ("xxx" & (name of obj) as string)
end tell

「osx finder リネーム AppleScript」でググった結果、MacWiki - AppleScriptTipsというありがたやなページを発見。
--test 5
tell application "Finder"
set addStr to "xxx"
try
set FinderSelection to selection as alias list
on error
set FinderSelection to selection
end try
repeat with aFile in FinderSelection
set oldName to name of aFile
set newName to addStr & oldName
set name of aFile to newName
end repeat
end tell
おお、意味はわからんけど機能した。いけるかも。

--test 6
tell application "Adobe InDesign CS4"
save document 1
set doc_name to (name of document 1) as Unicode text
close document 1
end tell
tell application "Finder"
set addStr to "xxx"
select file doc_name of window 1
try
set FinderSelection to selection as alias list
on error
set FinderSelection to selection
end try
repeat with aFile in FinderSelection
set oldName to name of aFile
set newName to addStr & oldName
set name of aFile to newName
end repeat
end tell
できた。すごいじゃんオレ。今週も街の巨匠に感謝。動作は遅いけど、かまわない。

「set FinderSelection to selection as alias list」というのはなんのことだろう。
「alias list」ってナニ?

という疑問はともかくだ、「そのファイルのあるウィンドウが Finder において最前面でない場合」に対応しなくてはならない。「InDesign に document 1 のパスを取得させてフォルダ名を取り出し・・・」てなことができればいいんだろうけど、残念ながら僕の脳味噌にそこまでの能力はないので、片っ端から総当たりでやるしかない。

--test 2-B
tell application "Adobe InDesign CS4"
save document 1
set doc_name to (name of document 1) as Unicode text
close document 1
end tell
tell application "Finder"
try
select file doc_name of window 1
on error
select window 2
select file doc_name of window 1
end try
set label index of file doc_name of window 1 to 5
end tell
機能する。

--test 2-C
tell application "Adobe InDesign CS4"
save document 1
set doc_name to (name of document 1) as Unicode text
close document 1
end tell
tell application "Finder"
try
select file doc_name of window 1
on error
select window 2
select file doc_name of window 1
on error
select window 3
select file doc_name of window 1
end try
set label index of file doc_name of window 1 to 2
end tell
機能しない。というか構文エラーで保存できない。

tell application "Finder"
 try
  window 1 のファイル「A.indd」を選択せよ
 on error
  window 2 を選択せよ(これで window 2 が window 1 になる)
  window 1 のファイル「A.indd」を選択せよ
 on error
  window 3 を選択せよ(これで window 3 が window 1 になる)
  window 1 のファイル「A.indd」を選択せよ
 end try
end tell
というのは、間違った構文らしい。そうなのか。どうすりゃいいのさ。

try
 Aを実行せよ
on error
  try
    Bを実行せよ
  on error
    try
      Cを実行せよ
    end try
  end try
end try
というマトリョーシカ構造にしなきゃダメってことか。そっか。
いやそれよりも「if exists file ホニャララ of window 1 then」みたいなので行けるのか。行けそうな気もするな。

tell application "Finder"
if exists file "001.jpg" of window 1 then
open file "001.jpg" of window 1
end if
end tell
機能する。window 1 に「001.jpg」が存在しないときは、エラーを吐かず、ただ何もしない。

tell application "Finder"
if exists file "79bb4618.jpg" of window 1 then
open file "79bb4618.jpg" of window 1
select window 1
else if exists file "79bb4618.jpg" of window 2 then
open file "79bb4618.jpg" of window 2
select window 2
else if exists file "79bb4618.jpg" of window 3 then
open file "79bb4618.jpg" of window 3
select window 3
else if exists file "79bb4618.jpg" of window 4 then
open file "79bb4618.jpg" of window 4
select window 4
else if exists file "79bb4618.jpg" of window 5 then
open file "79bb4618.jpg" of window 5
select window 5
else if exists file "79bb4618.jpg" of window 6 then
open file "79bb4618.jpg" of window 6
select window 6
else if exists file "79bb4618.jpg" of window 7 then
open file "79bb4618.jpg" of window 7
select window 7
else if exists file "79bb4618.jpg" of window 8 then
open file "79bb4618.jpg" of window 8
select window 8
else if exists file "79bb4618.jpg" of window 9 then
open file "79bb4618.jpg" of window 9
select window 9
else if exists file "79bb4618.jpg" of window 10 then
open file "79bb4618.jpg" of window 10
select window 9
else if not (exists file "79bb4618.jpg" of window 10) then
display dialog "ファイルが見つかりません" with icon caution
end if
end tell
やった。機能する。これを「test6」と合体させればいいんだな。

tell application "Finder"
set addStr to "xxx"
if exists file doc_name of window 1 then
select window 1
select file doc_name of window 1

else if exists file doc_name of window 2 then
select window 2
select file doc_name of window 1

else if exists file doc_name of window 3 then
select window 3
select file doc_name of window 1

else if exists file doc_name of window 4 then
select window 4
select file doc_name of window 1

else if exists file doc_name of window 5 then
select window 5
select file doc_name of window 1

else if exists file doc_name of window 6 then
select window 6
select file doc_name of window 1

else if exists file doc_name of window 7 then
select window 7
select file doc_name of window 1

else if exists file doc_name of window 8 then
select window 8
select file doc_name of window 1

else if exists file doc_name of window 9 then
select window 9
select file doc_name of window 1

else if exists file doc_name of window 10 then
select window 10
select file doc_name of window 1

else if not (exists file doc_name of window 10) then
display dialog "ファイルが見つかりません" with icon caution
end if
end tell
こう書き変えて、この「◉」部分に
try
set FinderSelection to selection as alias list
on error
set FinderSelection to selection
end try
repeat with aFile in FinderSelection
set oldName to name of aFile
set newName to addStr & oldName
set name of aFile to newName
end repeat
を入れればいいわけだ。

tell application "Adobe InDesign CS4"
save document 1
set doc_name to (name of document 1) as Unicode text
close document 1
end tell

tell application "Finder"
set addStr to "xxx"
if exists file doc_name of window 1 then
select window 1
select file doc_name of window 1
try
set FinderSelection to selection as alias list
on error
set FinderSelection to selection
end try
repeat with aFile in FinderSelection
set oldName to name of aFile
set newName to addStr & oldName
set name of aFile to newName
end repeat
else if exists file doc_name of window 2 then
select window 2
select file doc_name of window 1
try
set FinderSelection to selection as alias list
on error
set FinderSelection to selection
end try
repeat with aFile in FinderSelection
set oldName to name of aFile
set newName to addStr & oldName
set name of aFile to newName
end repeat
else if exists file doc_name of window 3 then
select window 3
select file doc_name of window 1
try
set FinderSelection to selection as alias list
on error
set FinderSelection to selection
end try
repeat with aFile in FinderSelection
set oldName to name of aFile
set newName to addStr & oldName
set name of aFile to newName
end repeat
else if exists file doc_name of window 4 then
select window 4
select file doc_name of window 1
try
set FinderSelection to selection as alias list
on error
set FinderSelection to selection
end try
repeat with aFile in FinderSelection
set oldName to name of aFile
set newName to addStr & oldName
set name of aFile to newName
end repeat
else if exists file doc_name of window 5 then
select window 5
select file doc_name of window 1
try
set FinderSelection to selection as alias list
on error
set FinderSelection to selection
end try
repeat with aFile in FinderSelection
set oldName to name of aFile
set newName to addStr & oldName
set name of aFile to newName
end repeat
else if exists file doc_name of window 6 then
select window 6
select file doc_name of window 1
try
set FinderSelection to selection as alias list
on error
set FinderSelection to selection
end try
repeat with aFile in FinderSelection
set oldName to name of aFile
set newName to addStr & oldName
set name of aFile to newName
end repeat
else if exists file doc_name of window 7 then
select window 7
select file doc_name of window 1
try
set FinderSelection to selection as alias list
on error
set FinderSelection to selection
end try
repeat with aFile in FinderSelection
set oldName to name of aFile
set newName to addStr & oldName
set name of aFile to newName
end repeat
else if exists file doc_name of window 8 then
select window 8
select file doc_name of window 1
try
set FinderSelection to selection as alias list
on error
set FinderSelection to selection
end try
repeat with aFile in FinderSelection
set oldName to name of aFile
set newName to addStr & oldName
set name of aFile to newName
end repeat
else if exists file doc_name of window 9 then
select window 9
select file doc_name of window 1
try
set FinderSelection to selection as alias list
on error
set FinderSelection to selection
end try
repeat with aFile in FinderSelection
set oldName to name of aFile
set newName to addStr & oldName
set name of aFile to newName
end repeat
else if exists file doc_name of window 10 then
select window 10
select file doc_name of window 1
try
set FinderSelection to selection as alias list
on error
set FinderSelection to selection
end try
repeat with aFile in FinderSelection
set oldName to name of aFile
set newName to addStr & oldName
set name of aFile to newName
end repeat
else if not (exists file doc_name of window 10) then
display dialog "ファイルが見つかりません" with icon caution
end if
end tell
できた。
[PR]
by nobiox | 2014-01-28 19:49 | ├バカスクリプト | Comments(0) |
InDesignで「基準点アイコン」を選択する
InDesignで画面上のオブジェクトを選択して拡大・縮小するときの基準点は、コントロールパネル左端の「田の字状アイコン」の、9つあるポイントのどれが選択されているかによって決まる。変更するには他のポイントをクリックする。この田の字アイコンを選択状態にすると、いちいち田の字にカーソルを持っていかなくとも、テンキーで変更できるらしい。今日「GORI.NET: Indesignで基準点をテンキーを使って変更する」という記事で知った。やってみたらたしかにできた。楽しい。

しかしながら田の字アイコンを選択状態にするには、画面上のオブジェクトを選択した状態で「command + 6」を押して「x 座標」の欄を選択し、そこから「shift + tab」で左に移動する。これ以外の手段はないらしい。なんというふざけた仕様だろうか。「command + 6 → shift + tab。DTPのプロならそのくらいコンマ2秒で押せるっしょ?」とでも考えているのだろうか。まあ実際コンマ2秒で押せる人もいるのだろうが、押せないオレが来ましたよ。

できた。

●サンプルスクリプト
tell application "System Events" to key code 22 using {command down}
tell application "System Events" to key code 48 using {shift down}

●サンプルスクリプトの使い方

日本語に読み下すと、1行目は「command 押しっぱで6を押せ」、2行目は「shift 押しっぱで tab を押せ」。ただし、このスクリプトに Quicksilver でキーボードショートカットを割り当てることには、まだ成功していない。何故か。キーボードショートカットを例えば「command + @」にした場合、2行目で「command + shift + tab(+@)」を押してることになってしまい、結果として InDesign そっちのけで「アプリケーション切り替え」が発動するのだ。対策としては「command キーから指を素早く離す」のと「delay」の組み合わせ、あるいは command 以外の装飾キーを使うことが考えられるが、まだ試行錯誤中。

●後記
装飾キーなしで「pagedown」というキー単独に割り当てたら、うちの環境では機能しました。さすが Quicksilver、いつもながら天晴な図々しさです。「pagedown」はテンキーの隣なので、便利。
[PR]
by nobiox | 2013-02-26 13:02 | ├バカスクリプト | Comments(0) |
ダイアログとリスト@OS X 10.7
display dialog でダイアログボックスにボタンを表示させて条件分岐するにはこんなふうに書く。
display dialog "処理を選択してください。" buttons {"キャンセル", "[A]", "[B]"} default button 3
set ANS to result

if button returned of ANS is "[A]" then
--命令A
else if button returned of ANS is "[B]" then
--命令B
else if button returned of ANS is "キャンセル" then
return
end if

具体的には例えばこう。
--tell application "Quicksilver" to activate
--Quicksilver でこのスクリプトを使う場合は ↑ この行が必要みたい。理由は知らない。
display dialog "may I help you ?" buttons {"キャンセル", "Safari", "Clean Up"} with icon 2 default button 3
--icon には「icon 0」「icon 1」「icon 2」が使える。
--icon 0 は「icon stop」、1 は「caution」、2 は「note」と書ける。
set ANS to result

if button returned of ANS is "Clean Up" 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

else if button returned of ANS is "Safari" then
tell application "Safari"
activate
end tell

else if button returned of ANS is "キャンセル" then
return
end if

c0070938_9303120.png
実行したところ。


アイコンについては(も、他のもろもろについても)ザリガニさんの display dialogとdisplay alertの違い という記事が詳しい。わずか1年前の記事だけど、ボタンのカタチが違うんですねえ。
ただ、何故かボタンは3つ以内という制限がある。ひとつはキャンセルに当てたいので、実質2択だ。どうしてこんな仕様なのか不思議でしょうがない。「そりゃあボタンを4つ以上表示させるのは技術的にむずかしいだろうな」という納得感が、ぜんぜんない。何故ボタンの数に制限をかけるのか。それよりは、「ボタン数は無制限だが増やし過ぎると速度が低下する」という仕様の方がよほど納得できるではないか。
 キャンセルボタンを省くことはおすすめしない。それをやるとキャンセルしたいとき、強制終了しか手がない状態になる。いや、じつはエスケープキーでキャンセルできるのだが、この「エスケープキーでキャンセル」という機能は、「キャンセル」または「cancel」という名前のボタンが存在する場合にのみ有効、という不思議仕様。意味ねー。バカじゃねーの。

ボタンAが押されたら次のダイアログを表示、Bが押されたら別のダイアログを表示、という二段階方式にすれば(そして2段目のダイアログではキャンセルボタンを省くとすれば)「2段で6択」が可能だ。しかし、2段という時点で面倒臭いんだよ。2段あると2回考えなきゃいけないの。しかもその選択肢を考えたのが自分だというのがまた腹立たしい。なんでなんだよ、と思うんですよ。ケチケチせずにボタンたくさん使わせてくれりゃあ1回で済むじゃん、なんでなんだよ、という怒りが込み上げてくるせいで、この理不尽に耐えられない。

そんな面倒臭がりやさんたちは、「choose from list」というのを使いましょう。

set instruction to item 1 of (choose from list {"A", "B", "C", "D", "E", "F", "G"} default items "A")

if instruction is "A" then
--命令A
end if
if instruction is "B" then
--命令B
end if
if instruction is "C" then
--命令C
end if
if instruction is "D" then
--命令D
end if
if instruction is "E" then
--命令E
end if
if instruction is "F" then
--命令F
end if
if instruction is "G" then
--命令G
end if

c0070938_10334.png
実行したところ。選択肢はいくつあっても可。キャンセルボタンはデフォルト装備。
デフォルトアンサーを実行するならリターンキーを叩けばいいし、それ以外の選択肢はマウスでダブルクリックすれば即刻実行される。
マウスが嫌いな人はキーボードの上下矢印キーで選択項目を上下に移動できる。
そしてリターンキーで実行。素晴らしいじゃないですか。


AppleScript について大概のことは Google 先生に聞けばなんとかなるけど、これはどうにもならなかった。何をコピペしてどう改変してどう試行錯誤しても、「リストでAを選んだら命令A、Bを選んだら命令B」というのが動作しない。いろんな人が AppleScript のリストについて書いてくれてるんだけど、僕が知りたい、いちばん単純な(いちばん単純だと僕が思う)情報がどうしても見つからない。つまりこんな需要はひどくマイナーなのかも知れない。でも今後マイナーな人が Google 先生に聞くかも知れないと思い、記事をアップします。「GameSprit」の vallie さんにご教示いただきました。お世話になりました。またお世話になる気満々ですのでよろしくお願いします。
[PR]
by nobiox | 2012-10-04 00:20 | ├バカスクリプト | Comments(0) |
新規フォルダを作る
最前面にあるファインダーウィンドウに、新規フォルダを作るAppleScript。ついでに、デフォルトでは今日の年月日がフォルダ名になるようにした。年月日時分秒にすることも可能だし、そうすればフォルダ名の重複は防げるが、無駄に長くなるのがイヤなので、年月日+2桁数字にした。同じ名前がなかったら作る、あったら「同じ名前」+「-02」・・・という原始的な方式。

「do shell script」というのはよくわからんけど「UNIX コマンド」らしい。と言われても相変わらずわからんけど、ちなみに "date +%y.%m.%d" の中の「y」を大文字に変えると、西暦が4桁になる。「crntDt」はカレント・デイト、すなわち今日の日付というつもり。賢い人はこんな独自の省略形を使わず、「current_Date」とかにするらしい。「window 1」をすべて「desktop」に置換すると、デスクトップにフォルダを作るスクリプトになる。

●サンプルスクリプト
on getCurrentDate()
-- yy-mm-dd のフォーマットで日付を取得する
do shell script "date +%y.%m.%d"
end getCurrentDate
set crntDt to my getCurrentDate()

tell application "Finder"
activate

display dialog "Type new folder name:" default answer crntDt
set aName to text returned of result
set aName01 to aName & "-01"
set aName02 to aName & "-02"
set aName03 to aName & "-03"
set aName04 to aName & "-04"
set aName05 to aName & "-05"
set aName06 to aName & "-06"
set aName07 to aName & "-07"
set aName08 to aName & "-08"
set aName09 to aName & "-09"

set aName10 to aName & "-10"
set aName11 to aName & "-11"
set aName12 to aName & "-12"
set aName13 to aName & "-13"
set aName14 to aName & "-14"
set aName15 to aName & "-15"
set aName16 to aName & "-16"
set aName17 to aName & "-17"
set aName18 to aName & "-18"
set aName19 to aName & "-19"
set aName20 to aName & "-20"

if not (exists folder aName of window 1) then
make new folder at window 1 with properties {name:aName}
open folder aName of window 1
else if not (exists folder aName02 of window 1) then
make new folder at window 1 with properties {name:aName02}
open folder aName02 of window 1
else if not (exists folder aName03 of window 1) then
make new folder at window 1 with properties {name:aName03}
open folder aName03 of window 1
else if not (exists folder aName04 of window 1) then
make new folder at window 1 with properties {name:aName04}
open folder aName04 of window 1
else if not (exists folder aName05 of window 1) then
make new folder at window 1 with properties {name:aName05}
open folder aName05 of window 1
else if not (exists folder aName06 of window 1) then
make new folder at window 1 with properties {name:aName06}
open folder aName06 of window 1
else if not (exists folder aName07 of window 1) then
make new folder at window 1 with properties {name:aName07}
open folder aName07 of window 1
else if not (exists folder aName08 of window 1) then
make new folder at window 1 with properties {name:aName08}
open folder aName08 of window 1
else if not (exists folder aName09 of window 1) then
make new folder at window 1 with properties {name:aName09}
open folder aName09 of window 1

else if not (exists folder aName10 of window 1) then
make new folder at window 1 with properties {name:aName10}
open folder aName10 of window 1
else if not (exists folder aName11 of window 1) then
make new folder at window 1 with properties {name:aName11}
open folder aName11 of window 1
else if not (exists folder aName12 of window 1) then
make new folder at window 1 with properties {name:aName12}
open folder aName12 of window 1
else if not (exists folder aName13 of window 1) then
make new folder at window 1 with properties {name:aName13}
open folder aName13 of window 1
else if not (exists folder aName14 of window 1) then
make new folder at window 1 with properties {name:aName14}
open folder aName14 of window 1
else if not (exists folder aName15 of window 1) then
make new folder at window 1 with properties {name:aName15}
open folder aName15 of window 1
else if not (exists folder aName16 of window 1) then
make new folder at window 1 with properties {name:aName16}
open folder aName16 of window 1
else if not (exists folder aName17 of window 1) then
make new folder at window 1 with properties {name:aName17}
open folder aName17 of window 1
else if not (exists folder aName18 of window 1) then
make new folder at window 1 with properties {name:aName18}
open folder aName18 of window 1
else if not (exists folder aName19 of window 1) then
make new folder at window 1 with properties {name:aName19}
open folder aName19 of window 1
else if not (exists folder aName20 of window 1) then
make new folder at window 1 with properties {name:aName20}
open folder aName20 of window 1
end if

end tell

●サンプルスクリプトの使い方
[PR]
by nobiox | 2012-07-01 17:41 | ├バカスクリプト | Comments(0) |
inDesign のウィンドウサイズを調整する
●サンプルスクリプト
tell application "Adobe InDesign CS4"
activate
tell window 1
set bounds to {68, 20, 1188, 1711}
end tell
end tell

●サンプルスクリプトの使い方
[PR]
by nobiox | 2012-07-01 17:23 | ├バカスクリプト | Comments(0) |
フォルダをリスト形式で開く
●サンプルスクリプト
(*アプリケーションフォルダをリスト形式で開き、
ツールバーを隠し、コメントでソートするAppleScript*)
tell application "Finder"
activate
try
(*「アプリケーション」ウィンドウがすでに開いている場合に備えて*)
select Finder window "アプリケーション"
set toolbar visible of Finder window 1 to false
set bounds of Finder window 1 to {40, 60, 560, 800}
set current view of Finder window 1 to list view
set visible of column id comment column of list view options of Finder window 1 to true
set visible of column id size column of list view options of Finder window 1 to false
set width of column id name column of list view options of Finder window 1 to 280
set width of column id comment column of list view options of Finder window 1 to 170
set sort column of list view options of Finder window 1 to comment column
on error
(*「アプリケーション」ウィンドウが存在しない場合*)
make new Finder window to folder "Applications" of startup disk
set toolbar visible of Finder window 1 to false
set bounds of Finder window 1 to {40, 60, 560, 800}
set current view of Finder window 1 to list view
set visible of column id comment column of list view options of Finder window 1 to true
set visible of column id size column of list view options of Finder window 1 to false
set width of column id name column of list view options of Finder window 1 to 280
set width of column id comment column of list view options of Finder window 1 to 170
set sort column of list view options of Finder window 1 to comment column
end try
end tell

●サンプルスクリプトの使い方
[PR]
by nobiox | 2012-07-01 17:17 | ├バカスクリプト | Comments(0) |
コピペで使うAppleScript

AppleScript とは何か


キニシナイ(^。^)y-. 理解してから使おうとか、使うにはまず理解しなくては、という考えには無理があります。ここに書くのは「理解せずに使う方法」です。「いろいろ使ってるうちにだんだん理解する」のをおすすめします。

AppleScript はどこにあるか


AppleScript 本体というものがどこにあるのかないのか、知らない。ただ必要なのは「AppleScript エディタ」というもの。
c0070938_17111019.png
これはなかなか名前が定まらないソフトで、かつての名前は「スクリプト編集プログラム」だったり「Script Editor」だったり「AppleScript Editor」だったりした。置き場所も、かつては「アプリケーション」>「AppleScript」フォルダの中だったりした。Mac OS X 10.6以降では「アプリケーション」>「ユーティリティ」フォルダの中にある。とにかくなんとかして「AppleScript エディタ」、あるいはそれに相当する似たような名前のアプリを発見してください。

Spotlight で探す、という手もあります。Spotlight というのはメニューバーの右はじにある虫眼鏡のこと。キーボードで control + スペースバーを押すと Spotlight が開くので、そこにapplescript と入力。実際にはたぶん「apples」のあたりで AppleScript がヒットします。

●サンプルスクリプト
(*警告音を2度鳴らすだけの無意味なスクリプト*)
beep 2

サンプルスクリプトの使い方


AppleScript エディタをダブルクリックで起動する。すると空白のウィンドウが開き、カーソルが点滅しているはずだ。
c0070938_1534529.gif

そこにサンプルスクリプトをコピペ。コピペしたらウィンドウ左上、丸ミドリに右三角の「実行」ボタンを押す。上記サンプルの場合、警告音が2度鳴ったら成功。

AppleScript の保存


成功したら、command + S で保存。保存形式は「スクリプト」「スクリプトバンドル」「アプリケーション」「テキスト」とあるが、要はスクリプトかアプリケーションかの二択です。とりあえず「スクリプト」で。「アプリケーション」は、アプリケーションでないとどうにもならん場合にだけ使う。保存画面に「オプション」とかあるけど、キニシナイ。

AppleScript の実行 - スクリプトメニューから実行


日常的に発生するルーティンワークの手間を軽減するために AppleScript を使うのであれば、スクリプトは簡単に実行できなくては意味がない。アップルはそのために「スクリプトメニュー」というものを用意している。

「スクリプト」形式で保存したスクリプトを Finder でダブルクリックすると、AppleScript エディタで開く。実行するには「実行」ボタンを押す必要がある。面倒くさい。しかしスクリプトメニューから実行すると、スクリプトの内容がダイレクトに実行される。実行速度は「アプリケーション」で保存した場合よりも微妙に速い。ような気がする。少なくとも、最前面のアプリケーションを切り替え、ドックにアイコンを表示するというタスク(?)が発生しないぶん、効率がいい。

また、「AppleScript エディタで開いて実行ボタンを押す」その瞬間、最前面のアプリケーションは言うまでもなく AppleScript エディタである。だから例えば「Safari だけを対象にしたスクリプト」の場合、1行目に「tell application "Safari"」を加えなくては機能しない。スクリプトメニューから実行すると、Safari をアクティブにしたままの状態で、ダイレクトに実行できる。

メニューバーにスクリプトメニューを表示させる手順は、面倒なことに「Mac OS X 10.3 まで」「10.4から10.5」「10.6から10.7」でそれぞれ違う。以下を参照されたし。スクリプトメニューとはどういうものかについては特にわかばマークさんの記事が詳しいので、興味ある方は熟読されたし。
Mac Tips X/スクリプトメニュー の利用(10.3から10.5)
わかばマークのMacの備忘録 : スクリプトメニューをランチャとして使う(10.4から10.5)
メニューバーにスクリプトメニューを表示する - Fonland(10.6以降)

AppleScript の実行 - その他のランチャーから実行


ランチャーとかラウンチャーとかローンチャーとかいうのはミサイル発射装置のことで、ぱそ界では、種々のアプリケーションを最小限の手間で起動させることに特化したアプリケーションのこと。 Mac OS X 用のランチャーでいちばん有名なのはシステム標準の「ドック」だが、上のわかばマークさんが書いておられる通り、スクリプトメニューもランチャーとして使えるし、他にも優れたランチャーが、有志によってたくさん作られている。

スクリプトに関して言うと、ランチャーには2種類ある。ランチャーからスクリプトを選択したときにAppleScript エディタで開くものと、エディタで開くことなく内容を実行するものだ。一概にどちらがいいとは言えないが、実行するためには当然、後者がいい(ちなみにドックは前者)。

Quicksilver(無料)
Quicksilver のメイン機能は「名前で呼び出すキーボードランチャー」だ。Quicksilver を召還して、例えば mail とタイプすると Mailが呼び出せる。そこでリターンキーを叩くと Mail がアクティブになる。インテリジェントな学習機能により、実際にはmail の「m」の時点でMailが第一候補に来るので、非常に素早く起動できる。だけど僕は「名前で呼び出す」のはあまり使わず、「ショートカットで呼び出す」機能をメインで使ってます。

Quicksilver の Preferences に Trigger というタブがあり、ここで任意のキーボードショートカットを、任意の書類、フォルダ、アプリケーション、スクリプトに割り当てることができる。少なくともタッチタイピングができない人間にとっては、「Quicksilver を召還して m と打ってMailが候補に表示されたのを目視してリターンキー」よりも「キーボードを見てF4キーを押す」方が頭も技も使わないし、はるかに単純で速い。下の画像はクリックで拡大します。
c0070938_1544028.png
アクションごとに「Scope」というオプションがあり、「Enable in selected applications(以下のアプリケーションでのみ有効)」「Disable in selected applications(以下のアプリケーションでは無効)」などの指定も可能。Quicksilver のトリガーの長所は、図々しいところ。「help]「home」「end」など、通常割り当て不可能なキーに、好きな機能を割り当てられる。ヘルプキーを乗っ取ることができるランチャーを、今のところこれ以外には知らない。OS が予約しているキーコンビネーション(例えば command + M とか)も平気で乗っ取る。メニューバーにアイコンを常駐させないところも好き。欠点はけっこう頻繁(体感としては週に2回くらい?)にクラッシュする不安定さと、開発がいつ止まるかも知れない不安さ。

クラッシュの方は起動し直せばいいだけのことなので、個人的には大した欠点とは感じてません。僕はクラッシュ時の再起動のために、Quicksilver のアイコンをドックに常駐させてます。開発が止まって使えなくなるとしたら、まあ、そのとき考えればいいでしょう。

Alfred(15ユーロ)
Alfred はたいへん評判のいい無料のキーボードランチャーで、15ユーロで「Powerpack」を購入すると機能が増えます。その増える機能の中に「Grobal Hotkeys」というのがあって、これが Quicksilver のトリガー機能に相当するらしい。アルフレッドというのは、バットマンの執事の名前。

BetterTouchTool(無料)
Preferences ウィンドウのいちばん上に「ジェスチャー」「ベーシック」とある。「ジェスチャー」>「Keyboard」と進む。右下の「Add new shortcut」を押し、「Predefined Action:」から「Open Application / File / Script...」を選択。この「Predefined Action:」ポップアップメニューがあまりにも長いので、選ぶのがいちいち面倒くさい。
アプリをキーボードから一発起動するショートカットを作成できる。そう、BetterTouchToolならね / あなたのスイッチを押すブログ

他にも「Butler」とか「LaunchBar」とか「Spark」とか「CoolFunction for X」とか「aLaunch」とかいろいろ試用したり使用したりしたことあるんですが、細かいことは何も覚えてません。自信を持って言えるのは、いま現在使ってる Quicksilver と FinderPop についてだけ。ちなみに FinderPop は、スクリプト形式で保存したスクリプトをダイレクトに実行することは、できない。ただ、ドロップレットを実行するには FinderPop は便利。ドロップレットとは何か、それはキニシナイ。

その他の基礎知識


■コメントアウト
スクリプト中に連続した半角ハイフンふたつがあると、スクリプトの実行に当たり、その行のそれ以降は無視される(コメントアウト)。コメントアウトの方法はもうひとつ、「(*」と「*)」で囲む、というのがあり、複数行まとめてコメントアウトするにはこちらが便利。10.5 以降ではさらに、「#」で始まる行もコメントとして認識される。

■継続記号
スクリプトの1行が長過ぎて読みにくいあるいは扱いづらい場合、改行箇所に継続記号「¬」を追加すれば改行できる。というか改行が無視される。いわば改行アウト。継続記号は スクリプトエディタでは、Option + Return で入力できる。
tell application "Finder" to tell the item named "Macintosh HD" to ¬
tell its item named "Bob" to set its comment to "Hello, my name is Bob!"

■パスについて
これは自分用のメモ。興味ない人が読むと「やっぱりむずかしそう」と思うだけなので、読まない方がいいです。
鳶嶋工房 / AppleScript / Introduction / ファイル指定を覚えよう
AS Hole(AppleScriptの穴) By Piyomaru Software » AppleScript中にファイルパスを記述する » Blog Archive
[PR]
by nobiox | 2012-07-01 13:27 | ├バカスクリプト | Comments(0) |
AppleScript で汎用的なパス
Applescript: Setting the User's home pathname?というページの自分用訳。


質問者:Neotyguy40
ちょいワケありで「dyndata.reg」って名前のファイルを削除する必要があって、

tell application "Finder"
set the fileToDelete to alias "Mac HD:Users:Tyler:Library:Preferences:HEAVY Preferences:dyndata.reg"
delete the fileToDelete
end tell

↑↑↑こういうAppleScriptを書いた。ユーザー名が「Tyler」だけならこれでいいんだが
オレは70台のコンピュータについてこれを実行しなきゃならない。ユーザー名も70通り
どうすりゃいいのか教えてくれ


回答1:dmmcintyre3
汎用的にホームディレクトリを指定するなら、「~/」って書くんだ

Neotyguy40
>1
やってみたけど動かない


回答2:seepel
正解は「set myPath to (path to home folder)」らしいよ
ググったら一発だったけど? 人に聞く前にググれ

Neotyguy40
>2
ググったし。それに
"Getting Home Folder in Applescript"も
"Home Directory Applescript"も
"Using Applescript to get home folder"も読んだよ
だけど動かないんだよ


回答3:mysterytramp
これでどうだ

set hoNyaLALA to (((path to preferences folder) as text) & "HEAVY Preferences:dyndata.reg") as alias
tell application "Finder"
delete hoNyaLALA
end tell

おまえ変数の前に「the」つけてるけどそれもマズいのかも。「the」不要。
あと Snow Leopard の場合、set honyalala の行は
「tell ~ end tell」ブロックの外に置くべし。アップルがそう言ってる

Neotyguy40
>3
Ahh, thanks! That works perfectly !



“Command+E”で新規Finderを開くように設定したら超便利な件について - Moxbit
[PR]
by nobiox | 2012-03-05 14:04 | ├バカスクリプト | Comments(0) |
|