Hello AppleScript World

最近ではデザイナさんもAppleScriptを使いこなすようで、プログラマの自分がまったく理解してないのはどうかと言うことでかじってみる事にしました。まぁ日常的に使ってるのはTerminalとEmacsとYoruFukuroだけなので、個人的にはあんまり使う機会が無いかもなのですが、ひょっとするとXcode周辺で役に立つかもしれないという甘い期待を抱いています。

中々とっかかりが掴めなかったのですが、とりあえずコードを見るのが早いかと思います。以下のスクリプトはMail.appからテストメールを送るというものです。構文自体はあまり見慣れないですが、ちょっとゆっくり見れば難しくはありません。

on run
    -- Mail.appに対するブロック
	tell application "Mail"
	    -- 送信メールオブジェクトを作成
		set newMessage to make new outgoing message   

		-- 送信するメールオブジェクトに対するブロック
		tell newMessage
			set subject to makeSubject() of me   -- 件名の設定
			set content to "applescript"         -- 本文の設定
		end tell

		-- 宛先を指定
		make new to recipient at the end of to recipients of newMessage with properties {address:"taichino@gmail.com"}

		-- 送信
		send newMessage
	end tell
end run

on makeSubject()
   return "hello"
end makeSubject

見た感じで大体予想はつきますがon runのブロックがmain関数の様なもので、on makeSubjectのブロックがサブルーチンです。run内の処理の流れは、大抵以下の様になるかと思います。

  1. アプリケーションを指定 (今回はMail)
  2. 操作したいオブジェクトを作るか取得するかして準備する(今回はメールオブジェクト)
  3. 準備したオブジェクトを弄って結果を反映する(今回はメールにタイトル等を設定して送信)

コードは処理をスコープごとに綺麗に分離できますし、あまりプログラムを理解していなくても雰囲気は掴めますね。またアプリケーションごとにどのような処理やオブジェクトが使用可能かを調べる為にスクリプトエディタのヘルプを利用します。スクリプトエディタを起動して⌘+Shift+Oでリファレンスが開きますので一度目を通しておくと良さそうです。

さて、もちろんiTuneやらXcodeやらをスクリプトから弄れたら嬉しいのですが、日常的にAppleScriptを書くのは辛そうです。個人的な見解ですがAppleScriptはShell Scriptよりも貧弱で、PythonやPerl等とは比べるべくもありません。調べていると色々不満が出てきたのですが、僕は標準入出力にアクセスできない時点で覚える気が無くなりました。Script Editorに強く依存しているのも辛いところです。閉鎖的な設計が非常に残念です。

とは言っても各アプリケーションに用意されたインターフェースは割と強力なので諦めるのはもったいないということで、何とかならないかと思って調べているとpy-appscriptというビンゴなPythonモジュールが見つかりました。これはAppleScriptをPythonから操作する為のラッパーモジュールです。詳細は省きますが、このモジュールを使うと上記スクリプトを、以下のように書き換える事が出来ます。

from appscript import *

mail = app('Mail')
msg = mail.make(new=k.outgoing_message)
msg.subject.set("hello"),
msg.content.set("appscript")
msg.to_recipients.end.make(new=k.to_recipient, with_properties={'address':'taichino@gmail.com'})
msg.send()

使い慣れたPythonでしかもかなり楽にAppleScriptを叩けています。これで基本的な処理はPythonでやりながら、必要な分だけアプリに投げると言うスクリプトが書けます。これなら覚えて損は無いでしょうという感じになりましたね。徐々にmacスキルを上げる為にもPython経由でAppleScript叩いていきたいと思います。ちなみにPythonの他にruby, objcにもそれぞれラッパーが存在しているようですので、得意なものを使えば良さそうです。

2010.7.2 9:00 追記
上記py-appscriptを使ったコードは一つずつプロパティを設定していますが、make関数で一気に設定することも出来ます。こちらの方が見通しがいいですね。

from appscript import *

mail = app('Mail')
msg = mail.make(new=k.outgoing_message,
                with_properties={k.subject:"hello",
                                 k.content:'appscript'})
msg.to_recipients.end.make(new=k.to_recipient, with_properties={'address':'taichino@gmail.com'})
msg.send()

あと大した話ではないですが、メール送信はやっぱり目で確認して自分でMail.appの送信ボタンを押したいという方はsendの代わりにvisibleプロパティをsetすれば作成した内容が反映されたメールペインが表示されます。

Leave a Reply

Your email address will not be published. Required fields are marked *