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;
}
参照資料と確認範囲
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として保存してください。





