[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

(DTPtechNote:1646) [InDesign CS3][JavaScript][Scripting]Menuスクリプト(1)



Menuを操作するスクリプト覚え書き(1)
まず、メニューを選択する状態を再現してみる。

var my_menu_action = app.menuActions.item("開く...");
my_menu_action.invoke();

実行すると、「ファイル」→「開く...」を選択した時と同じように「開く」ダイアログが開く。
ASで言うところの"System Events"みたいなもの。だけど、ショートカットに頼らなくていい分、気が楽だ。
ここで手放しで喜んではいけない。
「開く...」メニューが
app.menuActions.item("開く...")
にアサインされているのは、日本語環境のみ。他言語では動かない。
外人さんが使う訳じゃないからいいや、という割り切りもあるかもしれないけれど、
そういうことではいけない。
ちゃんと各国語版で動くようにするためには、内部的に一意な参照を使う必要がある。
上の例だと、

var my_menu_action = app.menuActions.item("$ID/kPMOpenDocTextKey");
my_menu_action.invoke();

になる。これでロケールに依存しない(どの国でも使える)スクリプトになる。試してないけど^^
この「$ID/kPMOpenDocTextKey」をどうやって調べるか?

var my_str = "";
var my_key_string = app.findKeyStrings("開く...");
if (my_key_string.constructor.name == "Array") {
	for (var i = 0; i < my_key_string.length; i++) {
		my_str += my_key_string[i] + "?r";
	}
} else {
	my_str = my_key_string;
}
alert(my_str);
my_str;

で調べるとよい。サンプルプログラムの「GetKeyStrings.jsx」でも同様のことができる。
しかし、不思議なことに(?)すべてのメニューが調べられるわけじゃない。
「編集」は調べられるのに「書式」は調べられない。うーん。
調べられないものはどうやって調べようか...w

ちなみに、この一意な参照から、メニュー項目の名前を逆引きする方法もある。

var my_str2 = app.translateKeyString("$ID/kPMOpenDocTextKey");
alert(my_str2);
my_str2;