2013年4月26日金曜日

Photoshop.Application.DoJavaScriptをjscript(jsxではない)から呼び出す時に嵌ったのでメモ

Photoshopを外部スクリプトから操作するとき

var app = new ActiveXObject('Photoshop.Application');

とPhotoshopオブジェクトを作っておいて

app.DoJavaScriptを呼び出すのですが、外部のスクリプトから引数を渡さなければ
問題ないのですが、引数を渡したいときに嵌った。
引数は第二パラメータに配列で渡す必要があるので以下のようなコードを書いた。

app.DoJavaScript("alert('Hello World!:' + arguments[0]);", ['引数1'], 1);

これを実行すると、「無効な引数 - 引数2 - 配列が必要」というエラーが発生してしまう。
JavaScriptの配列はCOMでは配列扱いにしてくれない臭い。

同じようなことをVBScriptで書いた場合、すんなりと動いてしまう。。。。


Dim app
Set app = CreateObject("Photoshop.Application")
Dim arg
arg = Array("引数1", "2")
app.DoJavaScript "alert('Hello World!' + arguments[0]);", arg, 1

実行するとPhotoshop上で「Hello World! 引数1」とメッセージが表示される。
VBScriptの配列はCOMの配列として扱ってくれるようだ。

これを解決するために以下の様な関数を作ってみた。

function toVBArray(arry)
{
var dic = new ActiveXObject("Scripting.Dictionary");
for(var i = 0; i < arry.length; ++i) {
dic.add(i, arry[i]);
}
return dic.Items();
}


JScriptの配列をVBScript互換の配列に変換したい場合、一旦Dictionaryを経由すれば良いらしい。
先ほどのDoJavaScriptの呼び出しコードを以下のように変更する。

app.DoJavaScript("alert('Hello World!:' + arguments[0]);", toVBArray(['引数1']), 1);

これで無事に引数を渡すことができた!!

0 件のコメント: