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

Photoshopスクリプト(jsx)│レイヤーの一番上にある効果レイヤーを各パーツレイヤーに適用する方法

Photoshopで最上位にある効果レイヤーをパーツ分けされた各レイヤーへ適用するスクリプトを紹介します。

キャラクターイラストの仕上げやLive2Dのパーツ作成に役立ちます。

2026年10月19日に、Photoshop 2026(27.11.0)とWindows 11 Proで記事のコードを実行し、効果レイヤーが各パーツにどう結合されるかを確かめました。

結果と注意点は「Photoshop 2026で実行した結果」にまとめています。

目次

スクリプトを使用するメリット

  • 効果レイヤーをパーツ分けされた各レイヤーへ一括適用できる
  • 手作業では手間がかかる大量のパーツ処理を自動化できる
  • スクリプトを調整すれば特定のレイヤーのみへの適用にも対応できる

注意点

  • 結合先のレイヤーが非表示だと適用できないため、事前に表示状態を確認しておくこと
  • 実行前に必ずPSDを複製し、効果レイヤーと結合先の名前が重複していないか確認すること

最上位の効果レイヤーを各レイヤーに適用する手順

本スクリプトを使用すると、各パーツレイヤーに効果レイヤーを個別に適用して統合できます。

STEP.1 スクリプトを保存

  1. 下記のコードをテキストエディタ等に貼り付けて保存します。

ConbineLayer.jsx

app.bringToFront();

if (app.documents.length === 0) {
    // ドキュメントが開かれていない場合は処理をしない。
} else {
    var doc = activeDocument;
    
    // グローバルなレイヤーリスト(全レイヤー、選択レイヤー、結合対象レイヤー)
    var allLayers = [];
    var selectedLayers = [];
    var targetLayers = [];

    // 全レイヤーを再帰的に収集
    collectAllLayers(doc);

    // 選択レイヤーを取得
    collectSelectedLayers(selectedLayers);

    // 全レイヤーから選択レイヤーを除外し、結合対象レイヤーを決定
    filterTargetLayers(targetLayers);

    if (selectedLayers == null || allLayers == null) {
        alert("結合させるレイヤーを選択してください。\n処理をキャンセルします。");
    } else {
        // 結合対象レイヤーに非表示レイヤーがある場合は処理中断
        var allVisible = true;
        for (var i = 0; i < targetLayers.length; i++) {
            if (!targetLayers[i].visible) {
                allVisible = false;
                break;
            }
        }
        if (!allVisible) {
            alert("結合対象のレイヤーに非表示のレイヤーがあります。\n非表示レイヤーは結合できませんので、削除するか表示状態にしてください。\n\n処理をキャンセルします。");
        } else {
            var message = "";
            for (var i = 0; i < selectedLayers.length; i++) {
                message += selectedLayers[i].name + " [" + (selectedLayers.length - i) + "]\n";
            }
            message += "をすべてのレイヤーに結合します。([]内の数字は結合順)\n\nよろしいですか?\n\n【注意】\n結合させたい効果レイヤーは全てレイヤーの一番上に配置してください。";

            if (confirm(message)) {
                doc.suspendHistory("結合処理", "mergeLayers()");
                alert("結合が完了しました。\n効果レイヤーは非表示にしています。");
            } else {
                alert("処理がキャンセルされました。");
            }
        }
    }
}

// 各結合対象レイヤーに対して、選択レイヤーを複製・移動・結合する
function mergeLayers() {
    for (var i = 0; i < targetLayers.length; i++) {
        var backIndex = selectedLayers.length - 1;
        for (var j = 0; j < selectedLayers.length; j++) {
            selectedLayers[backIndex - j].duplicate();
            doc.activeLayer = activeDocument.layers[backIndex - j];
            activeDocument.layers[backIndex - j].move(targetLayers[i], ElementPlacement.PLACEBEFORE);

            try {
                // レイヤークリッピング処理
                var idGrpL = charIDToTypeID("GrpL");
                var desc = new ActionDescriptor();
                var idnull = charIDToTypeID("null");
                var ref = new ActionReference();
                var idLyr = charIDToTypeID("Lyr ");
                var idOrdn = charIDToTypeID("Ordn");
                var idTrgt = charIDToTypeID("Trgt");
                ref.putEnumerated(idLyr, idOrdn, idTrgt);
                desc.putReference(idnull, ref);
                executeAction(idGrpL, desc, DialogModes.NO);
            } catch (e) {
                // クリッピング処理失敗時は無視
            }
            doc.activeLayer.merge();
        }
    }
    // 結合後、元の選択レイヤーを非表示にする
    for (var i = 0; i < selectedLayers.length; i++) {
        selectedLayers[i].visible = false;
    }
}

// 選択レイヤーを収集(グループ化イベントを利用)
function collectSelectedLayers(selectedLayersArray) {
    if (doc.activeLayer) {
        var idGrp = stringIDToTypeID("groupLayersEvent");
        var descGrp = new ActionDescriptor();
        var refGrp = new ActionReference();
        refGrp.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
        descGrp.putReference(charIDToTypeID("null"), refGrp);
        executeAction(idGrp, descGrp, DialogModes.ALL);

        for (var i = 0; i < doc.activeLayer.layers.length; i++) {
            selectedLayersArray.push(doc.activeLayer.layers[i]);
        }
        undoAction();
    }
}

// アクションを元に戻す
function undoAction() {
    executeAction(charIDToTypeID("undo"), undefined, DialogModes.NO);
}

// 全レイヤーから選択レイヤーを除外し、結合対象のレイヤーリストを作成
function filterTargetLayers(targetLayersArray) {
    for (var i = 0; i < allLayers.length; i++) {
        var isSelected = false;
        for (var j = 0; j < selectedLayers.length; j++) {
            if (allLayers[i].name === selectedLayers[j].name) {
                isSelected = true;
                break;
            }
        }
        if (!isSelected) {
            targetLayersArray.push(allLayers[i]);
        }
    }
}

// 再帰的に全レイヤーを収集
function collectAllLayers(layerContainer) {
    var childLayers = layerContainer.layers;
    for (var i = 0; i < childLayers.length; i++) {
        if (childLayers[i].typename === "LayerSet") {
            // レイヤーセットの場合は再帰処理
            collectAllLayers(childLayers[i]);
        } else if (childLayers[i].typename === "ArtLayer") {
            allLayers.push(childLayers[i]);
        }
    }
}
  1. ConbineLayer.jsx を以下のフォルダに保存します。
C:\Program Files\Adobe\Adobe Photoshop CC\Presets\Scripts\

上のパスは古い版の表記です。

Photoshop 2026(Windows)では、C:\Program Files\Adobe\Adobe Photoshop 2026\Presets\Scripts にこのフォルダーがあります。

2026年10月の確認では、このフォルダーへの配置と再起動は試していません。

  1. Photoshopを再起動します。

STEP.2 スクリプトを実行

  1. [ファイル] → [スクリプト] → [ConbineLayer] を選択します。
  2. 各パーツレイヤーに効果レイヤーが適用されます。

実行する前に、レイヤーパネルで一番上にある効果レイヤーを選んでおきます。

選んだレイヤーを「効果レイヤー」とし、グループ内も含むArtLayerを結合先の候補にします。ただし除外判定はレイヤーのIDではなく名前です。効果レイヤーと同名のパーツも対象から外れるため、先に名前を区別してください。文字・調整レイヤーなどへの適用は未確認です。

効果レイヤーが2枚以上あるときは、全部を選んでから実行します。

Scriptsフォルダーに置かなくても、[ファイル]→[スクリプト]→[参照]で保存したファイルを選べば実行できました。

実行すると「スクリプト警告」という確認の窓が開き、選んだ効果レイヤーの名前と結合の順番が表示されます。

スクリプト警告の窓に、光 [2]、影 [1] をすべてのレイヤーに結合します、よろしいですか、と表示され、はいといいえのボタンがある画面
2026-10-19撮影。Adobe Photoshop 2026 (27.11.0)、Windows 11 Pro (10.0.26200)。[参照]から実行したときの確認の窓。選んだ効果レイヤーの名前と結合の順番が出る。

[はい]を押すと結合が始まり、終わると「結合が完了しました。効果レイヤーは非表示にしています。」という窓が出ました。

コードでは、[いいえ]を押すと「処理がキャンセルされました。」と表示して終わる作りです([いいえ]は今回は試していません)。

Photoshopに関するほかの操作解説は、関連記事から確認できます。

Photoshop 2026で実行した結果

2026年10月19日に、Photoshop 2026(27.11.0)とWindows 11 Proで、上のコードをConbineLayer.jsxとして保存し、[ファイル]→[スクリプト]→[参照]から実行しました。

練習用のファイルと、効果レイヤーを選んだ状態は別のスクリプトで用意したので、確認には含めていません。

実行前:一番上に効果レイヤーを2枚置いた

白いカンバスに茶色の髪、肌色の顔、青い服の図形があり、黄色い円と紫の三角形が重なっている画面と、光・影・髪・顔・体が並んだレイヤーパネル
2026-10-19撮影。Adobe Photoshop 2026 (27.11.0)、Windows 11 Pro (10.0.26200)。実行前の練習用ファイル。一番上の「光」(スクリーン)と「影」(乗算)を選んでいる。

1000×700ピクセルの文書に、パーツとして「髪」「顔」、グループ「体」の中の「服」、背景を置きました。

一番上には、描画モードを乗算にした「影」と、スクリーンにした「光」の2枚の効果レイヤーがあり、この2枚を選んでいます。

効果レイヤーが非表示になり、見た目はそのまま残った

実行前と同じ見た目のカンバスと、光と影の目のアイコンが消え、背景のサムネールに紫の三角形が入ったレイヤーパネル
2026-10-19撮影。Adobe Photoshop 2026 (27.11.0)、Windows 11 Pro (10.0.26200)。実行後。「光」と「影」は非表示になり、効果は各パーツと背景に結合された。レイヤーパネルは2回撮って点線でつないでいる。

[はい]を押してしばらくすると完了の窓が出て、「光」と「影」は非表示になっていました。

それでもカンバスの見た目は実行前と同じで、効果が各パーツのレイヤーに結合されたことが分かります。

「髪」「顔」「服」のレイヤーの大きさは実行前と同じで、効果はパーツの形の内側だけに入っていました。

コードは複製した効果レイヤーをパーツの上に移し、クリッピングマスクにしてから下のレイヤーと結合しているためです。

グループの中の「服」にも結合されました。

ヒストリーには「結合処理」が1つだけ増えていました(スクリプトで読み取って確認)。

背景レイヤーにも効果が結合される

透明の市松模様の上に、効果が入った髪・顔・服の図形だけが表示された画面
2026-10-19撮影。Adobe Photoshop 2026 (27.11.0)、Windows 11 Pro (10.0.26200)。実行後に背景レイヤーだけを非表示にした画面。効果は各パーツの形の内側だけに入り、パーツの外の紫の三角形は背景に結合されていた。

上の画像は、実行後に背景レイヤーだけを非表示にして撮ったものです。

パーツには効果が入っていますが、パーツの外にあった「影」の紫の三角形は、背景レイヤーに結合されていました。

背景レイヤーも結合先に含まれ、背景ではクリッピングマスクが効かないため、効果レイヤーの全体がそのまま背景に結合されました。

このコードには、背景を結合先から外す設定はありません。

背景に効果を入れたくない場合は、元PSDを残したうえで、処理対象だけを別文書に複製して試してください。元文書の背景を非表示にするだけでは、非表示レイヤーの検査で中断します。

非表示のレイヤーがあると、何もせずに止まる

結合対象のレイヤーに非表示のレイヤーがあります、処理をキャンセルします、と書かれたスクリプト警告の窓
2026-10-19撮影。Adobe Photoshop 2026 (27.11.0)、Windows 11 Pro (10.0.26200)。「顔」を非表示にした練習用ファイルで実行した画面。[OK]を押すと何も結合されずに止まった。

同じ構成で「顔」だけを非表示にして実行すると、確認の窓より前に「結合対象のレイヤーに非表示のレイヤーがあります。」という窓が出ました。

[OK]を押すと処理は止まり、どのレイヤーも結合されませんでした。

今回の構成では、非表示のパーツが1枚あると全体が止まりました。元PSDを残し、作業用の複製で対象を表示するか、処理対象だけを別文書へ複製してください。

確かめていないこと

Scriptsフォルダーへの配置と再起動、確認の窓で[いいえ]を押した場合、効果レイヤーを選ばずに実行した場合、効果レイヤーが一番上にない場合、効果レイヤーとパーツが同じ名前の場合、調整レイヤーやテキストレイヤーを使った場合、Mac版と他の版は確かめていません。

この記事で紹介しているコードは、GitHubのMOTOKI-LLC/cg-method-codeにもまとめています。

レイヤー操作を自動化するスクリプトは、ほかにも紹介しています。

まとめ

  • 最上位の効果レイヤーをすべてのパーツレイヤーへ一括適用できる
  • 適用後に自動で結合されるため、パーツごとの統合作業を効率化できる
  • Live2D用素材の書き出し前処理やイラスト制作に適している

レイヤー処理の手間を減らすために、効果レイヤーの一括適用と統合に本スクリプトを活用してみてください。

よくある質問:最上位の効果レイヤーを各レイヤーに適用して統合する

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

Photoshopで、最上位にある効果レイヤーを、パーツ分けされた各レイヤーへ一括で適用して統合します。キャラクターイラストの仕上げやLive2Dのパーツ作成に役立ちます。

どんなメリットがありますか?

効果レイヤーをパーツ分けされた各レイヤーへ一括適用できます。手作業では手間がかかる大量のパーツ処理を自動化できます。また、スクリプトを調整すれば特定のレイヤーのみへの適用にも対応できます。

実行前に注意することはありますか?

結合先のレイヤーが非表示だと適用できないため、事前に表示状態を確認してください。構造にかかわらず、実行前にPSDを複製してください。効果レイヤーと同じ名前のパーツは対象から除外されるので、名前も区別しておきます。

2026年10月19日に試したところ、結合先に非表示のレイヤーが1枚でもあると、確認の窓の前に中止の窓が出て、何も結合されませんでした。

また、一番上の効果レイヤーをレイヤーパネルで選んでから実行してください。

適用したあとのレイヤーはどうなりますか?

2026年10月19日にPhotoshop 2026で試したところ、効果は各パーツの形の内側だけに結合され、効果レイヤーは非表示になりました。

背景レイヤーにも、効果レイヤーの全体がそのまま結合されました。

ヒストリーには「結合処理」が1つ増えるだけでしたが、元に戻したいときのために、事前のバックアップを残しておいてください。

スクリプトはどのように導入しますか?

記事のコードをテキストエディタ等に貼り付けてConbineLayer.jsxとして保存し、記事で案内しているフォルダに保存します。保存後にPhotoshopを再起動してください。

どうやって実行しますか?

[ファイル] → [スクリプト] → [ConbineLayer] を選択します。実行すると、各パーツレイヤーに効果レイヤーが適用されます。

Scriptsフォルダーに置かない場合は、[ファイル]→[スクリプト]→[参照]で保存したファイルを選んでも実行できました。

スクリプトのコードはどこで確認できますか?

記事内に掲載しているほか、GitHubのMOTOKI-LLC/cg-method-codeにもまとめています。

メニューの表示や名称が記事と違う場合はどうすればよいですか?

Photoshopのバージョンによってメニューの名称や配置が変わることがあります。最新の操作手順は、Adobeの公式情報で確認してください。

2026年10月19日に、Photoshop 2026(27.11.0)とWindows 11 Proで、[ファイル]→[スクリプト]→[参照]から実行して確かめました。

背景レイヤーにも効果は入りますか?

入ります。

2026年10月19日に試したところ、背景レイヤーではクリッピングマスクが効かず、効果レイヤーの全体がそのまま背景に結合されました。

このコードには背景を対象から外す設定がありません。背景を処理したくない場合は、元PSDを残して対象だけを別文書へ複製して試してください。

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

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

Photoshopのおすすめ書籍

動作要件とPCの確認項目

周辺機器の優先度

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