最終更新日:2012/06/23
ServiceAppleScript - AppleScriptを実行するサービスメニュー項目を作るアプリケーション
AutomatorでAppleScriptを実行するサービスを作る場合に比べての利点
- AppleScriptエディタでスクリプトを編集できるのでAutomator上でスクリプトを編集するよりスクリプトの編集が楽だと思う。
- 入力がファイルの場合、サービスとドロップレットの両方の機能を持ったアプリケーションを作ることができる。
- Automatorのサービスより実行が速い(気がする)。
- 外部リソースファイルを使用するスクリプトの場合、そのファイルをアプリケーションのパッケージの中に入れることができるので、ファイルが見かけ上アプリケーション一つですむ。
- スクリプト中のpropertyが保存・更新される。
AutomatorでAppleScriptを実行するサービスを作る場合に比べての欠点
動作テスト環境
Mac OS X 10.6.8
基本ファイルダウンロード
- ServiceAppleScript1.1.zip(ファイルを対象にするサービスが「一般」ではなく「ファイルとフォルダ」に分類されるようになった。)
- ServiceAppleScript1.0.zip
- ServiceAppleScript0.9.zip
ServiceAppleScriptで作ったアプリケーションの配布について
ServiceAppleScriptで作ったアプリケーションは自由に配布することができます。許可や連絡等は必要ありません。
ここで公開しているアプリケーションを改造した物も自由に配布することができます。
ServiceAppleScript 0.9の仕様
- ServiceAppleScriptでサービスを実行(ファイル、テキスト)、ファイルを開く、URL開く、を実行するとAppleScriptを実行する。
- 実行するAppleScriptはServiceAppleScript.app/Contents/Resources/Scripts/main.scpt。アプリケーションをAppleScriptエディタにドロップすると開くことができる。
- 実行するハンドラは
on doService(theTarget, theType, theModifierKeyList)
- サービスでファイルを選択して実行、又はアプリケーションにファイルをドラッグドロップしてファイルを開く場合はtheTypeは"File"になり、theTargettheTargetはファイルのUnixパスのリストになる。フォルダのパスの最後には/が付加されています。"/Applications/"。.appなどパッケージの最後には付いていません。"/Applications/Automator.app"
- サービスでテキストを選択して実行した場合はtheTypeは"String"になり、theTargetは対象の文字列になる。
- URLを開いた場合はtheTypeは"URL"になり、theTargetはURLの文字列になる。開くことができるURLのタイプはInfo.plistのURL typesで設定する必要があります。詳しくはURLからAppleScriptを実行を見て下さい。
- theModifierKeyListは押されている修飾キーのリストになります。
キーの種類:
command shift option control fn caps
kana eisuu
mouseButtonLeft mouseButtonRight mouseButtonCenter
mouseButton4 mouseButton5 mouseButton6 mouseButton7 mouseButton8
- アプリケーションの種類が"Application is background only"なので
display alert "hoge"
など直接ダイアログの表示ができません。適当なアプリケーションにtellしてください。その他何か悪影響がありましたらInfo.plistを編集して"Application is agent (UIElement)"にしてみてください。
ServiceAppleScript 1.0の新機能
- doService()の返り値でアプリケーション終了までの時間を設定できるようになった。
return {"置換用string" , 30 }
のようになります。置換しないサービスの場合も上の形式になります。30が終了までの秒数になります。値は整数値です。
連続して呼び出す場合は毎回起動、終了するよりアプリケーションが起動しっぱなしの方が効率が良さそうなので設定できるようにしてみました。設定値もInfo.plistに書くか迷いましたがスクリプトにしてみました。レコードで名前を指定して結果を返したかったのですがわからないので簡単なリストにしてみました。
起動中はアプリケーションをダブルクリックして起動して設定の変更はできませんので注意して下さい。
使い方
概要
AppleScriptを実行するサービスメニュー呼び出し専用アプリケーションです。AppleScript毎にアプリケーションを作ります。
このアプリケーションで作ったサービスはデフォルトではオフになっているのでシステム環境設定のキーボードのキーボードショートカットのサービスでオンにする必要があります。
新しいサービスメニューの作り方
- アプリケーションをアプリケーションフォルダに入れます。サブフォルダでも大丈夫です。
- アプリケーションを複製します。
- 複製したアプリケーションをFinderでダブルクリックして実行します。
すると、ちょっとしてからサービス名設定ダイアログが表示されるので入力します。
入力するとアプリケーションの名前が入力した物に変わります。
- アプリケーションをスクリプトエディタにドラッグドロップします。
「スクリプトに対応していないので、以下略」といったダイアログが出ますが、OKを押すとスクリプトが表示されます。
これが実行するスクリプトになりますので編集、保存します。
- システム環境設定のサービスのチェックはデフォルトではオフになっているのでオンにします。
また、リストに表示されていない場合は「サービスメニュー更新.app」を実行します。
なかなか表示されない時もありますが、デスクトップに移動して戻したり、AppleScriptエディタで開いて編集したりしたあとに「サービスメニュー更新.app」を実行をすると表示されるようになると思います。
- サービスに表示されて実行できたらOKです。
- 実行しても何故かうまく動かない場合は、アプリケーションをデスクトップに移動して元の場所に戻すとうまく動くようになる場合があります。アプリケーション内部の構成を変えていますが、その変更をシステムがちゃんと認識できていない場合に起こって、前記のようにファイルを移動させるとちゃんと認識するようです。
サービス用AppleScriptをスクリプトメニューから実行する方法
「main.scptのエイリアス作成.app」にServiceAppleScript.appをドロップするとその内部あるmain.scptのエイリアスをアプリケーション名で作ります。
スクリプトメニューからも実行したい時などに。
これは検索用サービスをメニューから実行して、検索ワードを入力して検索したいと思ったので作りました。一つのスクリプトいろいろなところから実行できるのでスクリプトの管理が楽だと思います。
特殊な設定
URLからAppleScriptを実行
Info.plistでURLスキームを登録するとURLを開くとAppleScriptを実行できるようになります。
URLを開くとAppleScriptを実行できる利点としては、SafariのブックマークバーやUserScriptなどURLを開くことしかできないところからAppleScriptを実行できるようになる、というのがあります。特にUserScriptからAppleScriptを自由に実行できるようになると、SafariEverLogger.appとpixivNanikaHelper.appでやっているように、ブラウザのコンテンツとローカルのアプリケーションやデータを連携したものが手軽に作れます。
Info.plistに下記のテキストを追加します。実際のInfo.plistはSafariEverLoggerの中のInfo.plistを見て下さい。
この例の場合のURLは次のようになります。
safarieverlogger:hoge
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>safarieverlogger</string>
<key>CFBundleURLSchemes</key>
<array>
<string>safarieverlogger</string>
</array>
</dict>
</array>
下記のようなテキストをInfo.plistに追加すると特定のアプリケーションのみでメニューに表示されるようになります。
実際のInfo.plistはFlashのキャッシュファイルを保存の中のInfo.plistを見て下さい。
<key>NSRequiredContext</key>
<dict>
<key>NSApplicationIdentifier</key>
<array>
<string>org.mozilla.firefox</string>
<string>com.google.Chrome</string>
<string>com.apple.Safari</string>
</array>
</dict>
作ってみたServiceAppleScript製アプリケーション
ネット一括検索
選択したテキストを指定したサイトで検索できます。こういうものは良くありますが、複数サイトを一括して検索できるのが特徴です。例えばアマゾン、ソフマップ、楽天で買い物を良くする人はこれらのサイトの検索結果を全部タブで表示することができます。こうすることによって検索を種類ごとにまとめることができます。自分は、買い物、辞書、ソフト、開発などで分けています。ブラウザの拡張でもよくありますが、ブラウザの拡張だとブラウザでしか使えませんがサービスでやるとブラウザ以外のMail、テキストエディタなどサービスに対応しているすべてのソフトで使えるので便利だと思います。
ダウンロード
- ServiceAppleScript_Kensaku_Kaimono1.2.zip(Safari5.1で動かないのを修正)
- ServiceAppleScript_Kensaku_Kaimono1.1.zip(-から始まるテキストを選択した場合にエラーになるのを修正)
- ServiceAppleScript_Kensaku_Kaimono1.0.zip
設定変更方法
AppleScriptエディタで開いてスクリプトを表示すると上の方に設定がありますのでお好みに合わせて修正してください。
「検索:」スクリプトの機能
- 複数のサイトに対して一度に検索できる。結果は現在のウインドウにタブで表示するか新規ウインドウに表示するか設定できる。
- commandキーを押しながら実行するとwindowで表示するかtabで表示するかが逆になります
- optionキーを押しながら実行すると検索文字をダイアログで修正できます
- shiftキーを押しながら実行すると以前検索した文字をリストで表示して、選んで検索できます
- optionキーとshiftキーを押しながら実行するとリストから選んだ文字を修正できます
- 検索サイト、表示モードはスクリプトを変更して設定できますので好きなように修正して使ってください
- スクリプトをそのまま実行すると検索ワードを入力して検索できます。「main.scptのエイリアス作成.app」でスクリプトをエイリアスを簡単に作れます。
- 対応ブラウザはSafari,Firefox,Caminoです。Firefoxで使用する場合アドオンのOpenURLinClipboardをインストールする必要があります。Caminoは最近は使って無いのでいまも動くかはわかりません。
デフォルトブラウザをOpenFileHelperなどSafari、Camino、Firefox以外にしている場合にデフォルトブラウザを一括設定する
defaults write com.yourcompany.ServiceAppleScript defaultBrowser 'Firefox'
他に使ってる検索用設定
設定だけ書いておきますので興味があったら作ってみてください
- 検索:開発
-
関数の使い方等がわからない時はこれでGoogleとGoogleソースコード検索をまとめて検索しています。
property searchURLRecordList : {{URL:"http://www.google.co.jp/search?complete=1&hl=ja&source=hp&q=", URLSuffix:"&lr=&aq=f&oq=", charCode:"UTF-8"}, {URL:"http://www.google.com/codesearch?q=", URLSuffix:"&hl=ja", charCode:"UTF-8"}, {URL:"http://developer.apple.com/search.php?q=", URLSuffix:"&num=10&site=default_collection&", charCode:"UTF-8"}}
ドットファイル操作
.から始まるFinderでは通常見えないファイルを開いたり、見えるようにリネームできます。
使い方
- コンテキストメニューからサービスを実行します。
- ドットファイルと実行可能なアクションのメニューが表示されます。ちなみにホームフォルダにはドットファイル、フォルダがいっぱいありました。またフォルダを選択するとFinderで開くことができます。
- "可視ファイル名にリネーム"を選択するとファイル名の先頭に半角スペースを追加してリネームします。Finderで表示されます。削除したい場合はこれで見えるようにしてから削除してください。
- 可視ファイル名にしたファイルに対してサービスを実行すると不可視ファイル名に戻すコマンドが表示されます。
仕様
- 複数のファイルを選択してサービスを実行しても"可視ファイル名にリネーム"は一つのファイルしか処理対象になりません。
- 開くアプリケーションを変更する場合はAppleScriptエディタで開いてactionAppListを編集してください。
ダウンロード
-
ServiceAppleScript_dotFileSousa1.0.zip
翻訳
翻訳結果をGrowlで表示します。Automatorでも作りましたが自分はこっちを使っています。
ExciteとLivedoorの翻訳結果を表示します。翻訳精度はあまり高くない場合がありますが二つあると一つよりはわかりやすいのではと思い、二つ表示しています。
改造版GrowlとpureHTMLView.growlStyleとpureHTMLViewを使った通知を表示する設定が必要です。
ダウンロード
-
ServiceAppleScript_honyaku1.0.zip
weblocをurlに変換
.weblocファイルを.urlファイルに変換します。また、.urlファイルにはFinderのコメントにURLを書き込み、FinderのアイコンをURLのfaviconにします。変換が終わった.weblocファイルはゴミ箱に移動します。
コメントとアイコンを付けると下記画像のように結構見やすくなります。
ダウンロード
-
webloctourl.app.zip
Windows向けZip作成
Windowsで文字化けしないZipファイルを作成します。
Windowsで文字化けしないZipを作るアプリケーションはいくつかありますが、自分が見た物にはPerlを使っている物とRubyを使っているものがあったので、Pythonでできないか調べてみたらPythonで通常のZipファイルなら作成可能でファイル名を指定できたのでやってみました。
動作環境
自分は特にPythonの環境をいじった記憶が無いのでMac OS X 10.6で動くと思います。
10.5はPythonの環境がどうなのかわからないので動くかどうか分かりません。
使用上の注意
- Windowsで使用できない文字は全角に変換します。使用できない文字以外にも使用できないファイル名のルールがありますが、それには対処しません。参考:Windowsでファイル名に使用できない名前 - 屋根裏部屋mkII改
- ユニコードにあってshift-jisに無い文字は■に置き換えます。
- テストファイルを見ると「/」は「:」に置き換わっています。「:」と「/」はOS X内で置換されますが自分もルールが良くわかっていないので、そのままです。
- テストファイル以外にはほとんどテストはしていないので、実際に使用する場合は予めテストしてから使うことをお勧めします。特に重要なファイルはApp StoreにあるZip圧縮アプリケーション等実績のあるソフトを使うのをお勧めします。
- 「.DS_Store」と「._」から始るファイルはZipに追加しません。「.」から始るファイルも迷ったのですが追加するようにしておきました。
- Pythonではパスワード付きZipは作成できないのでパスワードは付けられません。
使い方
サービスメニューに表示されるように設定します。
ファイルを選択してサービスから実行するとzipファイルを作り、作成が終わると音声で通知とFinderで出来上がったzipファイルを選択、表示します。
GUIでのプログレスバー、通知ダイアログ等はありません。
途中でキャンセルもできないので、間違って大量のファイルが入ったフォルダを選択したりしないように。
テスト結果
- OS Xにあるテストファイル
-
- Window7のエクスプローラーで解凍したテストファイル
-
ダウンロード
-
WindowsMukeZipSakusei.app.zip
Flashのキャッシュファイルを保存
スクリプト自体はわざわざサービスで実行する意味は無いのですが、常に表示される「一般」のサービスメニュー項目をSafari,Chrome,Firefoxだけで表示されるようにしたもののテストを兼ねて作ってみました。
Flashで再生している動画のキャッシュファイルをムービーフォルダに移動します。見終わった動画をこれで保存するとキャッシュを移動するだけなので一瞬で終わるのが便利なところです。なお、Flashのキャッシュファイルはページを閉じたり、移動したら無くなるので気をつけて下さい。
機能、仕様
- サービスメニューの10.6以降の仕様を使っているので10.6以降が必要です。
- Flash バージョン 10.3.181.22で動作確認しました。ブラウザはSafari,Firefox4,Google Chromeでテストしました。
- YouTube、ニコニコ動画などFlashで再生している動画のキャッシュ(テンポラリファイル)をムービーフォルダに移動します。読み込み中に移動しても特に問題無かったのでコピーじゃなくて移動にしてあります。ページを閉じた時に移動したファイルが消えたり、ブラウザのFlashプレイヤーの方で問題が起きたりとかはありませんでした。ただ、バージョンが変わったら変わる可能性はあります。
- 保存ファイル名はブラウザのアクティブなウインドウの名前にファイルの拡張子を付けた物になります。同名のファイルがある場合は1,2...のように数字を追加します。
- 複数のキャッシュファイルがある場合はどれを移動したらいいのか分からないのでFinderでファイルを表示します。
- 移動後Finderでファイルを表示します。
- 上記仕様がいまいちな場合は、すべてAppleScriptで書いてあるので「Flashのキャッシュファイルを保存.app」をAppleScriptエディタで開いて修正することができます。
使い方
サービスメニューに表示されるように設定します。項目名は「Flashのキャッシュファイルを保存」です。
YouTubeやニコニコ動画で動画を表示中にサービスメニューから「Flashのキャッシュファイルを保存」を選択するとムービーフォルダにキャッシュファイルを移動して、Finderで表示します。
このサービスメニュー項目はSafari,Google Chrome,Firefoxでのみ表示されます。
ダウンロード
-
SaveFlashTmpFile.app.zip
Mac App StoreとiTunes Storeで検索
スクリプト的には「検索:」の簡易版でURLをブラウザで開くのではなく、openコマンドで開きます。適切なアプリケーションで直接開きます。
ダウンロード
-
Kensaku_iTunesStore_MacAppStore.zip
MediaInfoで調べた動画等の情報を表示します。
MediaInfoへのリンク
使い方
- 上記リンクからダウンロードしたCUI版MediaInfoをインストールします。
- サービスメニューに表示されるように設定します。項目名は「MediaInfoで調べた情報を表示」です。
- Finderでファイルを選んでサービスメニューから実行します。
- コマンドキーを押しながらメニューを選ぶと、情報をブラウザで表示します。情報をコピーしたい場合に。
仕様、バグ
- 調べるファイル数は初期値で最大100個までとなっています。変更するにはスクリプトをいじって下さい。
- mp3のタグなどファイルに含まれる情報の文字コードがUnicodeじゃない場合、文字化けします。
- mediainfoにフォルダを渡すとフォルダ内のファイルが調べられるのですが、このスクリプトでやると何故かできないこともあるので、全部調べないようにしておきました。間違えて、すごいいっぱいファイルが入ったフォルダを選択した場合にキャンセルできないのでそういうことにならないようにする為、ってのもあります。
ダウンロード
- MediaInfodeShirabeta0.1.2.app.zip(情報を表示するデザインを調整、その他修正)
- MediaInfodeShirabeta0.1.1.app.zip
- MediaInfodeShirabeta0.1.app.zip
選択したテキストをEvernoteの「名前がウインドウ名のノート」に追加
選択したテキストをEvernoteの「名前がウインドウ名のノート」に追加します。
追加時にEvernoteがアクティブになったり、作成したノートを表示したりしません。
例えば、掲示板の一部をクリップする時に、連続して実行するだけで、同じノートにどんどん追加していくことができます。
いちいち確認は必要無い場合、さくっとクリップしたい場合に。
使い方
- サービスメニューに表示されるように設定します。項目名は「Append Selection to Evernote」です。
- テキストを選択して実行すると選択したテキストを「名前がウインドウ名のノート」に追加します。
- 作成するノートの保存先はAppend Selection to Evernote.appをAppleScriptエディタで開いて変更して下さい。デフォルトでは "Append Clip" という適当な名前になっています。
仕様、注意点
- RubyCocoaを含んでいますが10.7でちゃんと動くかは未確認です。
- ServiceAppleScriptで実行するAppleScriptはスタイル付きテキストを受け取れません。その為、Cmd + Cのキーイベントを出して、クリップボードにスタイル付きのテキストを入れて、convertRTF2HTMLSourceinClipboardでHTMLに変換したのをEvernoteに追加します。その際画像情報は完全に無くなるようです。リンク、簡単な色情報は残ります。Safariから等の場合でクリップボードにwebarchiveが入っている場合はそれをHTMLに変換して追加します。画像も取り込めますが取り込めないのもあるかもしれません。
- 同じアプリケーションが二つあるとどれが実行されるか分からないので、新しいバージョンのをダウンロードしたら古いのは捨てて下さい。
種類
- Append Selection to 1stLine Note.app
- 選択したテキストの1行目と同じ名前のノートに追加
- Append Selection to App Name Note.app
- 現在のアプリケーションと同じ名前のノートに追加
- Append Selection to Default Note.app
- ウインドウ名→ドメイン名→セカンドレベルドメイン名の順にノートを探して最初に見つかったものに追加。無ければコンテキストメニューでノートの種類を選択。
- Safariからクリップする場合でどのノートに保存しているか分からない場合に、既にあるものから最適だと思われるものに追加。
- Append Selection to Domain Note.app
- ノート名がドメインのノートに追加
- SafariなどWebViewからのみ
- ブログや掲示板のクリップを個別のノートじゃなくて、そのサイトのノートにまとめたい場合に。
- Append Selection to SecondLevelDomain Note.app
- ノート名がセカンドレベルドメインのノートに追加
- SafariなどWebViewからのみ
- セカンドレベルドメインはwww.apple.com、store.apple.comがapple.comになります。
- 上記のようにドメインが分かれているサイトのクリップを一つのノートにしたい場合に。
- Append Selection to Window Name Note.app
- ノート名が現在のウインドウ名のノートに追加
ダウンロード
- Append_Selection_to_Evernote0.3.0.zip(RTFのスタイルが消えていたのを修正。その他改良)
- Append_Selection_to_Evernote0.2.0.zip(保存するノート名をウインドウタイトル、アプリケーション名、URLのドメイン、URLのセカンドレベルドメインをノート名とする4種類セット。WebViewから追加する場合は画像も取り込めるようになった。ただし、取り込めないのもあるかもしれません。)
- Append Selection to Evernote0.1.0.zip(10.7で動いたと報告を頂きました)