AppleScript (アップルスクリプト)は、Apple が開発したClassic Mac OS /macOS 用のオブジェクト指向 のスクリプト言語 。System 7(Mac OS 7にあたる)から採用されている。
標準環境で利用でき、ある程度自然言語 (英語 )に似た構文を持つ。制御構文 、ハンドラ や変数 、オブジェクト やプロパティ の記述といったプログラミング の基本機能を言語に備えており、Mac OSのプロセス間通信 機能の一つであるApple event によって、システムや様々な対応アプリケーションにまたがって制御できる。
AppleScriptはMac OSのスクリプティング機構Open Scripting Architecture (OSA) に対応した言語(OSA言語)のひとつであり、OS X v10.10 よりJavaScript for Automation (JXA) も標準搭載されるようになった[ 1] 。
特徴
カバーエリアの広さ
アプリケーション 操作の自動化、シェル 、コマンド の呼び出し、画面上の部品の強制操作にWebコンテンツの強制コントロール、Cocoa フレームワーク の呼び出しにiCloud 経由のコンテンツ更新など、マクロ言語 としてはカバーできる範囲がとても広い。そのうえ、GUI ベースのアプリケーション開発まで行えるため、いったん覚えるとMacを用いた作業の生産性が向上する。ただし、他のアプリケーションを他のコンピュータ からも操作できるため、セキュリティ を考慮しさまざまな抑止機能がオペレーティングシステム (OS) に用意されつつある(詳細は#制限機能 を参照)。
Classic Mac OSからmacOSを通じて継承された唯一のテクノロジーであり[ 2] 、海外を中心に古くから開発者コミュニティが形成され[ 3] 、GUIベースのアプリケーションのコントロールについての知見が蓄積されている。
仕組み
AppleScriptはOSA に準拠したスクリプト言語の一つであり、アプリケーション等のプロセス にApple event を送ることにより自動操作を実現する。通常はコンパイル 済みのバイトコード が保存され実行される。このため、基本的にはOSのバージョンやCPU の形式 (68000 , PowerPC , x86 , x64 , Apple Silicon) 、記述した言語(AppleScript英語、AppleScriptフランス語、AppleScript日本語)などに依存しないコードが生成される。
AppleScriptの言語そのものが定義している予約語 (複数の単語による連語から構成される)は数十程度と少なく[ 4] 、標準では絶対値を求める機能や三角関数の機能すら持たないが、Scripting Additions/OSAX(Open Scripting Architecture eXtension)[ 5] と呼ばれる機能拡張書類、あるいはAppleScriptそのもので記述したAppleScript Librariesによって命令を増やすことが可能となっている(サードパーティのOSAXはmacOS 10.14で廃止になった[ 6] )。
AppleScriptはMac OS上のアプリケーション間通信を基礎技術として用いているため、アプリケーションがApple eventに対応していればそのアプリケーションに処理を委ね、その処理結果を別のアプリケーションに対して用いることも可能である。また、現在のバージョンではUser Interface Scripting[ 7] あるいはGUI Scripting[ 8] [ 9] あるいはUI Element Scripting[ 10] と呼ばれる機能を用いて、スクリプトからアプリケーションにメニュー操作やキー入力を伝達することも可能になっている。アプリケーションは、システム経由で送られてきたApple eventメッセージを解釈して対応した処理を行い、処理結果を再びシステムを経由してApple eventメッセージとして返す。
バイトコードインタプリタ型の逐次実行で処理されるため[要出典 ] 、ネイティブコードに比べると実行速度は劣るものの、アプリケーションの機能呼び出しを行わない場合にはスクリプト言語としては十分な速度で実行される[要出典 ] 。ただし、アプリケーションの機能呼び出しはコストも高く、前述のGUI Scriptingを用いたメニューなどの強制操作を行うと、さらに処理コストが増加し、時間がかかる。
ユーザインタフェース
AppleScriptは、簡素なダイアログ (display dialog、display alert)、ノーティフィケーションセンターへのノーティファイ (display notification)、ポップアップメニューからの項目選択ダイアログ (choose from list)、ファイル選択 (choose file)、フォルダ選択 (choose folder)、新規ファイル保存先パス選択 (choose file name) 、プログレスバー表示(Mac OS X v10.10以降。アプレット動作時のみ)などの、目的に特化した簡単なユーザインタフェースを提供している。
これら以外のユーザインタフェースを利用するために、現在利用できる手段で一番簡単なやり方は、Mac OS X標準搭載の「スイッチコントロール」でパネルを作成し、パネル内のボタンに対してアクション「AppleScript」を割り当てておくというものである。
Adobe InDesignなどの一部のアプリケーションでは、簡易的なユーザーインタフェースをAppleScriptのプログラムから動的に生成する機能を備えている。
本格的な、自由度の高い自作のインタフェースを持たせるには、Xcode 上で「AppleScript App」プロジェクトを作成し、その中にAppleScriptコード(AppleScriptObjC)を記述する。Xcode上で一般のアプリケーション開発と同様にユーザインタフェースを作成できる。コントロール(GUIの部品)が操作されると、AppleScriptコード中の対応するイベントハンドラが呼び出される。
開発環境
macOSにはスクリプトの編集・実行ツールであるスクリプトエディタ (Mac OS X v10.0 〜v10.4 はスクリプトエディタ 、Mac OS X v10.5 〜v10.9 はAppleScriptエディタ(スクリプトエディタ の名称が変更されたもの)、Mac OS では『スクリプト編集プログラム』)が付属する。
スクリプトエディタ にAppleScript対応アプリケーションのアイコン をドラッグ・アンド・ドロップ するとAppleScript用語辞書が表示され、これを参照しつつアプリケーションのコントロールを行う処理を記述する[ 11] 。
スクリプトエディタ にはブレークポイント設定や変数内容のモニタリングなどの機能はないため、これらの機能を利用したいユーザーはLate Night Software社の「Script Debugger」 を用いる必要がある。また、Cocoaオブジェクトのログ表示やAppleScript Librariesに添付するAppleScript用語辞書の編集についても「Script Debugger」 で行える。
AppleScriptへのコードサインはApple純正のスクリプトエディタ およびScript Debuggerで行うことができる。Mac App StoreにAppleScriptで作成したアプリケーションを提出するには、Xcode上で記述・コードサインする必要がある。
その他、テキストで書いたスクリプトをコマンドラインからosascriptコマンドでコンパイル・実行することも可能である。
Apple純正の統合開発環境 Xcode (旧Project Builder)上でAppleScriptによるアプリケーション開発を行うこともできる。AppleScriptから直接Cocoaの機能を呼び出せる「AppleScriptObjC」[ 12] が提供されている(Mac OS X v10.1〜v10.5ではAppleScript Studio)。ユーザーインタフェース作成についてInterface Builder を用いる点は以前のAppleScript Studio(Mac OS X v10.6で廃止)とかわりないが、AppleScript用語辞書を用いて各種GUI部品にアクセスするのではなく、Interface Builder 上でバインディングによりAppleScriptプログラム中のプロパティ値にひもづけしたり、Cocoaの各種フレームワーク内のメソッドを呼び出す方式に変更された。
異なるOSバージョン間の互換性
AppleScript書類のフォーマットは維持されているため、基本的には互換性が確保されている。これまでMac OS X v10.4のインテル CPU への移行や、Mac OS X v10.7 の64ビット への移行、macOS 11.0のApple Silicon(ARM)移行などOSの基盤の大変革期があったが、AppleScriptそのものについてはほぼ影響はなかった。AppleScriptの処理系そのものの変更が小刻みであったため、15年前に作られたソートルーチンがそのまま使えたりもする。
ただし、AppleScriptだけでなくOSAXや外部のアプリケーションの機能を利用していた場合には、部品ごとに確認が必要となる。
まず、macOS標準添付のアプリケーションの機能がOSバージョンごとに異なる。これらを呼び出す処理を行っている場合にはチェックが必要である。とくに、AppleScriptにOSの機能を提供するために用意されている補助アプリケーションはOSバージョンによって変更されることがあるため、その存在および代替機能を確認する必要がある。一般的に、古いバージョンから新バージョンへの移行は、それなりに手間はかかるものの確認作業レベルで済む。
逆に、新しいバージョンのOSから古いバージョンのOSにScriptを移植する場合には大幅に作業量が増える。古いOSには固有のバグもあるため(Mac OS X v10.5以前は日本語のパスの扱いに問題があった)、それらを考慮した処理に変更する必要も生じる。古いmacOSが動作する実機と関連アプリケーションを用意し、きちんと動作検証や書き換え作業が必要になる。
GUI Scriptingを利用している場合には、メニュー構成やボタンの文字を変えただけで動かなくなる可能性があるため、そもそも異なるOSバージョン間でそのまま動く可能性は低い(ただし単純な修正で対応できる)。
OS X v10.10以降ではAppleScript側が想定するAppleScript処理系のバージョン(≒ macOSそのもののバージョン)をuseコマンドを使って表記できるようになった。
AppleScript version
macOS version
useコマンド記述
2.4
10.10
use AppleScript version "2.4"
2.5
10.11, 10.12
use AppleScript version "2.5"
2.7
10.13, 10.14 , 10.15, 11.0
use AppleScript version "2.7"
2.8
12.0, 13.0, 14.0, 15.0
use AppleScript version "2.8"
また、macOS 10.14以降でサードパーティ製のOSAXが使用できなくなったため、それらを使用しているScriptをmacOS 10.14以降で動かす場合には代替機能を探す必要もある(Cocoaの機能を呼び出したり、shellコマンドの機能を呼び出したりするのが一般的)。
構文
HyperCard 用のスクリプト言語であるHyperTalk に似た、英語に近い構文が採用されており、基本的には習得しやすい。機能の異なるアプリケーションを操作するためには、それぞれアプリケーションごとに異なる命令やオブジェクト構造を知る必要があり、AppleScript対応アプリケーションのアイコンをスクリプトエディタ でオープンすることで表示される「AppleScript用語辞書」を参照しつつ記述することになる。
初期は日本語表現形式を含む英語以外の言語による記述も可能だったが、Mac OS 8.5以降は英語表現形式のみが採用されている。英語表現形式の場合も変数 名は | で囲むことで日本語などを使用できる。
Mac OS X v10.10でAppleScriptObjCがXcode上のみならず、スクリプトエディタ 上でも利用できるようになったため、Objective-C風の表記も標準採用された。
スクリプトの例 (変数「持ち物=myItem」の中身が0だったらダイアログを表示する)
英語
if myItem = 0 then
display dialog "持ち物がありません" buttons { "OK" } default button "OK"
end if
通常は上記のように記述するが、より英文に近い以下のようなコードも記述できる。ただし複数の処理を一行のif文 に組み込むことはできないので、先ほどの構文を使用することになる。下記のコードでは比較演算子 の“等価”を表す = が is に置き換えられている(is は is equal to と書くこともできる。このような同義語が数多く存在するのもAppleScriptの特徴のひとつ)。
if myItem is 0 then display dialog "持ち物がありません" buttons { "OK" } default button "OK"
変数名に日本語を用いた例
if |持ち物| is 0 then display dialog "持ち物がありません" buttons { "OK" } default button "OK"
日本語 (現在は利用できない)
もし「持ち物」が 0 ならば
“持ち物がありません”をボタンリスト:{“ OK ”}、デフォルトボタン:“ OK ”で表示する
以上
AppleScriptObjC構文
Mac OS X v10.6で部分的に導入され(Xcode上のみ)、Mac OS X v10.10でスクリプトエディタ でもCocoaの機能を利用するAppleScriptObjCが導入された。このため、現行のmacOS上ではどのマシンでも、どのAppleScriptランタイム環境上でもCocoaの機能を利用できる状態になっている。
AppleScriptObjCは従来のAppleScriptと比べて10倍以上の高速処理が可能である[ 13] 。ただし、それはAppleScriptのオブジェクト(string、list、recordなど)をCocoaのオブジェクト(NSString、NSArray、NSDictionaryなど)に変換したうえでCocoaのメソッドを呼び出した場合であり、従来型のAppleScriptをAppleScriptObjC環境で記述しても速度は変わらない。AppleScriptとCocoaの間でのオブジェクト変換は暗黙で行われる場合もあるが、多くの場合は明示的に変換する必要がある。
また、AppleScriptObjCではObjective-CのBlocks構文やprotocolをサポートしていないため、Cocoaのフレームワークすべてが利用できるわけではない。Cocoaのクラス名やメソッド名でAppleScriptの予約語とコンフリクトするものについては「|」で囲う必要がある(例:NSURL、URL、document、count、propertiesなど)。ドットシンタックスもサポートしていないため、現行のObjective-C 2.0にくらべるとやや冗長な表記になる。
Cocoaオブジェクトの結果表示やログ表示については、macOS標準添付のスクリプトエディタ ではサポートしていない。Cocoaオブジェクトのログ表示などを利用するためにはサードパーティー の開発ツール「Script Debugger 」の利用が必要である。
スクリプトの例 (変数「aString」のアルファベット大文字を小文字に変換する)
Objective-C
NSString * aString = @"123/abc/ABC.txt" ;
[ aString lowercaseString ];
AppleScriptObjC
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
set aString to current application 's NSString 's stringWithString : "123/abc/ABC.txt"
( aString 's lowercaseString ()) as string
AppleScript対応アプリケーションへのtellブロック内でAppleScriptObjCの命令を呼び出すとエラーになる。このため、たとえばAdobe InDesignの書類から得られたデータをAppleScriptObjCを用いて高速にソートしたい場合などは、AppleScriptObjCの機能部分をサブルーチンとして分離し、InDesignへの命令ブロックと明示的に分ける必要がある。
なお、AppleScriptObjCで実行されるCocoa機能呼び出しはARC環境下で実行されるため、releaseなどのメソッドを呼び出すと実行環境ごとクラッシュする。
独特な挙動
スクリプトエディタ上でのコンパイル(構文確認)時に演算の優先順位を指定するため、AppleScript処理系がソースコード内にカッコ(「(」「)」)を自動的に補う動作を行う。ユーザーはこのカッコが自分の意図に合うかどうかを判断し、適宜カッコを補ったり移動させる必要がある。
カッコが自動で付加されるのは、主に四則演算や文字列の連結演算、Cocoaオブジェクトへのメソッド実行などの記述時である。
独特な要素
英文風に記述するため、「無意味句」を入れることができる。無意味句の代表的なものに「the」がある。theはプログラム内で何もプログラム的な動作を行わない。実行時に無視される。
のような配列変数の末尾に数値を追加する記述を行なった場合、英文風に読みやすくするため、
set the end of aList to 1
のように無意味句を補うことができる。
無意味句はプログラム的な動作を何も行わないが、それら自体が存在し、無意味句同士は別物として識別される。そのため、無意味句を補助的に用いてサブルーチン(ハンドラ)の宣言を行うことも可能。
AppleScriptが定義している無意味句には、
about , above , against , apart from , around , aside from , at , below , beneath , beside , between , by , for , from , instead of , into , on , onto , out of , over , since , thru ( throughも可 ), under
などがあり、サブルーチンのパラメータを指定する装飾子としてこれらの無意味句を利用できる。
set a to aSub for 10 at 20
--> 30
on aSub for aInt at bInt
return ( aInt + bInt )
end aSub
アプリケーション操作対象
アプリケーションの操作による作業の自動化や、複数のアプリケーションの操作によるソフトウェア・ロボットの構築が可能であるが、操作対象の種類によって利用する技術や手法が変わる。
ローカルアプリケーション
Safari やコンタクト、カレンダーなどのmacOS標準添付アプリケーションの多くがAppleScriptからのコントロールに対応しており、主要機能にアクセスできる。
ただし、対応アプリケーションであっても機能のすべてがAppleScriptに解放されているわけではない。AppleScript用語辞書に定義されている範囲のみである。
そのため、前述のGUI Scriptingによるメニューやボタンなどの強制操作が時と場合によって必要になる。この強制操作機能はOSのデフォルト設定ではオフになっているほか、アプリケーション/アプレット/Scriptごとに許可/禁止するようになっている。
UNIXコマンド
do shell scriptコマンドでBSD (UNIX) レイヤー上のコマンドを呼び出すことができる[ 14] 。ただし、Terminal.app上とdo shell scriptコマンドでは設定されている環境変数が異なるため、Terminal.app上で実行できていた処理ができなくなる場合がある。特に、指定したコマンドにパスが通っていないことや、カレントディレクトリが異なること等はエラーの原因となる。これは環境変数の内容を明示的に指定することや、利用コマンドをフルパスで表記することで回避できる(環境変数内容はenvコマンドを実行して確認できる)。
リモートアプリケーション
macOS標準装備の「リモートApple events 」の機構を用いて、TCP/IPネットワーク(主にLAN)内の他のMac上のアプリケーションをコントロールできるようになっている。ただし、セキュリティ確保のためmacOS標準装備のアプリケーションの多くは、この機能が禁止されているほか、OSのデフォルト設定ではリモートApple events はオフになっている。
1台のMacでは処理が追いつかない場合、この機構を用いて複数台のMacに仕事を割り振り分散処理を行うことができる。また、Mac上で稼働する仮想環境上でmacOSを動作させ、仮想環境との間での分散処理も可能である[ 15] 。
Webサービス
SOAP、XML-RPCを呼び出すための命令が標準で装備されている(call soap、call xmlrpc)[ 16] [ 17] [ 18] [ 19] [ 20] 。Cocoaの機能を用いてRESTful APIを呼び出すことも可能である[ 21] 。
これらのサービスが存在しないサイトに対しても、Safariのdo JavaScriptコマンド経由で操作したり、GUI Scriptingで強制的に操作することで、Webサービスにログインして必要な情報を取得するなどの処理が可能である。
iOSアプリケーション
macOS 11.0以降、Apple Silicon Mac上ではiOS 用のアプリケーションがそのまま動作している。このため、Apple Silicon Mac上で動作するiOSアプリケーションをAppleScriptから操作することも可能になった。専用の用語辞書を持たないiOSアプリケーションに対しては、GUI Scripting経由で操作するが、macOSアプリケーションのようにオブジェクト階層をたどれる作りになっていないため、新たなノウハウが必要である。
Apple純正のメモなどのアプリケーションでは、macOS用とiOS用がiCloud経由でデータのシンクロを行うため、macOS上でデータの更新を行うとiOS側にもそれが反映される。これを利用して、iOS側に大量のデータを登録したい場合にMac上でAppleScriptなどによってデータを追加するといった方法が可能である。また、iPhoneとひもづけされたMacからAppleScriptを用いて電話をかけたりSMSメッセージを送信したりもできる[ 22] 。
iOSシミュレータ上で動くiOSアプリケーションもGUI Scriptingにより操作や情報の取得などが可能である。そのため、AppleScriptからシミュレータ上のiOSアプリを操作し、操作テストを実施して段階ごとに画面キャプチャを記録することも行われている。
各種フレームワーク
Mac OS X v10.10以降では、Apple純正およびサードパーティー製CocoaフレームワークをAppleScriptから直接呼び出すことが可能となっている[ 23] 。また、コンタクト(住所録)やカレンダーの情報をフレームワーク経由で検索・操作できるようになった[ 24] 。iTunes Libraryの検索もiTunes.app経由やiTunes Music Library.xmlを検索するよりも高速に行える。
AppleScript Libraries
Mac OS X v10.9以降で、AppleScript自体をライブラリ化して再利用できるようになった。さらに、このライブラリにはAppleScript用語辞書を持たせることが可能なため、AppleScriptの命令語をAppleScriptで記述したライブラリによって拡張することが可能である。
ショートカット
macOS 12以降では、iOS系のOSから移植された自動化ツール「ショートカット」(Shortcuts.app)が利用できる。このツール自体がAppleScriptからの操作に対応しており、指定のショートカット(ユーザーが定義した自動化ワークフロー)を実行できるほか、Shortcuts.appが起動していない状態でも、AppleScriptからの実行専用バックグラウンドツール「Shortcuts Events」を指定してショートカットの実行が可能。
Siri
AppleScriptから音声エージェント「Siri」を呼び出すAppleScriptライブラリ「AgentCallerLib」がPiyomaru Softwareより提供(電子書籍の付録として提供)されており、指定の文字列をSiriに渡して実行できるようになった。コマンドの冒頭に「Hey Siri」を書く必要はない。同ライブラリは、macOS 12以降をサポートしている。
さまざまな実行環境
AppleScriptは中間コードに翻訳されて逐次実行されるが、以下のようなさまざまな保存・実行環境(ランタイム環境)を持つため、実行環境によって動作が微妙に異なり、想定していた通りに動かない場合がある。
また、実行中のログ表示が行えるのはスクリプトエディタ でオープンしてスクリプトエディタ で実行させた場合、およびXcode上で作成してデバッグビルドを行なっている場合の2つのケースにかぎられる。フォルダアクションで実行中のAppleScript書類をスクリプトエディタ でオープンさせたからといって、フォルダアクションで実行中のAppleScriptのログがスクリプトエディタ 上にログ表示されることはない。
スクリプトエディタ上で実行
スクリプトエディタ 上に記述して、スクリプトエディタ 上で実行する形態である。この際の実行環境はスクリプトエディタ であり、途中でAppleScriptの実行を停止させたり、ログ表示させた内容を確認したりできる(ログ表示させると実行速度がいちじるしく低下する)。セキュリティ上の制約がもっとも少ない実行環境でもあり、他の実行環境では動かせないコードもこの環境で動くケースが多い。
アプレット/ドロップレットとして保存して実行
スクリプトエディタ 上で記述して、アプリケーションとして保存、あるいはアプリケーションとして書き出したものである。この形態のものをアプレットと呼ぶ。アプレット実行時にはアプレット用のランタイム環境が用意されている。この環境で実行すると、on idleによるタイマー割り込み、ファイルやフォルダをドラッグ&ドロップ受信する機能、ハンドラの実行後に終了しない、プログレスバーの表示機能(Mac OS X v10.10より)などの機能が利用できる。ファイル/フォルダのドラッグ&ドロップを受け付けるアプレットをドロップレットと呼んで区別する(アイコンが異なる)が、ランタイム環境は同じである。
アプレット実行時にログ表示などの機能は利用できないため、この実行形態のままではバグの確認や修正が困難である。アプレットとして書き出す前にスクリプトエディタ 上で内容に問題がないことを確認する必要がある。
Automator上で実行
Automator のワークフロー記述の一部としてAppleScriptを使用することもできる。Automator上のアクション「AppleScriptを実行」がスクリプトエディタ に近い機能(ログ表示、結果表示)を持つが、他のAppleScript対応アプリケーションのAppleScript用語辞書をブラウズしたり、途中で実行を停止させるなどの機能はない。
Cocoa-AppleScript Appletとして保存して実行
Mac OS X v10.7で導入された。スクリプトエディタ 上で「ファイル」>「テンプレートから新規作成」>「Cocoa-AppleScript Applet」を選択することで新規作成できる。AppleScriptObjCによるプログラムをスクリプトエディタ 上で記述できるが、Interface Builderによるユーザーインタフェースの作成が行えず、デバッグ機能も乏しい。実行はアプレット形式でのみ行う。
Xcode上でAppleScript Appとして作成してビルドして実行
Xcode上で「File」>「Project」>「Other」>「AppleScript App」を呼び出すと作成される。Mac App Store上でのアプリケーション販売が可能な形式である。一般的なCocoaアプリケーションをAppleScriptで開発する環境であり、一般的なCocoaアプリケーションに近いものが作れるが、一般的なCocoaアプリケーションを作成するレベルの知識が必要とされる。Xcode内蔵のエディタ上で編集するAppleScriptは、文法要素に応じた構文色分け機能が利用できず、デバッグも行いにくい。複数のスクリプトファイルにプログラムを分割した場合のハンドラ呼び出し方法にクセがある。
スクリプトメニューに登録して実行
macOSのメニューバーから所定のフォルダ内のAppleScriptを実行できる、macOS標準装備の「スクリプトメニュー」に登録・実行した場合の実行環境も、OSのバージョンに応じてさまざまな変更が加わってきた。Mac OS X v10.10からはosascriptコマンドで実行する実装になった。このため、スクリプトメニューから複数のAppleScriptを同時に実行させることが可能になったが、実行するScript同士で共通のアプリケーションにアクセスした場合のバッティングまでは面倒を見てくれない。スクリプトメニューから実行中のScriptの停止を行えるが、実行中のログ表示はできない。macOS v10.14からは独立したアプリケーションとして提供されるようになった。
フォルダアクションに登録して実行
指定のフォルダ内容を数秒間隔で監視し、変更が加わるとAppleScriptの実行を行う機構である。ランタイムの差異が問題を生むというよりも、このフォルダアクションの機構そのものがmacOSのバージョンによってはうまく動作していない(Mac OS X v10.10)ことが問題であった[ 25] 。のちに、macOS v10.11でFSEvents経由で変更イベントを受信するよう全面的に書き直され、ファイル変更があったら即時にScriptが実行されるようになった。
Terminalからosascriptコマンドで実行
OSバージョンによっては、display dialogなどのコマンドが利用できなかったが、Mac OS X v10.10以降はスクリプトエディタ 上での実行にきわめて近いランタイム環境が提供されている。全く同一ではないため、スクリプトエディタ 上で記述すれば発生しないような問題に直面する場合がある。一例として、AppleScript中からNSWindowを動的に生成し、そのウィンドウ上の各種GUI部品でユーザーからの操作を受け付けたい場合、操作が処理されないといった問題がある。
Switch Control上の「AppleScript」アクションから実行
macOSのアクセシビリティ系の機能に、フローティングパレット上に配置したボタンからキーボードショートカットやAppleScriptの実行を行えるSwitch Controlがある。バンドル形式のScriptを読み込んで実行できない、Scriptのバンドル内に実行ファイルを入れて呼び出すことができない、ユーザーディレクトリ下のAppleScriptライブラリを認識しない、といった運用上の制約がある。
「音声入力コマンド」の「高度なコマンド」>「ワークフローを実行」でAppleScript実行
日本語音声認識でAppleScriptを実行できる。実行可能形式は、AppleScriptのフラット形式(.scpt)およびAppleScriptアプレット。Siriとは別の音声認識コマンドであり、あらかじめ指定しておいた固定文字列を日本語音声認識して、合致すればコマンドを実行する。macOS 12でショートカット.appがmacOSに搭載されたことにより、AppleScriptを実行可能な音声認識コマンドの実行系が2つ存在している。
アプリケーション内のScript実行機能で実行
FileMaker Proを外部からAppleScriptでコントロールするよりも、FileMaker Proスクリプトの「AppleScriptを実行」スクリプトステップ中にAppleScriptをコピー&ペーストで入れて実行する方が数倍高速に実行される。画面の再描画などを抑止するほか、高速実行するための仕組みを備えている[要出典 ] 。
Microsoft OfficeのVBAスクリプト内でも、AppleScriptを呼び出す仕組みが用意されている。Excel v.14.xまでは「MacScript」コマンドにより文字列で与えたAppleScriptが、Excel v.15.xでは「AppleScriptTask」コマンドによりファイル名を指定して外部のAppleScriptを実行できるようになっている。
同様に、Adobe InDesignの「スクリプト」パレット中からAppleScriptを呼び出すことが出来、この際に画面の再描画を抑止できるため高速実行(おおよそ2倍)が可能となっている。ただし、Adobe InDesignについては大量のデータ処理時にクラッシュが発生するため、処理速度より安定稼働を重視すると外部からのコントロールも選択肢に入る。
Script Debugger上でデバッグ実行
AppleScript専用のサードパーティー統合開発環境といえるScript Debugger では、デバッグ時にAppleScript互換の「AppleScript Debugger」というAppleScriptとは別のOSA言語を実行することになる。厳密にいえばAppleScriptそのものを実行するわけではないため、振る舞いが異なる箇所が出てくることは否定できない。ただし、以前(Classic Mac OS時代)に比べると純正AppleScript環境との互換性は大幅に高まっている。強力で便利な環境であるが、「デバッグ時以外はScript Debuggerを使うべきではない」という方針の開発現場もあるのは、この「互換性問題」ゆえである。
ショートカットアクション「AppleScriptを実行」上で実行
Shortcuts.appのアクションに「AppleScriptを実行」が用意されており、ショートカット内でのAppleScript実行が可能である。このアクションはmacOS専用であり、他のOS上では実行できない。Cocoaの機能呼び出しや、ユーザー環境にインストールされたAppleScript Librariesの機能呼び出しなどが可能。このことにより、Mac上であればSiri経由で日本語音声認識/テキスト操作によりAppleScriptを実行できるようになった。
制限機能
あまりに拡張され、できることが増えすぎたため、AppleScriptの一部機能を抑止するための機構がmacOSに用意されつつある。以下の機能についてはデフォルトでは禁止状態になっているが、管理者パスワードを入力すれば実行を許可するようになっている。
リモートApple Eventsへの応答禁止
ネットワーク上の他のMacからのコントロールを行うリモートApple Eventsに対し、macOS標準装備の各アプリケーションは応答しないようになっている。また、出荷時のデフォルト設定で、リモートApple Eventsはオフになっている。
GUI Scriptingの実行禁止
画面上のメニューやボタンなどを操作するGUI Scriptingについては、「システム環境設定」の「セキュリティとプライバシー」>「アクセシビリティ」で個別に許可を行うようになっている。デフォルト設定では、どのプログラムに対しても許可していない。
Safari上でのdo javascript命令の実行禁止
Safari 9.1.1より、「開発」メニューに「Apple EventsからのJavaScriptを許可」の項目が新設され、これにチェックを入れないとAppleScriptからSafariに対してdo javascript命令を実行できなくなった[ 26] 。いったん許可すれば、その状態は継続される。
FileMaker Pro上での拡張アクセス権におけるApple Eventによる操作許可設定
FileMaker Pro v16より、FileMaker Script中におけるAppleScriptの実行(正確にいえば、AppleScriptからFileMaker Pro自身を操作すること)がデフォルトの権限セットのままでは許可されない状態になっている。そのため、より以前のバージョンで作成したFileMaker ProデータベースをFileMaker Pro v16でオープンすると、FileMaker Script Step実行時に「実行権限エラー」ダイアログが表示され、Script Stepの実行が行われないという現象に直面することがある。このような場合には、拡張アクセス権で「Apple EventおよびActive-XによるFileMaker操作の実行を許可」にチェックを入れれば実行できるようになる。
「セキュリティとプライバシー」による権限設定(macOS 10.14より)
macOS 10.14より、システム環境設定の「セキュリティとプライバシー」>「プライバシー」項目にセキュリティ度を調整するための各種機能が追加され、AppleScriptもその影響を受けるようになった。
「フルディスクアクセス」項目では、動作中のMacのすべてのユーザーに対して、ユーザー自身のメール、メッセージ、Safari、ホーム、Time Machineバックアップなどのデータや特定の管理設定へのアクセスを許可する。AppleScriptを利用するユーザーはこの項目に「スクリプトエディタ 」と「スクリプトメニュー」を登録しておく必要がある。
「オートメーション」項目では、他のアプリケーション制御の許可、および取り消しを行える。スクリプトエディタ 以外のアプリケーションで、他のアプリケーションを制御する場合には、動作中の最初の要求時にユーザーに対して承認を求めるダイアログを表示する。承認されたアプリケーションはこの「オートメーション」項目に表示されるようになる。実行したユーザーが承認しなかった場合にも、本項目にチェックボックスがオフになった状態で表示されるため、あとからシステム環境設定上の本項目において承認を行う(チェックボックスをオンにする)ことが可能である。
なお、一度「オートメーション」項目に登録され、ユーザーの承認を得ていれば、毎回ユーザーの承認ダイアログが表示されることはない。
逆に、本「オートメーション」項目に意図的に登録させたい場合、アプリケーションのバージョン番号を確認したり最前面に表示させる(activate)コマンドを実行させる程度ではシステムが反応しない。他のアプリケーションを操作するAppleScriptアプレット/AppleScriptアプリケーションにおいて、初回起動時に「オートメーション」項目に登録される程度の簡単な(害のない)アプリケーション操作を意図的に行う必要が生じるようになった。AppleScript側から任意のアプリケーションに対する操作が許可されているかを知ることは、サードパーティのフレームワークを呼び出すことで可能となっている[ 27] 。
SIPによる機能制限(macOS 10.14より)
macOS 10.11以降、SIPによる機能制限が段階的に強化され、macOS 10.14においてはApple純正のスクリプトエディタ にも制限が加わった。ホームディレクトリ下の「ライブラリ」フォルダ中の「Frameworks」フォルダ(デフォルトでは存在しない)へのアクセスがSIPにより禁止された。macOS 10.14上でこの制限を回避するには、サードパーティの開発環境「Script Debugger」を利用するか、SIPそのものを解除する必要がある。
リモートApple Eventsの応答ユーザー名制限(macOS 10.15より)
macOS 10.15以降、リモートApple Eventsでネットワーク上の他のMac上のAppleScriptから命令を受け付ける場合、呼び出す側と受け付ける側のユーザー名が同じである必要があるようになった。なお、簡単なシェルコマンドでこの制限は無効にすることができる。
脚注
参考文献
関連項目
外部リンク
バージョン アプリケーション
ユーティリティ
テクノロジーおよび インタフェース
開発ツール