Indesignスクリプトが増えてきたので使い方とか知ってることをまとめておきます。間違いの指摘など歓迎します。
InDesignスクリプトについて
アドビが用意してくれてる『InDesignオブジェクトモデル』なるものをスクリプトでアレコレいじって、様々な処理を行います。
プラグインと違ってあんまり大したことはできません。手動でInDesignを操作してできることの自動化+α程度です。JavaScript、AppleScript(Macのみ)、VBScript(Windowsのみ)の3言語が使用可能。JavaScriptはWeb向けのJavaScriptとはちょい違って、ファイルなんかも扱えるようにアドビがカスタマイズしたJavaScript(ExtendScript)です。
InDesignオブジェクトモデルはInDesignのバージョンによって部分的に異なります。部分的には違うけどだいたい同じなので、別のバージョン向けに作られたスクリプトでも結構動きます(新しい機能に依存したものでなければ)。動かなくてもちょっとした修正で動いたりします。
また、古いバージョンのオブジェクトモデルを利用する機能も一応あります。→(
http://omachi.blog.ocn.ne.jp/preopen/2008/12/indesign_cs4_7b72.html ディザInDesignブログ: InDesign CS4も前のバージョンのスクリプトが動くように設計されている)
以下の情報はたぶんCS3~CCくらいには当てはまるけど、それ以前は結構違うかもしれない。
大前提
ExtendScriptはInDesign上から実行しても、ファイルシステムやネットワークにアクセスできるし、他のアプリケーションやOSのコマンドの実行もできます。
従って、ソースコードを読んで何をやってるか分からない場合は、
信用できる人の作ったもの以外実行しちゃダメです。
(このサイトのスクリプトは使うなと言ってるに等しい気もしますがw)
InDesign JavaScriptの使い方 その1
①スクリプトを適当なテキストエディタで拡張子jsxで保存し、「Scripts Panel」フォルダ(※)に放り込む。
②スクリプトパネルに表示されてる~.jsxをダブルクリック。
※Scripts Panelフォルダの場所はこのへんを参照→(
http://helpx.adobe.com/jp/indesign/using/scripting.html InDesign ヘルプ | スクリプト)
スクリプトパネルから「ユーザー」を右クリック→エクスプローラで表示、でも開けるみたい。
InDesign JavaScriptの使い方 その2
①スクリプトをテキストエディタで拡張子jsxで保存し、「Scripts Panel」フォルダに放り込む。
②編集メニューの『キーボードショートカット』から、使いたいスクリプトにショートカットキーを割り当てる。
③そのキー操作を実際にやってみる。
※InDesignのキーボードショートカットは、『テキストを編集してる場合』や『表を編集してる場合』などで同じキーに別のコマンドを割り当てることができて便利ですよ。
InDesign JavaScriptの使い方 その3
①jsxファイルをExtendScript Toolkit(以下ESTK)で開く。もしくは、ESTKで新規作成してスクリプトをコピペする。
②ターゲットのアプリケーションとエンジン(※)を設定。(↓これをInDesign、mainに)
③緑の三角形をクリック!
※ターゲットエンジンについて
mainを指定すると、スクリプト上で作った変数等は全部スクリプト終了時に破棄されるみたいです。sessionなどmain以外の名前を指定すると変数等は保持されて、同じエンジンで実行したスクリプト内で使いまわせます。
でも基本mainから変える必要ないです。だってmain以外で実行する必要のあるスクリプトは、大抵ターゲットエンジンを変更するコマンドがスクリプトの最初に書いてあるから。
InDesign JavaScriptの使い方 その4
InDesign起動時に、毎回同じスクリプトを自動実行する方法です。ワークスペース等をいつも同じ設定で始めたい場合や、イベントリスナー(特定の操作をした時にスクリプトが自動実行される機能)を登録したい場合などに。
①スクリプトを拡張子jsxで保存し、「Startup Scripts」フォルダ(※)に放り込む。
②InDesignをふつーに起動するだけ。
※Startup Scriptsフォルダは初期状態ではおそらく存在しないです。Scripts Panelフォルダがあるのと同じフォルダに、「Startup Scripts」の名前でフォルダを作成します。
↓面倒な人は Startup Scriptsフォルダを無ければ作成して開く1行スクリプト
with(Folder(app.scriptPreferences.scriptsFolder.parent.fullName+"/Startup%20Scripts"))(exists||create())&&execute();
InDesign JavaScriptを書いたり改造したりしたい人向けの情報
役立つサイトとか
- InDesign_ScriptingGuide_JS_JP.pdf
アドビが公開してるスクリプティングガイドです。ググれば出るはず。
分かりやすくはない。
InDesignオブジェクトモデルのリファレンス(英語)。ESTKのオブジェクトモデルビューワと内容は同じですがこっちの方がだんぜん見やすいと思う。
お~まち様が作られたオブジェクトモデル図。バージョンによる違いまでわかるのがすごい。
そしてお持ち帰り用まで用意してくれてるのがとてもありがたい。
ローカルに保存してよく見るページをブックマークしまくれば観覧サックサクです。
ただしCS5までで、内容は必ずしも正確ではないです。
ExtendScriptのオブジェクト(FileとかArrayとか$とか)までは書いてないので、そのへんは上の英語の奴から JavaScript Base Classes を見ましょう。
サンプルスクリプトがいっぱいあるので参考になります。
例はイラレですがESTKの使い方がとっても分かりやすい。
ダイアログについて
ダイアログがあるのとないのじゃスクリプトの汎用性が段違いになったりするので少し書いときます。
ダイアログボックスの生成方法は主に3通り。
①alert()、confirm()、prompt()を使う
alertはメッセージとOKボタンのみ、confirmはそれに加えてキャンセルボタン、promptはさらに編集可能なテキストボックスが付きます。
利点:いつでもどこでも使えて超カンタン。
欠点:複雑なダイアログは作れない。
②Dialogオブジェクトを使う
app.dialogs.add()で作ります。書き方はInDesign_ScriptingGuide_JS_JP.pdfのユーザーインターフェイスのとこにある具体例を見たら参考になるんでないかなと。要はDialogColumnとDialogRowで入れ子の表みたいに作っていくんですな。私はこれでwith構文を覚えた。
利点:複雑なダイアログが作れる。入力した値をInDesign起動中保持できる。
欠点:生成・破壊がめんどい。InDesignの機能なので他のアプリで使いまわせない。
③ScriptUIを使う
私はまったく使ったことないのですが
なんか②よりもさらにいろんなことができるらしい。プログレスバーとか。
利点:いろいろできる。ExtendScriptの機能なので他のアドビアプリでも使える。(たぶん)
欠点:難しそう。
exit()について
オブジェクトモデルビューワにも書いてないですがexit()でスクリプトを途中終了させられるみたい。
オブジェクトモデルのバージョンによる違いについて
個人的に重要だと思うのをいくつか。(CSxからって情報はお~まち様のオブジェクトモデル図より)
ほとんど全てのオブジェクトにisValidプロパティがついてます。
意味は「Returns true if the object specifier resolves to valid objects.」ってことだそうで、
有効なオブジェクトとして再解決できるか?みたいなよく分からんプロパティですが結構使い所があります。
InDesignスクリプトでは何かしらのオブジェクトを取得するのにコレクションオブジェクトのitemメソッドってのをよく使います。
たとえばテキストフレームだったらテキストフレームのコレクションオブジェクト(TextFrames)を使って
TextFrames.item(0)(1番目のテキストフレーム)とか
TextFrames.item("りほりほ")(りほりほって名前がついたテキストフレーム)とかね。
でもitemメソッドの引数にそんなもんねえよってのを指定した場合(5個しかテキストフレームがないのにitem(10)とか)、nullとかfalseとかが返ってきてくれればいいのですがそうではなく、
なんか不完全なテキストフレームオブジェクトが返ってきます。
一応テキストフレームオブジェクトの体裁は持ってるんだけど、いざcontentsを取得しようとしたらエラーになる、みたいな。
昔はそれをtry-catch文なんかで対処してたらしいですが、isValidのおかげでちゃんと取得できたかどうかチェックできるようになったわけです。よかった。
他の方法もあったのね→
http://sysys.blog.shinobi.jp/Entry/33/
- app.doscriptでアンドゥモードが指定できるようになった(CS4から)
UndoModes.ENTIRE_SCRIPTもしくはUndoModes.FAST_ENTIRE_SCRIPTを指定することで、スクリプト処理中、元に戻すの履歴を残さないようにできるようになりました。高速化という意味もありますが、1回のCtrl+Z(元に戻す)でスクリプト実行前に戻せるというのもなかなか便利。
- app.scriptPreferences.measurementUnitでスクリプト内で使う長さの単位が決められるようになった(CS5から)
以前はスクリプトの最初でドキュメントの単位設定を書き換えて、最後で戻すなんてことを強いられてたらしいです。でもそれって途中でエラー出たら悲惨なことになるよね…。
parentがpageだったとこがSpreadになった→(
http://d.hatena.ne.jp/seuzo/20100724/1279906199 InDesign CS5では、PageItemの親はPageではなくSpread - 名もないテクノ手)
parentPageプロパティが追加された。
図形系のページアイテムをまとめたSplineItemオブジェクトができた。
GraphicオブジェクトがPageItemに含まれるようになった。
- AnchoredObjectSetting に、挿入点を指定してアンカー付きオブジェクトにするメソッド insertAnchoredObject が追加された(CS5.5から)
以前はライブラリを介して挿入するなど工夫されてたようです。
PR