リンクをクリップボードにコピー
コピー完了
illustratorのスクリプトで開いてある全てのファイルに同じ処理をしていきたくて、下記のスクリプトでやってみましたが、一つのファイルだけ処理されないという結果になりました。
javascriptをそもそも理解していないのかもしれませんが、全力で調べてこの結果です。ご教授いただけると幸いです。
var docObj = app.documents;
for (i=0 ; i < docObj.length ; i++) {
//何かの処理(ペーストとか簡単なもの)
app.activeDocument = docObj [i];
};
リンクをクリップボードにコピー
コピー完了
なにかの処理とactiveDocumentの行を入れ替えるとどうですか?
リンクをクリップボードにコピー
コピー完了
すみません、出来ました。
こんな簡単なことを気づけなくて恥ずかしいです。
心から感謝します。勉強します。
リンクをクリップボードにコピー
コピー完了
for文ではちゃんと全ドキュメントにアクセスできていますよ。
app.activeDocument = docObj[i];
いちいちドキュメントを最前面にせず、
var aDoc = docObj[i];
alert(aDoc.name);
docObj[i] を変数に代入してから処理をした方が良いかもしれません。
リンクをクリップボードにコピー
コピー完了
ありがとうございます。
確かにアラートだったらこれで出来たのですが、ペーストとかをやりたい場合はドキュメントを最前面にしないと出来ない感じでした。。
変数に代入するのとしないのとでは何が違うのかすら理解できていないので、勉強しておきます(汗)
リンクをクリップボードにコピー
コピー完了
>ペーストとかをやりたい場合はドキュメントを最前面にしないと出来ない感じでした。。
あーなるほど。
var docObj = app.documents;
var arrTmp = []; //空の配列を用意する
// arrTmpの要素に追加していく
for (i=0 ; i < docObj.length ; i++) {
arrTmp.push(docObj[i]);
};
// arrTmpからアクセスする
for (i=0 ; i < arrTmp.length ; i++) {
app.activeDocument = arrTmp[i];
alert(arrTmp[i].name);
};
docObjはapp.documentsのポインタになるので、JavaScriptの配列にして、その配列からアクセスすると良いかも?
リンクをクリップボードにコピー
コピー完了
ありがとうございます。
こういうやり方もあるんですね・・・知ってるコードを書いて満足してしまっていました。勉強になります。ありがとうございました。
リンクをクリップボードにコピー
コピー完了
2021でちょっとやってみたですが、
var docObj = app.documents;
for (i=0 ; i < docObj.length ; i++) {
alert(docObj[i].name);
app.activeDocument = docObj [i];
};
これだとひととおり処理されました。
var docObj = app.documents;
for (i=0 ; i < docObj.length ; i++) {
app.activeDocument = docObj [i];
alert(docObj[i].name);
};
このように行を入れ替えてみたら、最初に前面にあるドキュメントしか処理されませんでした。
これで手元の不具合と条件合ってるでしょうか?
documents配列にはドキュメントが一定の順序で入っているんですが、
app.activeDocument = でどれかを前面に持ってくると順序が変わります。
で、変数 i が1ずつ加算されていくのと並行して最初に[0]にいたドキュメントが1つずつ背面に送られていくので、ずっと同じドキュメントを相手にする結果となります。
この流れを確認するやつ書きました。試してみてください。
var docObj = app.documents;
for (i=0 ; i < docObj.length ; i++) {
app.activeDocument = docObj [i];
//確認
str = "i = " + i + "\n";
for(j=0 ; j < docObj.length ; j++) {
str += "[" + j + "] = " + docObj[j].name + "\n";
}
alert(str);
};
とかだらだら書いてる間に正解出たようですが……
・変数 i のループを降順(後ろから)にする
var docObj = app.documents;
for (i=docObj.length - 1 ; i >= 0 ; i--) {
app.activeDocument = docObj [i];
//確認
str = "i = " + i + "\n";
for(j=0 ; j < docObj.length ; j++) {
str += "[" + j + "] = " + docObj[j].name + "\n";
}
alert(str);
};
というのもあります。
リンクをクリップボードにコピー
コピー完了
わざわざ試していただきありがとうございます。
>app.activeDocument = でどれかを前面に持ってくると順序が変わります。
そうなんですよね。そこが頭から抜けておりました。
スクリプトが思い通りに動いたものの、なぜ私が記述したもので不具合が起こるのかよく分からない状態でしたのでとても勉強になります。
別の例も出してくださり本当に感謝です。
リンクをクリップボードにコピー
コピー完了
基本的にアクティブな対象を操作するような構成は、ajabonさんご指摘のような事があるので筋が悪いです。できればmonokanoさんご指摘のような構成方法で処理を書く方が安全なものになるでしょう。どうしてもアクティブなドキュメントの処理が必要な場合は、最初にドキュメントコレクションを得たときに各ドキュメントのnameプロパティを取っておいてgetByNameでドキュメントを指定しながらループをまわすという手もあります。
リンクをクリップボードにコピー
コピー完了
現在はまだmonokanoさんに書いていただいたものをただ使ってるって感じなので、理解しながら使わせていただきたいと思います。他にも方法があるということなので、追々別のものも書いてみたいと思います。ありがとうございました。