Amazonで商品を見るセール会場へ

Photoshop JSXでレイヤー名から選択する|文書直下・同名・不在の扱い

Photoshopの文書直下にあるレイヤーまたはグループを、名前の完全一致で1つ選ぶJSXです。グループ内へ再帰検索せず、同名が2件以上ある場合は選択を変更せず停止します。グループ内の子・孫を探す場合は、階層を含めて名前で選択する記事を使います。

今回確認したのは標準JavaScriptの構文と模擬条件です。Photoshopでの選択・表示・実画面の撮影は未検証です。コードはレイヤーの移動・名前変更・保存を呼びませんが、選択状態は変わります。非表示、ロック、複数選択、アートボードの実際の挙動は自作の文書で確認してください。

目次

doc.layers.getByNameが探す範囲

doc.layersは文書直下のArtLayerとLayerSetを含むコレクションです。グループの子はそのグループのlayersで取得します。getByNameは指定したコレクションで最初に一致した要素を返すため、同名の別要素まで一意に指定したことにはなりません。

指定対象
doc.layers文書直下のレイヤーとグループ。子・孫は含めて検索しない。
doc.artLayers文書直下のArtLayer。グループ自体を対象にしない。
group.layers指定したグループ直下のレイヤーとグループ。
名前の比較この新例は===による完全一致。部分一致・正規表現・自動の空白除去は行わない。

文書直下で一致が1件のときだけ選択するコード

新しい全体コードをUTF-8の.jsxとして保存し、ファイル→スクリプト→参照から実行します。旧コードへ追記せず、別ファイルとして1回実行してください。メニューへの登録は動作を確認した後に行います。

targetNameのCGM_targetだけを対象の名前へ変更します。候補を読み終えてから選ぶため、不在や同名で停止した場合はactiveLayerへ代入しません。グループも同名検索の候補に含めます。

#target photoshop
(function () {
    if (app.documents.length === 0) { alert("文書を開いてください。"); return; }
    try {
        var doc = app.activeDocument;
        var targetName = "CGM_target";
        var matches = [];
        for (var i = 0; i < doc.layers.length; i++) {
            if (doc.layers[i].name === targetName) { matches.push(doc.layers[i]); }
        }
        if (matches.length !== 1) {
            alert("文書直下の一致: " + matches.length + "件。選択を変更しません。");
            return;
        }
        doc.activeLayer = matches[0];
    } catch (error) {
        alert("読取または選択で中断: " + error.message + "\n行: " + error.line);
    }
}());

自作サンプルで確認する条件

配置・条件このコードの期待値
文書直下にCGM_targetが1つその行を選ぶ。
CGM_targetはグループ内だけ文書直下では0件となり、現在の選択を保持。
直下にCGM_targetが2つ2件で停止し、どちらも推測して選ばない。
同名が直下とグループ内に1つずつ直下の1件だけを対象にする。階層全体の重複検査ではない。
CGM_targetというグループが直下に1つグループ自体を選ぶ。子を自動で全部選択しない。

実機確認では、名前・階層・選択行を撮影し、非表示レイヤーの表示状態、元の複数選択、レイヤー数と順序を前後で比較します。選択を戻す場合は、実行前に選ばれていた行を記録して手動で戻します。activeLayerを保存するだけで複数選択全体を復元したとは扱いません。

見つからない・選べないときの切り分け

症状確認すること
文書を開いてくださいPSDなどの文書を開く。文書取得より先にapp.documents.lengthを検査する。
一致0件検索範囲、名前の大文字小文字・全角半角・前後の空白を確認。背景の名前は言語や改名で変わる。
同名で停止名前だけでは対象を一意に決められない。親グループを指定するか、一意な名前へ整理してから実行する。
読取または選択で例外error.messageと行番号を記録。不在と断定しない。文書切替・閉じる操作・対象の状態を確認してから再実行する。

表示確認では、選択した行のハイライトとレイヤー名を記録します。レイヤーを選ぶ操作は不透明ピクセルの選択範囲を作る操作とは別です。選択後の処理を追加する前に、期待した対象だけを選んだことを確認してください。

旧コードと過去の画面(参照用)

旧コードは文書取得前の文書数検査がありません。getByNameの例外をすべて「存在しない」と表示するため、読取失敗を区別できません。新例は文書数と一致件数を先に検査します。

// 現在のドキュメントを取得
var doc = app.activeDocument;

// レイヤーを指定して取得する関数
function getLayerByName(layerName) {
    try {
        return doc.layers.getByName(layerName);
    } catch (e) {
        alert("レイヤー名 '" + layerName + "' は存在しません。");
        return null;
    }
}

// 指定したレイヤー名を取得(デフォルトは "背景")
var targetLayer = getLayerByName("背景");

if (targetLayer) {
    doc.activeLayer = targetLayer;
}
旧記事のコード編集画面。下部にExecution finishedとArtLayer 背景が表示されています。Photoshopのレイヤーパネルやグループ内の検索結果は写っていません。
旧記事のコード編集画面。下部にExecution finishedとArtLayer 背景が表示されています。Photoshopのレイヤーパネルやグループ内の検索結果は写っていません。 過去の掲載画像で、撮影日・Photoshopの詳細版は未確認です。

参照資料と確認範囲

Adobe Photoshop Scripting Guide 2020の38〜39ページ(並び順・レイヤーセット)、JavaScript Scripting Reference 2020のDocument、ArtLayers、Layers、LayerSetを参照しています。2020年版のExtendScript資料で、現在のPhotoshopで実機確認した記録ではありません。

Adobeのレイヤー選択手順ではパネルでの選択と、サムネールからのピクセル選択を区別しています。UXPのLayers資料は別の実行環境です。このJSXを.psjsに改名するだけでは移行できません。UXPスクリプトの実行方法で分担を確認してください。

旧配布と関連する手順

旧配布はGitHubの元コードに残しています。公開フォルダーの01.jsは今回の新しい例へ更新していません。実行する場合は、このページの新しい全体コードを別の.jsxとして保存してください。

次に学ぶ・作業環境を選ぶ

学習を続けたい方や、作業環境を整えたい方は、目的に合うガイドをご覧ください。

Photoshopのおすすめ書籍

動作要件とPCの確認項目

周辺機器の優先度

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次