終了

[スクリプト ] 指定のレイヤーが存在しない場合、レイヤーを作成したい

Community Beginner ,
Oct 17, 2020 Oct 17, 2020

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

コピー完了

こんにちは!
スクリプトでレイヤーを作成したいのですが、作成したいレイヤー名のレイヤーが存在する場合は作成しない、というスクリプトを作成したのですが動作しません。
オブジェクト(キー)の存在チェックはif文で論理否定演算子を使いましたが、これで合っているかも分かりません。
よろしくお願いいたします。
 
var LAYS = app.activeDocument.layers;
 
if (!LAYS['レイヤー名']) {
var newLay = LAYS.add();
newLay.name = 'レイヤー名';
}
 
キーワード
スクリプティング

表示

1.5K

翻訳

翻訳

レポート

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

correct answers 3 件の正解

Community Expert , Oct 18, 2020 Oct 18, 2020

こんな感じ?

// 名称「001」のレイヤーがなければ、「001」レイヤーを新規追加する
if(!hasLayer(app.activeDocument,"001")){
	var LAYS = app.activeDocument.layers;
	var newLay = LAYS.add();
	newLay.name = "001";
}

// その名称のレイヤーがあるかどうか
function hasLayer(docObj,layerName){
    var layObj = docObj.layers;
    for (i=0; i<layObj.length; i++){
        if(layObj[i].name == layerName){
            return true;
        }
    }
}

投票

翻訳

翻訳
Community Expert , Oct 18, 2020 Oct 18, 2020

面白そうなので調べてみました。

一応 Layers.getByName(name) というメソッドがあるのですが、このメソッド、レイヤーがない場合にエラーになるというとんでも仕様でした(普通はnullを返すとかになるんですが)。

なのでこれを使った場合は

var lays = app.documents[0].layers;
try {
  //存在する場合
  var newLay = lays.getByName('レイヤー名');
} catch(e) {
  //存在しない場合
  var newLay = lays.add();
  newLay.name = 'レイヤー名';
}

このようにtry文を使わないといけません。ひどい……

投票

翻訳

翻訳
Community Beginner , Oct 19, 2020 Oct 19, 2020

ご返信ありがとうございます!

仰るようにLayersコレクションの中身を1つずつチェック→有無のフラグを作成、とすることでやりたいことが出来ました。

投票

翻訳

翻訳
Community Expert ,
Oct 18, 2020 Oct 18, 2020

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

コピー完了

コード走らせられない状況なのでなんのチェックもしてませんが、連想配列的な事は出来ないのではないかと思います。ループしてLayersコレクションの中身一つづつチェックしないとダメだと思います。

投票

翻訳

翻訳

レポート

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

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

コピー完了

ご返信ありがとうございます!

仰るようにLayersコレクションの中身を1つずつチェック→有無のフラグを作成、とすることでやりたいことが出来ました。

投票

翻訳

翻訳

レポート

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

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

コピー完了

こんな感じ?

// 名称「001」のレイヤーがなければ、「001」レイヤーを新規追加する
if(!hasLayer(app.activeDocument,"001")){
	var LAYS = app.activeDocument.layers;
	var newLay = LAYS.add();
	newLay.name = "001";
}

// その名称のレイヤーがあるかどうか
function hasLayer(docObj,layerName){
    var layObj = docObj.layers;
    for (i=0; i<layObj.length; i++){
        if(layObj[i].name == layerName){
            return true;
        }
    }
}

投票

翻訳

翻訳

レポート

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

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

コピー完了

ご返信ありがとうございます!

関数の戻り値をboolean型にして条件分岐に使用するのは思いつきませんでした。

とても勉強になりました。

ありがとうございます。

投票

翻訳

翻訳

レポート

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

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

コピー完了

面白そうなので調べてみました。

一応 Layers.getByName(name) というメソッドがあるのですが、このメソッド、レイヤーがない場合にエラーになるというとんでも仕様でした(普通はnullを返すとかになるんですが)。

なのでこれを使った場合は

var lays = app.documents[0].layers;
try {
  //存在する場合
  var newLay = lays.getByName('レイヤー名');
} catch(e) {
  //存在しない場合
  var newLay = lays.add();
  newLay.name = 'レイヤー名';
}

このようにtry文を使わないといけません。ひどい……

投票

翻訳

翻訳

レポート

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

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

コピー完了

ご返信ありがとうございます!

getByNameメソッドなるものがあるのですね。

調べ方が甘く申し訳ありません。

 

仰るようにnullやundefinedではなくエラーを返すとは、なかなか使いにくいメソッドですね。

しかしtry文を使用することでループと条件分岐の組み合わせで書くより、コードの可読性は高くなると思いました。

投票

翻訳

翻訳

レポート

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

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

コピー完了

最新
アドバイスをもとに関数化してみましたので共有させていただきます。
かなりスッキリとしたコードになりました。
ありがとうございます。
 
function addLayer(layName) {
var LAYS = app.activeDocument.layers
try {
LAYS.getByName(layName);
} catch (e) {
var newLay = LAYS.add();
newLay.name = layName;
}
}

投票

翻訳

翻訳

レポート

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