DTPab

DTPにまつわるあれこれ

実行しているドキュメントの判定とスクリプトの再実行

現在アクティブなドキュメントに対してスクリプトを実行したあと、そのスクリプトを再度実行する際、アクティブなドキュメントが前回と同じかそうでないかを判定するにはどうしたらいいか? という話を同僚から相談されました。
実は以前こんな記事を書いているんですが。

uske-s.hatenablog.com

ただこれはこれで汎用性に乏しい気がしたので、改めて書いてみることにします。というのが今回の記事です。

サンプルコード

//@targetengine "session"
var curDocID = app.activeDocument.id;
var exDocID = exDocID || undefined;

if (curDocID !== exDocID) {
    alert("1回目の実行、もしくは前面ドキュメントが変わりました");
} else {
    alert("前回と同じドキュメントです");
}

exDocID = curDocID;

コード解説

targetengineを指定

前提として、実行されるスクリプトが変数の値を記憶して終了しないといけません。
したがってtargetengineの指定が必須になります*1

論理OR演算子を使う

前述の記事にも書きましたが、こういうケースでは僕は論理OR演算子||を使うのが好きです。
論理OR演算子についてはこの記事のほうがわかりやすいかも。

uske-s.hatenablog.com

ドキュメントの特定にはDocument.idを使う

ドキュメントを一意に特定するには、Document.idがお誂え向きでしょう。

var curDocID = app.activeDocument.id;
var exDocID = exDocID || undefined;

変数curDocIDには現在の前面ドキュメントのIDを格納します。
一方、変数exDocIDには(既に実行されていれば)格納されていた自身の値、そうでなければundefinedが入ることになります。

スクリプトの最後にドキュメントのIDを保持する

exDocID = curDocID;

最後にexDocIDに前面ドキュメントのIDを格納しておくことで、スクリプトが再び実行された際、前面ドキュメントのIDと比較できるようになります。

応用次第ではいろいろ

今回はドキュメントを比較することにしましたが、同じ理屈でテキストフレームを比較したり、仕事をフォルダで管理しているならファイルパスを比較したりして、スクリプト実行時に前回実行時との状況の変化を捉えることができます。
意外と使いどころがあると思うので、いろいろ試してみてはいかがでしょうか。

*1:外部ファイルの読み込みなどを利用すればtargetengineすら不要ですが今回は割愛。