【AppleScript】開いているNumbersをExcelにエクスポートする


現在作っているゲーム内のパラメータの管理（データテーブル）に Numbers を使っています。ですがちょっとした問題が……。

# 問題点

NumbersからExcelを出力する際に、メインメニューから「ファイル > 書き出す > Excel...」を毎回選ぶのは一手間かかってしまいます。

![001.png](https://qiita-image-store.s3.amazonaws.com/0/43772/ad219e28-053e-bbb2-c472-439e29198940.png "001.png")

さらに、書き出し先を選んだ後も、上書き確認のダイアログが表示されます。

![002.png](https://qiita-image-store.s3.amazonaws.com/0/43772/d74106a3-b23d-df59-3ade-567184234e08.png "002.png")

ゲームを作っていると、データの調整にはトライ＆エラーは必須なので、この作業を何回も繰り返すのはなかなか大変です。
そこで、このエクスポート作業を簡単にできるAppleScriptを書いてみました。

# スクリプト

```applescript:numbers2xlsx.scpt
-- 開いているドキュメントの数を取得する
tell application "Numbers" to set cnt to count document

-- 開いている数で繰り返す
repeat with i from 1 to cnt
	-- ファイルパスを取得する
	tell application "Numbers" to set theFile to file of document i as string
	
	-- 拡張子を *.numbers から *.xlsx に変更する
	set tmp to AppleScript's text item delimiters
	set AppleScript's text item delimiters to ".numbers"
	set theList to every text item of theFile
	set AppleScript's text item delimiters to ".xlsx"
	set theFile to theList as string
	set AppleScript's text item delimiters to tmp
	
	-- POSIX形式に変換
	set xlsx to POSIX file (POSIX path of theFile)
	
	-- エクスポート実行
	tell application "Numbers" to export document i to xlsx as Microsoft Excel
end repeat
```

これで Numbers で開いているドキュメントを、同名の *.xlsx に自動で書き出すことができます。

## ショートカットキーへの登録
これでだいぶ便利になったのですが、さらに楽をするためにショートカットキーへの登録をします。登録するにはAutomatorさんを使います。

![Automator_icon.png](https://qiita-image-store.s3.amazonaws.com/0/43772/0de0a9f1-257d-3cbf-7da0-0ca7eb7dc7ba.png "Automator_icon.png")

Automatorを起動して、新規書類を作成します。そして「サービス」を選び「選択」をクリックします。

![a001.png](https://qiita-image-store.s3.amazonaws.com/0/43772/7bdba4e1-3217-b3db-a7af-a1b85889cc7c.png "a001.png")

アクションには「Run AppleSript」をダブルクリックして選びます。

![a002.png](https://qiita-image-store.s3.amazonaws.com/0/43772/a6ca1991-ca88-e4f7-a3d1-22d95d088c3a.png "a002.png")

そうしたら検索対象に「Numbers.app」を選び、先ほどのスクリプトを `(* Your script gose here *)` と書いてあるところに貼り付けます。

![a003.png](https://qiita-image-store.s3.amazonaws.com/0/43772/3bec56f1-00e4-67fc-0a71-a4c6eee98712.png "a003.png")

念のため実行ボタンを押して動作確認しておくとよいです。
動作を確認したら「Cmd+S」で保存します。名前は「NumbersからExcelをエクスポート」と入力して、保存ボタンを押します。

![a004.png](https://qiita-image-store.s3.amazonaws.com/0/43772/8535645d-0649-6e28-ba39-722983442741.png "a004.png")

保存したら、任意のアプリケーションのメニューから「サービス > サービス環境設定」を選びます。

![a005.png](https://qiita-image-store.s3.amazonaws.com/0/43772/b4f10709-da3b-d63d-f104-62b033b03594.png "a005.png")

サービス一覧が表示されるので、登録したサービスを選び、右側の欄をクリックして、ショートカットキーを割り当てます。

![a006.png](https://qiita-image-store.s3.amazonaws.com/0/43772/f1ab4efb-7124-9e4b-3f0e-0306f7bc2d50.png "a006.png")


ここでは「Cmd+F10」としました。
これでNumbersがアクティブの状態で「Cmd+F10」を押すと、エクスポートが行われるようになります。

# データコンバートの流れ
余談になりますが、今作っているゲームのデータコンバートの流れはこのようになっています。

![003.png](https://qiita-image-store.s3.amazonaws.com/0/43772/f928475d-5333-5467-6fee-f428e814889a.png "003.png")

Numbersにアイテム情報や敵データの入力をしています。それをExcelにエクスポートして、CSVにコンバートし、実行環境で読み込むようにしました。Excelにすると、Python(xlrd)やRuby(win32ole)などから読み込めるようになるので、データコンバートの実装が簡単になります。

NumbersからCSVに直接出力できればいいのですが、複数のシートを使っていたり、コンバート時に定数を数値に置き換えるなど変なことをやっているので、AppleScriptでは大変そうな気がしてPythonスクリプトを通しています。あとLibreOfficeなどを使えば *.xlsx を直接編集・保存できますが、せっかくのMac環境なので、Apple公式の表計算ソフトを使いたかったのです（Numbersでも *.xlsx を開くことはできますが、保存する場合は *.numbers がデフォルトになります）。

今回はCSV形式で出力しましたが、環境によってはJSONやLuaに出力してもいいかもしれませんね。


# 参考

* [鳶嶋工房 - AppleScript / Tips / 文字列の検索・置換](http://tonbi.jp/AppleScript/Tips/String/FindReplace.html "鳶嶋工房 - AppleScript / Tips / 文字列の検索・置換")
* [AppleScript でファイルを開いてPDFで保存する例。](http://takuya-1st.hatenablog.jp/entry/2014/04/18/193205 "AppleScript でファイルを開いてPDFで保存する例。")
* [Apple Scriptをショートカットキーで実行](http://sakuro.tumblr.com/post/15283952343 "Apple Scriptをショートカットキーで実行")