リンクをクリップボードにコピー
コピー完了
お世話になっております。
イラレで特定のレイヤーを削除するスクリプトを使用しています。
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) {}
}
}
特定のレイヤーが複数あるので配列にしてそれと同じ名前のレイヤーを削除してる感じです。
もし配列内の特定のレイヤーは削除せず、配列内にあるもの以外のレイヤーを削除したい場合はどこを変えたら良いでしょうか?
よろしくお願いいたします。
「以外」だとgetByName関数が使えなくなるので地道ループで名前比較しかなさそうですね。
もしくは、ロックがかかっていたら削除、とか非表示なら削除、と一時的なルールが使えるなら、
元のコードでgetByName関数でつかまえたレイヤーをロックなり非表示なりしておき、
あらためてdocs[i].layersで降順ループ、
if(doc.layers[k].locked == true) または if(doc.layers[k].visible == false) などで捕まえて削除
とか。
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;
}
多分名前比較でストレートに記述するのが楽でわかりやすいかと思います。
リンクをクリップボードにコピー
コピー完了
「以外」だとgetByName関数が使えなくなるので地道ループで名前比較しかなさそうですね。
もしくは、ロックがかかっていたら削除、とか非表示なら削除、と一時的なルールが使えるなら、
元のコードでgetByName関数でつかまえたレイヤーをロックなり非表示なりしておき、
あらためてdocs[i].layersで降順ループ、
if(doc.layers[k].locked == true) または if(doc.layers[k].visible == false) などで捕まえて削除
とか。
リンクをクリップボードにコピー
コピー完了
ありがとうございます。
一時的なルールが使えなかったので、地道ループにしようと思います!
リンクをクリップボードにコピー
コピー完了
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;
}
多分名前比較でストレートに記述するのが楽でわかりやすいかと思います。
リンクをクリップボードにコピー
コピー完了
ありがとうございます。
flg = falseって書き方を学びました。
lst内の名前と一致したらtrueになってスルーして、一致しなかったら削除するって感じですか?
リンクをクリップボードにコピー
コピー完了