AppleScript
AppleScript(アップルスクリプト)は、Appleが開発したClassic Mac OS/macOS用のオブジェクト指向のスクリプト言語。System 7(Mac OS 7にあたる)から採用されている。
パラダイム | オブジェクト指向、スクリプト言語 |
---|---|
登場時期 | 1993年 |
最新リリース | 2.8 |
型付け | 弱い動的型付け |
影響を受けた言語 | HyperTalk, Objective-C |
プラットフォーム | System 7, Mac OS 8, Mac OS 9, macOS |
ウェブサイト | AppleScript Overview |
拡張子 | .applescript .scpt .scptd |
特徴
編集カバーエリアの広さ
編集仕組み
編集ユーザインタフェース
編集開発環境
編集異なるOSバージョン間の互換性
編集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コマンドの機能を呼び出したりするのが一般的)。
構文
編集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構文
編集スクリプトの例︵変数﹁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処理系がソースコード内にカッコ(「(」「)」)を自動的に補う動作を行う。ユーザーはこのカッコが自分の意図に合うかどうかを判断し、適宜カッコを補ったり移動させる必要がある。
カッコが自動で付加されるのは、主に四則演算や文字列の連結演算、Cocoaオブジェクトへのメソッド実行などの記述時である。
独特な要素
編集set end of aList to 1
のような配列変数の末尾に数値を追加する記述を行なった場合、英文風に読みやすくするため、
set the end of aList to 1
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
アプリケーション操作対象
編集アプリケーションの操作による作業の自動化や、複数のアプリケーションの操作によるソフトウェア・ロボットの構築が可能であるが、操作対象の種類によって利用する技術や手法が変わる。
ローカルアプリケーション
編集UNIXコマンド
編集リモートアプリケーション
編集Webサービス
編集SOAP、XML-RPCを呼び出すための命令が標準で装備されている(call soap、call xmlrpc)[16][17][18][19][20]。Cocoaの機能を用いてRESTful APIを呼び出すことも可能である[21]。
これらのサービスが存在しないサイトに対しても、Safariのdo JavaScriptコマンド経由で操作したり、GUI Scriptingで強制的に操作することで、Webサービスにログインして必要な情報を取得するなどの処理が可能である。
iOSアプリケーション
編集各種フレームワーク
編集AppleScript Libraries
編集ショートカット
編集macOS 12以降では、iOS系のOSから移植された自動化ツール「ショートカット」(Shortcuts.app)が利用できる。このツール自体がAppleScriptからの操作に対応しており、指定のショートカット(ユーザーが定義した自動化ワークフロー)を実行できるほか、Shortcuts.appが起動していない状態でも、AppleScriptからの実行専用バックグラウンドツール「Shortcuts Events」を指定してショートカットの実行が可能。
Siri
編集AppleScriptから音声エージェント「Siri」を呼び出すAppleScriptライブラリ「AgentCallerLib」がPiyomaru Softwareより提供(電子書籍の付録として提供)されており、指定の文字列をSiriに渡して実行できるようになった。コマンドの冒頭に「Hey Siri」を書く必要はない。同ライブラリは、macOS 12以降をサポートしている。
さまざまな実行環境
編集スクリプトエディタ上で実行
編集アプレット/ドロップレットとして保存して実行
編集スクリプトエディタ上で記述して、アプリケーションとして保存、あるいはアプリケーションとして書き出したものである。この形態のものをアプレットと呼ぶ。アプレット実行時にはアプレット用のランタイム環境が用意されている。この環境で実行すると、on idleによるタイマー割り込み、ファイルやフォルダをドラッグ&ドロップ受信する機能、ハンドラの実行後に終了しない、プログレスバーの表示機能(Mac OS X v10.10より)などの機能が利用できる。ファイル/フォルダのドラッグ&ドロップを受け付けるアプレットをドロップレットと呼んで区別する(アイコンが異なる)が、ランタイム環境は同じである。
アプレット実行時にログ表示などの機能は利用できないため、この実行形態のままではバグの確認や修正が困難である。アプレットとして書き出す前にスクリプトエディタ上で内容に問題がないことを確認する必要がある。
Automator上で実行
編集Cocoa-AppleScript Appletとして保存して実行
編集Mac OS X v10.7で導入された。スクリプトエディタ上で「ファイル」>「テンプレートから新規作成」>「Cocoa-AppleScript Applet」を選択することで新規作成できる。AppleScriptObjCによるプログラムをスクリプトエディタ上で記述できるが、Interface Builderによるユーザーインタフェースの作成が行えず、デバッグ機能も乏しい。実行はアプレット形式でのみ行う。
Xcode上でAppleScript Appとして作成してビルドして実行
編集スクリプトメニューに登録して実行
編集macOSのメニューバーから所定のフォルダ内のAppleScriptを実行できる、macOS標準装備の「スクリプトメニュー」に登録・実行した場合の実行環境も、OSのバージョンに応じてさまざまな変更が加わってきた。Mac OS X v10.10からはosascriptコマンドで実行する実装になった。このため、スクリプトメニューから複数のAppleScriptを同時に実行させることが可能になったが、実行するScript同士で共通のアプリケーションにアクセスした場合のバッティングまでは面倒を見てくれない。スクリプトメニューから実行中のScriptの停止を行えるが、実行中のログ表示はできない。macOS v10.14からは独立したアプリケーションとして提供されるようになった。
フォルダアクションに登録して実行
編集Terminalからosascriptコマンドで実行
編集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を実行」上で実行
編集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命令の実行禁止
編集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より)
編集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から命令を受け付ける場合、呼び出す側と受け付ける側のユーザー名が同じである必要があるようになった。なお、簡単なシェルコマンドでこの制限は無効にすることができる。
脚注
編集参考文献
編集- 「AppleScript Studioでぜんまいびゅんびゅん」, 掌田津耶乃 (2003)ISBN 4-7561-4279-6
- 「AppleScriptリファレンス」, こばやしゆたか/AppleScriptリファレンス制作委員会 (1999)ISBN 4-7973-1011-1
- 「AppleScript言語ガイド 英語表現形式」, Apple Computer Inc. (1997) ISBN 4-7952-9669-3
- 「AppleScriptでぜんまいびゅんびゅん」, 掌田津耶乃 (1995)ISBN 4-7561-1068-1
関連項目
編集外部リンク
編集- Mac Automation Scripting Guide - Appleによる初心者向けの自動化ガイド
- AppleScript Overview - 開発者向け概要
- AppleScript Release Notes - 各OSバージョンのAppleScriptの変更点が書かれているリリースノート
- AppleScript Language Guide - 開発者向け言語ガイド(リファレンス含む)
- API Reference Apple Event Manager - AppleのAppleEvent Managerについてのリファレンス。Apple担当者の手違いでしばらくの間「Retired」扱いになっていたが、手違いであったことが2016年2月に判明し、修正された。
- The Open Scripting Architecture:Automating, Integrating, and Customizing Applications - AppleScriptの初期プロダクトマネージャーのWilliam R. CookとWarren H,HarrisによるAppleScriptの企画時の意図がまとめられている論文