054.【Id】選択範囲にテキスト変数があったら編集画面を開く
書いたコード
if (!app.properties.activeDocument) { alert("中止しました。"); exit(); } if (app.selection.length !== 1) { alert("テキスト変数を選択してください。"); exit(); } var sel = app.selection[0]; // カーソルの次がテキスト変数なら選択しなおす if (sel.constructor.name === "InsertionPoint") { var tf = sel.parentTextFrames[0]; try { app.select(tf.insertionPoints.nextItem(sel), SelectionOptions.ADD_TO); } catch (e) { alert("テキスト変数を選択してください。"); // 段落末尾にキャレットを立てていた場合 exit(); } sel = app.selection[0]; } // 選択範囲内にテキスト変数があれば選択しなおす if (sel.constructor.name === "Text" || sel.constructor.name === "TextStyleRange" || sel.constructor.name === "Paragraph") { for (var i = 0; i < sel.characters.length; i++) { if (sel.characters[i].contents === SpecialCharacters.textVariable) { app.select(sel.characters[i]); sel = app.selection[0]; break; } } } if (sel.contents !== SpecialCharacters.textVariable) { alert("テキスト変数を選択してください。"); exit(); } var tvMenuItem = app.menus.item("$ID/Main").menuElements.item("書式").menuElements.item("テキスト変数").menuItems[0]; var tvMenuAction = tvMenuItem.associatedMenuAction; tvMenuAction.invoke();
メモ
わからなかったこと
if( !app.activeDocument ) exit(); // "開かれているドキュメントがありません。"
if( !app.properties.activeDocument ) exit(); // OK
上記のような挙動になる理由がよく分からなかった。
1つ目は存在していないDocumentオブジェクトを参照しようとしているから止まり、2つ目はappのproperties(Object)のプロパティの有無を見ているのでうまくいく…?
積み残し
- テキスト変数のモーダルウィンドウが出ている間ずっとスクリプトが稼働している点が気になる。
- 定義ウィンドウ→編集ウィンドウを開くところまでやりたい。
2つ目についてはやり方が全く分からなかった。
テキスト変数を選択した上で定義ウィンドウを開けば、該当の変数が選択されている状態になるのであとは編集ボタンを叩くだけなのだけど。
submenus.item("定義")のプロパティにはそれらしいものが見当たらない。
VBで「Alt+E」(Mac+AppleScriptだと⌘+E?)を押すという手はあるけどそれはやりたくない気がする。
なおスクリプティングガイドには以下のように記述されている。
メニューアクションやユーザーインターフェイスを選択することで必要な処理を実行するのは、あまりよい方法とは言えません。
(中略)
ユーザーインターフェイスの様々な条件に依存しています。
オブジェクトモデルを使用すれば、InDesignドキュメント内のオブジェクトを直接操作できるので、ユーザーインターフェイスに依存することなく、一貫性のある高速な処理を実現できます。
となると別途ScriptUIを作るのがよいのかなあ。