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

Photoshop JSXで1つ上を追加選択する|複数選択・同じ親・ID指定

現在のアクティブレイヤーと同じ親にある1つ上の要素を、元の選択へ追加するPhotoshop JSXです。既存の選択を先に1つへ置き換えず、隣接要素のIDとaddToSelectionで1回だけ選択を要求します。元が複数選択でも、基準にするのはapp.activeDocument.activeLayerの1要素です。

2026年10月16日に、Windows 11 Pro(10.0.26200)のPhotoshop 27.11.0(日本語表示)でこのページの全体コードを実行し、BとCを選んだ状態から、同じ親の1つ上にある非表示のAが選択に加わることを確かめました。

Photoshopで確かめたのはこの1つの条件だけで、単独選択、グループの中の子、同じ親の端、ロック、アートボードなどの実際の挙動は確かめていません。

コードはレイヤーの移動・名前変更・保存を呼びませんが、選択状態は変わります。

確かめていない条件で使うときは、自作の文書で実行前後の選択を比べてください。

目次

同じ親の隣接要素を対象にする理由

DOMのlayersの先頭はレイヤーパネルの上側です。現在の要素を親のlayersからIDで探し、添字を1引いた要素を対象にします。文書直下の要素なら親はDocument、グループの子ならそのグループです。グループ自体が選ばれている場合も、その親の一覧で隣を探します。グループの子へ自動で入りません。

対象の条件この例の扱い
同じ親の隣がグループグループ自体のIDを指定。内部の子は自動で複数選択しない。
隣が非表示・ロック候補には含める。選択可否と表示状態は実機で比較する。
同じ親の端・別の親にしか候補がない親の境界で停止し、別グループへ移らない。
背景・同名レイヤーDOMの添字から候補を探し、名前やAMのitemIndex±1では指定しない。
IDまたは選択一覧を読めない名前・AM番号へ自動で置き換えず停止する。
スポンサーリンク

複数選択を保つための追加要求

旧コードは最初に現在のレイヤーだけを選び直すため、元の複数選択のほかの要素を失う可能性があります。新例は最初の置き換えを除去し、追加の選択要求だけを実行します。対象が既に選択済みなら追加実行も行いません。activeLayerを「最後にクリックした行」や「複数選択の最上行」とは断定しません。期待した基準かを実行前に確認してください。

同じ親の1つ上を追加する全体コード

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

#target photoshop
(function () {
    if (app.documents.length === 0) { alert("文書を開いてください。"); return; }
    function validId(value) {
        return typeof value === "number" && isFinite(value) && value >= 0 && Math.floor(value) === value;
    }
    function selectedIds() {
        var key = stringIDToTypeID("targetLayersIDs");
        var ref = new ActionReference();
        ref.putProperty(charIDToTypeID("Prpr"), key);
        ref.putEnumerated(charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
        var result = executeActionGet(ref);
        if (!result.hasKey(key)) { throw new Error("選択IDの一覧を取得できません。"); }
        var list = result.getList(key);
        var ids = [];
        for (var i = 0; i < list.count; i++) {
            var id = list.getReference(i).getIdentifier();
            if (!validId(id)) { throw new Error("選択IDが数値の整数ではありません。"); }
            ids.push(id);
        }
        return ids;
    }
    function contains(ids, id) {
        for (var i = 0; i < ids.length; i++) { if (ids[i] === id) { return true; } }
        return false;
    }
    try {
        var ids = selectedIds();
        if (ids.length === 0) { alert("レイヤーを1つ以上選択してください。"); return; }
        var current = app.activeDocument.activeLayer;
        if (!validId(current.id) || !contains(ids, current.id)) {
            throw new Error("アクティブレイヤーと選択IDを照合できません。");
        }
        var siblings = current.parent.layers;
        var position = -1;
        for (var i = 0; i < siblings.length; i++) {
            if (siblings[i].id === current.id) {
                if (position !== -1) { throw new Error("同じIDが親の一覧に複数あります。"); }
                position = i;
            }
        }
        if (position < 0) { throw new Error("親の一覧にアクティブレイヤーがありません。"); }
        var targetPosition = position - 1;
        if (targetPosition < 0 || targetPosition >= siblings.length) {
            alert("同じ親の上に隣接要素がありません。選択を変更しません。"); return;
        }
        var targetId = siblings[targetPosition].id;
        if (!validId(targetId)) { throw new Error("隣接要素のIDを取得できません。"); }
        if (contains(ids, targetId)) { alert("上の隣接要素は既に選択されています。"); return; }
        var ref = new ActionReference();
        ref.putIdentifier(charIDToTypeID("Lyr "), targetId);
        var desc = new ActionDescriptor();
        desc.putReference(charIDToTypeID("null"), ref);
        desc.putBoolean(charIDToTypeID("MkVs"), false);
        desc.putEnumerated(stringIDToTypeID("selectionModifier"),
            stringIDToTypeID("selectionModifierType"), stringIDToTypeID("addToSelection"));
        executeAction(charIDToTypeID("slct"), desc, DialogModes.NO);
    } catch (error) {
        alert("読取または選択で中断: " + error.message + "\n行: " + error.line);
    }
}());

レイヤーIDと添字を混同しない

parent.layersの添字は、この親の中で位置を調べるためだけに使います。選択の指定にはputIdentifierを使い、targetIdを渡します。itemIndex、DOMの添字、layerIDは別の値です。LyrIの一覧へitemIndexをそのまま入れたり、背景の有無に合わせて独自に1を加減したりしません。

IDはこの実行中の文書で取得した値を使います。別文書へ持ち越す恒久的なIDとは扱いません。DOMのidやtargetLayersIDsが現在の版・対象で取得できなければ、選択前に中断します。2020年の公式資料だけで、すべての対象のid取得と現在の版の挙動を確認済みとはしていません。

自作PSDで確認する条件

入力の条件模擬条件で確認した処理・実機で確かめること
同じ親の上からA・B・CでBが基準Aへ追加要求
隣が非表示・同名・グループ名前やvisibleで候補を変更せず、そのIDを指定。実選択・表示を比較。
グループの子に隣があるその親だけの一覧で隣を指定。別の親へ飛ばない。
元が複数選択一覧を保持して1回追加要求。元の全IDが残るか実機で比較。
同じ親の端・ID不明・選択不整合選択要求前に停止。
executeActionの例外原文と行番号を表示。失敗時の状態を確認し、別対象で自動再試行しない。

実機では選択ID一覧とレイヤーパネルのハイライトを前後で比較し、表示・数・順序・名前も記録します。追加後に元の全IDと隣のIDがあることを確認してください。模擬検査で追加要求を確認しただけでは、Photoshopが全条件で保持した証拠にはなりません。複数選択の自動復元は含めていません。activeLayerだけを保存しても、元の全選択を復元したことにはなりません。

2026年10月16日にPhotoshopで確かめた結果

2026年10月16日に、Windows 11 Pro(10.0.26200)のPhotoshop 27.11.0(日本語表示)で、上の表の「元が複数選択」の条件を確かめました。

650×300pxの自作のPSDに、上から文字レイヤーのA・B・C、グループGROUP(中に通常のレイヤーCHILD)、背景を置いています。

Aは非表示にして、BとCを選び、アクティブレイヤーをBにしました。

PSDの作成と選択の準備、実行前後の選択IDの読み取りは、画面操作ではなく自動処理で行いました。

そのため、レイヤーパネルをクリックして複数選択を作る操作は、今回の確認に含めていません。

コードはこのページの全体コードを変えずに保存し、[ファイル]→[スクリプト]→[参照]から選んで1回実行しました。

PhotoshopのレイヤーパネルでBとCの2行が選択され、上にある非表示のAは選択されていない実行前の画面
2026-10-16撮影。Adobe Photoshop 27.11.0 (20260929.r.26 8c16e56)、Windows 11 Pro (10.0.26200)。実行前のレイヤーパネル。確認用に作った自作のPSDで、BとCを選び、アクティブレイヤーをBにした。上のAは非表示。画面のうちレイヤーパネルだけを切り出した。

実行すると通知やエラーは出ずに、元のBとCの選択が残ったまま、1つ上のAが選択に加わりました。

レイヤーパネルでは、ハイライトされた行がB・Cの2行から、A・B・Cの3行に増えています。

本文のコードを実行した後、A・B・Cの3行が選択され、Aの目のアイコンが付いていないPhotoshopのレイヤーパネル
2026-10-16撮影。Adobe Photoshop 27.11.0 (20260929.r.26 8c16e56)、Windows 11 Pro (10.0.26200)。本文の全体コードを[参照]から実行した後のレイヤーパネル。BとCを残したままAが選択に加わり、Aは非表示のまま。画面のうちレイヤーパネルだけを切り出した。
項目実行前実行後
選択されたレイヤー(ID)C(6)・B(8)C(6)・B(8)・A(10)
アクティブレイヤーBA
Aの表示非表示非表示
GROUPとCHILD選択なし選択なし
文書の未保存の変更なしなし
2026年10月16日、Windows 11 Pro(10.0.26200)/Photoshop 27.11.0/日本語UIで確認。650×300pxの自作PSDで、本文の全体コードを変えずに[参照]から実行した結果。IDはこの文書で読み取った値。

Aは非表示のまま選択に加わり、目のアイコンは付かず、カンバスにも表示されませんでした。

実行後のアクティブレイヤーは、基準にしたBから、追加したAに変わっています。

6つの要素の並び順、名前、表示、不透明度、範囲、文字の内容は、実行の前後で変わっていません。

IDの値はこの自作の文書で読み取った値で、ほかの文書へ持ち越せる値ではありません。

単独選択からの追加、背景のない文書、同じ名前のレイヤー、隣がグループの場合、グループの中の子、同じ親の端は、今回は確かめていません。

ロックしたレイヤー、アートボード、上の要素が既に選択済みの場合、IDを読めない場合や例外が出る場合も、今回は確かめていません。

続けてもう一度実行したとき、保存したPSDを開き直したときの選択、ほかの版での動作も確かめていません。

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

旧コードの初回slctは置き換え要求です。LyrIへ入れている値もitemIndexで、IDと同じ値とは保証できません。旧例を新コードへ追記しないでください。

function selectAddAboveLayer() {
    var groupStartIdx = getActiveLayerIndex();
    var groupEndIdx = groupStartIdx + 1; // 1つ上のレイヤーのインデックス

    function getActiveLayerIndex() {
        var ref = new ActionReference();
        ref.putProperty(charIDToTypeID("Prpr"), charIDToTypeID("ItmI"));
        ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
        var res = executeActionGet(ref).getInteger(charIDToTypeID("ItmI"));
        return res;
    }

    // 最上位のレイヤーを超えないようにチェック
    if (groupEndIdx > getMaxLayerIndex()) {
        alert("これ以上上にレイヤーはありません。");
        return;
    }

    var idslct = charIDToTypeID("slct");
    var desc270 = new ActionDescriptor();
    var idnull = charIDToTypeID("null");
    var ref210 = new ActionReference();
    var idLyr = charIDToTypeID("Lyr ");
    ref210.putIndex(idLyr, groupStartIdx);
    desc270.putReference(idnull, ref210);
    var idMkVs = charIDToTypeID("MkVs");
    desc270.putBoolean(idMkVs, false);
    var idLyrI = charIDToTypeID("LyrI");
    var list166 = new ActionList();
    list166.putInteger(groupStartIdx);
    desc270.putList(idLyrI, list166);
    executeAction(idslct, desc270, DialogModes.NO);

    var desc271 = new ActionDescriptor();
    var ref211 = new ActionReference();
    ref211.putIndex(idLyr, groupEndIdx);
    desc271.putReference(idnull, ref211);
    var idselectionModifier = stringIDToTypeID("selectionModifier");
    var idselectionModifierType = stringIDToTypeID("selectionModifierType");
    var idaddToSelection = stringIDToTypeID("addToSelection");
    desc271.putEnumerated(idselectionModifier, idselectionModifierType, idaddToSelection);
    desc271.putBoolean(idMkVs, false);
    var list167 = new ActionList();
    list167.putInteger(groupStartIdx);
    list167.putInteger(groupEndIdx);
    desc271.putList(idLyrI, list167);
    executeAction(idslct, desc271, DialogModes.NO);
}

// 最上位のレイヤーのインデックスを取得する関数
function getMaxLayerIndex() {
    var ref = new ActionReference();
    ref.putProperty(charIDToTypeID("Prpr"), charIDToTypeID("ItmI"));
    ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Frnt"));
    return executeActionGet(ref).getInteger(charIDToTypeID("ItmI"));
}

// スクリプトを実行
selectAddAboveLayer();
旧記事のぼかされたコード編集画面。下部のExecution finishedと結果undefinedだけでは、Photoshopの選択行・表示状態は確認できず、レイヤーパネルは写っていません。
旧記事のぼかされたコード編集画面。下部のExecution finishedと結果undefinedだけでは、Photoshopの選択行・表示状態は確認できず、レイヤーパネルは写っていません。 過去の掲載画像で、撮影日・Photoshopの詳細版は未確認です。

参照資料と確認範囲

Adobe Photoshop Scripting Guide 2020の38〜39ページ(レイヤーの並び順・グループ)、JavaScript Scripting Reference 2020のActionDescriptor、ActionList、ActionReference、Document、Layers、LayerSetを参照しています。2020年版のExtendScript資料で、今回のPhotoshop実機の検証記録ではありません。

Cutterman作者のレイヤー操作コードのtargetLayersIDsとID指定、Adobe CommunityのJJMack氏による選択追加の記録のselectionModifierを比較しました。作者の掲載例は公式の全条件保証ではなく、今回の実機成功や速度測定にも数えていません。Adobeのレイヤー選択手順で説明する行の選択と、サムネールからのピクセル選択は別です。

対象範囲が異なる選択

上への相対選択/下への相対選択はFrwr/Bckwの要求です。同じ親のDOM隣接と同じ結果を保証しません。名前から選ぶ場合は階層を含む名前選択を参照してください。

旧配布と関連する手順

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

スポンサーリンク

よくある質問:同じ親の1つ上のレイヤーを選択に追加する

このスクリプトでは何ができますか?

現在のアクティブレイヤーと同じ親にある1つ上の要素を、元の選択へ追加するPhotoshop JSXです。既存の選択を先に1つへ置き換えず、隣接要素のIDとaddToSelectionで1回だけ選択を要求します。

元が複数選択でも使えますか?

元が複数選択でも、基準にするのはアクティブレイヤー1要素です。旧コードは最初に現在のレイヤーだけを選び直すため、元の複数選択のほかの要素を失う可能性がありましたが、新例は最初の置き換えを除去し、追加の選択要求だけを実行します。2026年10月16日にPhotoshop 27.11.0で、BとCを選んだ状態から実行し、BとCを残したまま1つ上のAが加わることを確かめました。実行後のアクティブレイヤーは追加したAに変わります。複数選択の自動復元は含めていません。

「1つ上」とはどのレイヤーですか?

DOMのlayersの先頭はレイヤーパネルの上側です。現在の要素を親のlayersからIDで探し、添字を1引いた要素を対象にします。文書直下の要素なら親はDocument、グループの子ならそのグループです。グループ自体が選ばれている場合も、その親の一覧で隣を探し、グループの子へ自動で入ることはありません。

隣がグループだった場合や、端のレイヤーだった場合はどうなりますか?

隣がグループなら、グループ自体のIDを指定し、内部の子は自動で複数選択しません。同じ親の端や、別の親にしか候補がない場合は、親の境界で停止し、別グループへ移りません。ID不明や選択不整合の場合も、選択要求の前に停止します。

非表示やロックされたレイヤーも選択されますか?

隣が非表示・ロックの場合も候補には含めます。2026年10月16日の確認では、非表示のAが非表示のまま選択に加わりました。ロックしたレイヤーは確かめていないため、選択できるかどうかや表示状態は、自作の文書で実機を比較して確認してください。

レイヤーIDと添字を混同しないとはどういうことですか?

名前やAMのitemIndex±1では指定せず、DOMの添字から候補を探してIDで指定します。旧コードがLyrIへ入れている値もitemIndexで、IDと同じ値とは保証できません。旧例を新コードへ追記しないでください。

このコードはPhotoshopで動作確認されていますか?

2026年10月16日に、Windows 11 Pro(10.0.26200)のPhotoshop 27.11.0で、BとCの複数選択に、同じ親の1つ上にある非表示のAが加わることを1つの条件で確かめました。単独選択、グループの中の子、同じ親の端、ロック、アートボードなどのほかの条件は確かめていません。参照資料は2020年版のExtendScript資料で、実機の検証記録ではありません。コードはレイヤーの移動・名前変更・保存を呼びませんが、選択状態は変わるため、確かめていない条件では自作の文書で確認してください。

実機で確認するときは何を比較すればよいですか?

選択ID一覧とレイヤーパネルのハイライトを前後で比較し、表示・数・順序・名前も記録します。追加後に、元の全IDと隣のIDがあることを確認してください。最新の仕様は、Adobeの公式情報で確認してください。

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

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

Photoshopのおすすめ書籍

動作要件とPCの確認項目

周辺機器の優先度

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