終了

【Javascript】特定のレイヤー以外を削除する方法

積極的な参加者 ,
Jun 02, 2024 Jun 02, 2024

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

コピー完了

お世話になっております。

 

イラレで特定のレイヤーを削除するスクリプトを使用しています。

 

var targetLayers = ['レイヤーA', 'レイヤーB', 'レイヤーC'];//特定のレイヤー

for (var i = 0; i < docs.length; i++) {//開いている複数のファイルに対して実行する
    app.activeDocument = docs[i]; //次のファイルをアクティブにする

    var layers = app.activeDocument.layers;

        for (var j = 0; j < targetLayers.length; j++) {
            try {
                app.activeDocument.layers.getByName(targetLayers[j]).remove();//特定のレイヤーと同じレイヤーがあったら削除
            } catch (e) {}
        }
}

 

特定のレイヤーが複数あるので配列にしてそれと同じ名前のレイヤーを削除してる感じです。

 

もし配列内の特定のレイヤーは削除せず、配列内にあるもの以外のレイヤーを削除したい場合はどこを変えたら良いでしょうか?

 

よろしくお願いいたします。

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

表示

651

翻訳

翻訳

レポート

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

correct answers 2 件の正解

Community Expert , Jun 02, 2024 Jun 02, 2024

「以外」だとgetByName関数が使えなくなるので地道ループで名前比較しかなさそうですね。

もしくは、ロックがかかっていたら削除、とか非表示なら削除、と一時的なルールが使えるなら、

元のコードでgetByName関数でつかまえたレイヤーをロックなり非表示なりしておき、

あらためてdocs[i].layersで降順ループ、

if(doc.layers[k].locked == true)   または  if(doc.layers[k].visible == false)  などで捕まえて削除

とか。

投票

翻訳

翻訳
Community Expert , Jun 02, 2024 Jun 02, 2024

ajabonさんの指摘の通りストレートに落とすとこんな感じでしょうか。

 

var lys = app.activeDocument.layers;
var lst = ["レイヤー 2", "レイヤー 3", "レイヤー 4"];
var flg = false;
for (var i=lys.length-1;i>=0;i--) {
	for (var k=0;k<lst.length;k++){
 		if (lys[i].name==lst[k]) {
			flg = true;
			break;
			}
    	}
	if (!flg) lys[i].remove();
	flg = false;
	}

 

多分名前比較でストレートに記述するのが楽でわかりやすいかと思います。

 

投票

翻訳

翻訳
Community Expert ,
Jun 02, 2024 Jun 02, 2024

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

コピー完了

「以外」だとgetByName関数が使えなくなるので地道ループで名前比較しかなさそうですね。

もしくは、ロックがかかっていたら削除、とか非表示なら削除、と一時的なルールが使えるなら、

元のコードでgetByName関数でつかまえたレイヤーをロックなり非表示なりしておき、

あらためてdocs[i].layersで降順ループ、

if(doc.layers[k].locked == true)   または  if(doc.layers[k].visible == false)  などで捕まえて削除

とか。

投票

翻訳

翻訳

レポート

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

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

コピー完了

ありがとうございます。

一時的なルールが使えなかったので、地道ループにしようと思います!

投票

翻訳

翻訳

レポート

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

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

コピー完了

ajabonさんの指摘の通りストレートに落とすとこんな感じでしょうか。

 

var lys = app.activeDocument.layers;
var lst = ["レイヤー 2", "レイヤー 3", "レイヤー 4"];
var flg = false;
for (var i=lys.length-1;i>=0;i--) {
	for (var k=0;k<lst.length;k++){
 		if (lys[i].name==lst[k]) {
			flg = true;
			break;
			}
    	}
	if (!flg) lys[i].remove();
	flg = false;
	}

 

多分名前比較でストレートに記述するのが楽でわかりやすいかと思います。

 

投票

翻訳

翻訳

レポート

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

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

コピー完了

ありがとうございます。

flg = falseって書き方を学びました。

lst内の名前と一致したらtrueになってスルーして、一致しなかったら削除するって感じですか?

 

投票

翻訳

翻訳

レポート

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

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

コピー完了

最新
名前のチェックをループで行い、その名前がある場合はフラグを立てたうえで名前のチェックループを抜け、全体のループではフラグが立っていない=名前がなかった場合だけレイヤーを削除するという処理の流れになります。
レイヤー配列自体を取り扱いますから、途中でレイヤーを削除するとループのインデックスに影響が出ます。これを避けるためにループを後ろからまわすという事を行っている点にもご注意を。

投票

翻訳

翻訳

レポート

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