終了

Illustratorスクリプト:開いている全てのファイルに処理をしたい

積極的な参加者 ,
Feb 16, 2022 Feb 16, 2022

リンクをクリップボードにコピー

コピー完了

illustratorのスクリプトで開いてある全てのファイルに同じ処理をしていきたくて、下記のスクリプトでやってみましたが、一つのファイルだけ処理されないという結果になりました。

 

javascriptをそもそも理解していないのかもしれませんが、全力で調べてこの結果です。ご教授いただけると幸いです。

 

var docObj = app.documents;

for (i=0 ; i < docObj.length ; i++) {

    //何かの処理(ペーストとか簡単なもの)
    app.activeDocument = docObj [i];

};

 

キーワード
スクリプティング

表示

1.2K

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines

correct answers 1 件の正解

Community Expert , Feb 16, 2022 Feb 16, 2022

なにかの処理とactiveDocumentの行を入れ替えるとどうですか?

投票

翻訳

翻訳
Community Expert ,
Feb 16, 2022 Feb 16, 2022

リンクをクリップボードにコピー

コピー完了

なにかの処理とactiveDocumentの行を入れ替えるとどうですか?

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
積極的な参加者 ,
Feb 16, 2022 Feb 16, 2022

リンクをクリップボードにコピー

コピー完了

すみません、出来ました。

こんな簡単なことを気づけなくて恥ずかしいです。

心から感謝します。勉強します。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Feb 16, 2022 Feb 16, 2022

リンクをクリップボードにコピー

コピー完了

for文ではちゃんと全ドキュメントにアクセスできていますよ。

 

app.activeDocument = docObj[i];

 

いちいちドキュメントを最前面にせず、

 

var aDoc = docObj[i];
alert(aDoc.name);

 

docObj[i] を変数に代入してから処理をした方が良いかもしれません。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
積極的な参加者 ,
Feb 16, 2022 Feb 16, 2022

リンクをクリップボードにコピー

コピー完了

ありがとうございます。

確かにアラートだったらこれで出来たのですが、ペーストとかをやりたい場合はドキュメントを最前面にしないと出来ない感じでした。。

変数に代入するのとしないのとでは何が違うのかすら理解できていないので、勉強しておきます(汗)

 

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Feb 17, 2022 Feb 17, 2022

リンクをクリップボードにコピー

コピー完了

>ペーストとかをやりたい場合はドキュメントを最前面にしないと出来ない感じでした。。
あーなるほど。

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の配列にして、その配列からアクセスすると良いかも?

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
積極的な参加者 ,
Feb 18, 2022 Feb 18, 2022

リンクをクリップボードにコピー

コピー完了

ありがとうございます。

こういうやり方もあるんですね・・・知ってるコードを書いて満足してしまっていました。勉強になります。ありがとうございました。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Feb 16, 2022 Feb 16, 2022

リンクをクリップボードにコピー

コピー完了

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);

};

というのもあります。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
積極的な参加者 ,
Feb 17, 2022 Feb 17, 2022

リンクをクリップボードにコピー

コピー完了

わざわざ試していただきありがとうございます。

 

>app.activeDocument =  でどれかを前面に持ってくると順序が変わります。

 

そうなんですよね。そこが頭から抜けておりました。

スクリプトが思い通りに動いたものの、なぜ私が記述したもので不具合が起こるのかよく分からない状態でしたのでとても勉強になります。

 

別の例も出してくださり本当に感謝です。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Feb 17, 2022 Feb 17, 2022

リンクをクリップボードにコピー

コピー完了

基本的にアクティブな対象を操作するような構成は、ajabonさんご指摘のような事があるので筋が悪いです。できればmonokanoさんご指摘のような構成方法で処理を書く方が安全なものになるでしょう。どうしてもアクティブなドキュメントの処理が必要な場合は、最初にドキュメントコレクションを得たときに各ドキュメントのnameプロパティを取っておいてgetByNameでドキュメントを指定しながらループをまわすという手もあります。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
積極的な参加者 ,
Feb 18, 2022 Feb 18, 2022

リンクをクリップボードにコピー

コピー完了

最新

現在はまだmonokanoさんに書いていただいたものをただ使ってるって感じなので、理解しながら使わせていただきたいと思います。他にも方法があるということなので、追々別のものも書いてみたいと思います。ありがとうございました。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines