はじめてのAppleScript

ホームへ

名前は聞いたことがあったというくらいのAppleScriptをなぜか書くことになった(AppleScript 2.8、スクリプトエディタ 2.11)。

経緯

最近Googleアカウントをリアル用とバーチャル用に分けたので、そのついでにTwitterから繋がった人人から共有されるGoogleドキュメントのリンクを後者のアカウントで開きたいという欲求が生えた。
Firefoxのアドオンを作るという当初の計画は「よくわからない」ということで潰えた。次にAutomatorでワークフローを作ることにしたら、どうやら途中でスクリプトを書く必要がありそうだったので、いっそ全部スクリプトで書いてしまえということになり、

出来上がったもの

こちらになります。

実装の流れ

URLの入力を受け取り、それがGoogleのページのものであれば、デフォルトでないアカウントでアクセスするためのクエリを付与してアクセスする。

  1. URLを入力
  2. google.com下にあるか判定
  3. URLの調整
  4. クエリの付与
  5. アクセス

なお、AppleScriptの能力による制約があるほか、個人用のスクリプトであるために目視を併用すればいいということで、あまり精密に実装していない。

解説

AppleScriptはそのまま比較的自然な英語として解釈できるように作られている(例:無意味語としてtheを挿入できる)。

-- dialogのdefault answerを定義
set def to ""

すぐ次に出てくるダイアログのプレースホルダーを定義している。ここでは空。

repeat

後述。

-- URLを入力
display dialog "Tu veux aller où (dans docs.google.com) ?" default answer def with icon note
--> result = {button returned:"OK", text returned:"docs.google.com"}

set input to text returned of result

入力欄付きのダイアログを表示し、入力を変数inputに代入する。

-- 末尾の改行文字を削除
if characters -2 thru -1 of input is "\r\n" then
    set input to characters 1 thru -3 of input as text
else if last character of input is "\n" or last character of input is "\r" then
    set input to characters 1 thru -2 of input as text
end if

入力の末尾が改行文字(「\r\n」「\n」「\r」のいずれか)である場合は、それを削除する。コピーの仕方によってはそうなっていることが時時あるので、雑に扱えるようにするために挿入している。

-- スキームを含まなければhttps://を前置
if "://" is not in input then
    set link to "https://" & input
else
    set link to input
end if

AppleScriptからURLにアクセスするにはスキームが必須なようなので、必要に応じて付与する。

-- 既にクエリがあれば削除
if "?" is in link then
    set lastIndex to (offset of "?" in link) - 1
    set link to characters 1 thru lastIndex of link as text
end if

Googleドキュメントのページでクエリを複数指定する方法がわからないことと、クエリが重要であることはない気がする(スプレッドシートでシートを指定するために使われることはあるが)ので、すでにある場合は全て削除する。

-- クエリを付与
set linkWithQuery to link & "?authuser=2"

正規化されたURLにクエリを付与する。
google.com内ではログインした順にアカウントに0以上の整数が割り当てられており、クエリとして「authuser」でその値を指定してやることで、特定のアカウントにログインした状態でアクセスすることができる。

-- docs.google.comでない場合の註記を生成
if "docs.google.com" is not in linkWithQuery then
    set annotation to "* This is not a URL of docs.google.com ."
else
    set annotation to ""
end if

開くURLに「docs.google.com」が含まれていない場合に表示する警告を生成する。

-- 開くURLを提示
display dialog linkWithQuery & "\n\n" & annotation buttons {"キャンセル", "修正", "OK"} default button 3 with icon note

-- 「OK」ならrepeat終了、「修正」なら入力を保存してrepeat、「キャンセル」は自動で終了
if button returned of result is "OK" then
    exit repeat
else if button returned of result is "修正" then
    set def to input
end if
end repeat

生成されたURLを提示し、それを開くか、修正するか(、キャンセルするか)を選択させる。開く場合はループを抜けさせ、修正する場合はinputを表示させるために保存し、ループの末尾に到達させる(→ループの先頭に戻す)。

-- URLを開く
open location linkWithQuery

クエリ付きで生成されたURLを開く。

参考にした文献

参考になりそうな文献