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

Photoshop│リンクスマートオブジェクトからレイヤーカンプ一覧を取得するスクリプト

Photoshopでリンク配置したスマートオブジェクト(.psd)のレイヤーカンプを活用して管理する場面は多く見られます。

この記事のExtendScript例は、配置先のスマートオブジェクトが持つカンプ情報をActionManagerから読み取ります。通常の文書のレイヤーカンプ一覧を取得する処理とは対象が異なります。

それでも、Photoshopの非公開内部情報にアクセスする手法を用いれば、レイヤーカンプ一覧を取得できます。

この記事では、アクティブな文書のレイヤーとグループ内を走査し、スマートオブジェクトから取得できたカンプ名とIDを表示するJSXを紹介します。スマートオブジェクトの中身を開いて、さらに内側のレイヤーを再帰的に調べる処理ではありません。

2026年10月20日に、Photoshop 2026(27.11.0)とWindows 11 Proで、掲載のコードを書き換えずに保存し、[ファイル]→[スクリプト]→[参照…]から実行して確かめました。

リンク配置と埋め込みの両方で一覧が出ることと、元のファイルでカンプを足したときの注意を「Photoshop 2026で試した結果」にまとめています。

スマートオブジェクトから取得したレイヤーカンプ一覧がダイアログに表示された様子。
目次

ActionManagerからカンプ情報を読み取る方法

Photoshopのほかの自動化手順は、まとめ記事で確認できます。

処理の要となるのは、executeActionGet() と ActionReference の組み合わせです。

var ref = new ActionReference();
ref.putIdentifier(charIDToTypeID("Lyr "), layer.id);
var desc = executeActionGet(ref);

この処理により、レイヤーのプロパティ情報に直接アクセスできます。

コードはsmartObject内のcompsListオブジェクトからcompListリストを取り出します。必要なキーがない場合は空の配列を返し、例外は表示せず、それまでに取得できた配列を返します。次の図は構造の説明で、実行用コードではありません。実際にはキーをstringIDToTypeIDで変換しています。

内部データ構造からレイヤーカンプ一覧を取得する手順

layer (ArtLayer) →
  executeActionGet(ref) →
    desc.getObjectValue("smartObject") →
      getObjectValue("compsList") →
        getList("compList") → 各カンプ情報

各 comp オブジェクトには以下の情報が含まれています。

キー名意味
nameレイヤーカンプの名前
IDカンプに割り当てられたID
スポンサーリンク

補足:公開APIと内部プロパティの違い

AdobeのJavaScript Scripting Reference(2020)には、ActionReferenceとexecuteActionGet()自体の説明があります。一方、この記事で参照するsmartObject内のcompsList/compListという構造は、同資料で仕様を確認できていません。文書のカンプを扱うDocument.layerCompsとは区別してください。

代替手段として、ActionManager(AMコード)と呼ばれる低レベルAPIを利用し、Photoshop内部のプロパティを参照しています。

こうした記述方法は、Photoshopの操作をコード化するScripting Listenerプラグインなどで出力ログを解析して特定されています。

サンプルコード

以下のスクリプトを拡張子 .jsx のファイルとして保存し、Photoshopの[ファイル]メニューなどから実行してください。

Photoshop 2026では、[ファイル]→[スクリプト]→[参照…]で保存したファイルを選ぶと実行できます。

※リンク配置だけでなく、埋め込みスマートオブジェクトにも対応しています。

#target photoshop

// 対象レイヤーを再帰的に収集
function collectAllLayers(layerCollection, result) {
    for (var i = 0; i < layerCollection.length; i++) {
        var layer = layerCollection[i];
        if (layer.typename === "ArtLayer") {
            result.push(layer);
        } else if (layer.typename === "LayerSet") {
            collectAllLayers(layer.layers, result);
        }
    }
}

// スマートオブジェクトのレイヤーカンプ一覧を取得
function getLayerCompsFromSmartObject(layer) {
    var list = [];

    try {
        var ref = new ActionReference();
        ref.putIdentifier(charIDToTypeID("Lyr "), layer.id);
        var desc = executeActionGet(ref);

        if (!desc.hasKey(stringIDToTypeID("smartObject"))) return [];

        var soDesc = desc.getObjectValue(stringIDToTypeID("smartObject"));

        if (!soDesc.hasKey(stringIDToTypeID("compsList"))) return [];

        var compsList = soDesc.getObjectValue(stringIDToTypeID("compsList")).getList(stringIDToTypeID("compList"));
        for (var i = 0; i < compsList.count; i++) {
            var comp = compsList.getObjectValue(i);
            var name = comp.getString(stringIDToTypeID("name"));
            var id = comp.getInteger(stringIDToTypeID("ID"));
            list.push({ name: name, id: id });
        }
    } catch (e) {
        // 無視(対象外)
    }

    return list;
}

// メイン処理
function main() {
    if (app.documents.length === 0) {
        alert("ドキュメントが開かれていません。");
        return;
    }

    var allLayers = [];
    collectAllLayers(app.activeDocument.layers, allLayers);

    var output = "スマートオブジェクトのレイヤーカンプ一覧:\n\n";
    var found = false;

    for (var i = 0; i < allLayers.length; i++) {
        var layer = allLayers[i];
        if (layer.kind === LayerKind.SMARTOBJECT) {
            var comps = getLayerCompsFromSmartObject(layer);
            if (comps.length > 0) {
                found = true;
                output += "【" + layer.name + "】\n";
                for (var j = 0; j < comps.length; j++) {
                    output += "  ・[" + comps[j].id + "] " + comps[j].name + "\n";
                }
                output += "\n";
            }
        }
    }

    if (!found) {
        alert("レイヤーカンプ付きスマートオブジェクトは見つかりませんでした。");
    } else {
        alert(output);
    }
}

main();

取得できたカンプがあるレイヤーだけを表示します。このコードは取得例外を表示せず、取得前の失敗では空配列を返すため、「見つかりませんでした」はカンプの不在を証明しません。一部のレイヤーだけ取得に失敗しても、その失敗は一覧に表示されません。調査用に使う場合は、別のコピーで例外のレイヤー名と内容を記録する改修が必要です。

スクリプトを実行してスマートオブジェクトから検出されたレイヤーカンプ一覧情報が表示されたダイアログ。

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

Photoshop 2026で試した結果

2026年10月20日に、Photoshop 2026(27.11.0)とWindows 11 Proで、上のコードを書き換えずに保存し、[ファイル]→[スクリプト]→[参照…]から実行しました。

練習用のファイルは、別のスクリプトで作ったので確認に含めていません。

赤・青・緑の3枚のレイヤーと、レイヤーカンプ「案A 赤だけ」「案B 青だけ」「案C 全部」を持つPSDを1つ用意しました。

これを1つの文書に、リンク配置・埋め込み・グループの中にリンク配置の3通りで置き、カンプのないPSDの埋め込みと、普通のレイヤーも1枚ずつ足しました。

リンクと埋め込みの両方で一覧が出る

練習の文書のカンバスとレイヤーパネル、スクリプト警告の窓に3つのスマートオブジェクトと案A・案B・案Cのカンプが並んだ一覧
2026-10-20撮影。Adobe Photoshop 2026 (27.11.0)、Windows 11 Pro (10.0.26200)。リンク配置・埋め込み・グループの中のリンク配置を置いた文書で、掲載のコードを[参照…]から実行した結果。

実行すると「スクリプト警告」の窓に、カンプを持つ3つのスマートオブジェクトと、それぞれの3つのカンプが表示されました。

並びはレイヤーパネルの上からの順で、グループの中のスマートオブジェクトも一番上に出ました。

カンプのないスマートオブジェクトと普通のレイヤーは、一覧に出ませんでした。

角かっこの中の数字(1798349など)がカンプのIDで、リンク配置と埋め込みで同じ値でした。

実行の前後で、ヒストリーの数と文書の保存状態は変わらず、文書には何も書き込まれませんでした。

見つからないときと、文書を開いていないとき

「レイヤーカンプ付きスマートオブジェクトは見つかりませんでした。」と「ドキュメントが開かれていません。」のスクリプト警告の窓
2026-10-20撮影。Adobe Photoshop 2026 (27.11.0)、Windows 11 Pro (10.0.26200)。カンプのないスマートオブジェクトだけの文書と、文書を開いていないときの表示。

カンプのないスマートオブジェクトしかない文書では、「レイヤーカンプ付きスマートオブジェクトは見つかりませんでした。」と表示されました。

文書を開いていないホーム画面で実行すると、「ドキュメントが開かれていません。」と表示されました。

どちらも[OK]で閉じるだけで、ほかには何も起きませんでした。

元のファイルでカンプを足したら、内容を更新してから実行する

元のPSDに4つ目のカンプ「案D 緑だけ」を足して保存し、スマートオブジェクトを置いた文書を開き直して実行しました。

リンク配置のレイヤーには、パネルのアイコンに黄色の警告の印が付いていました。

この状態では、リンク配置のスマートオブジェクトも、カンプは3つのままで表示されました。

レイヤーメニューのスマートオブジェクトのサブメニューで、変更されたすべてのコンテンツを更新が選ばれている
2026-10-20撮影。Adobe Photoshop 2026 (27.11.0)、Windows 11 Pro (10.0.26200)。[レイヤー]→[スマートオブジェクト]→[変更されたすべてのコンテンツを更新]の位置。

そこで、[レイヤー]→[スマートオブジェクト]→[変更されたすべてのコンテンツを更新]を実行しました。

ヒストリーに「変更されたすべてのスマートオブジェクトを更新」が1つ積まれ、文書は未保存の状態になりました。

更新前はリンクのアイコンに黄色の印があり一覧はカンプ3つ、更新後は印が消えてリンクの2つにだけ案Dが加わった一覧
2026-10-20撮影。Adobe Photoshop 2026 (27.11.0)、Windows 11 Pro (10.0.26200)。元のPSDにカンプを足した後、内容の更新の前と後に実行した結果とレイヤーパネル。

更新の後にもう一度実行すると、リンク配置の2つにだけ「案D 緑だけ」が出ました。

埋め込みのスマートオブジェクトは、置いたときの中身のままなので、カンプは3つのままでした。

元のファイルを直した直後は、内容を更新してから一覧を取ると、古い一覧を見ずに済みます。

確かめていないこと

練習の文書はスクリプトで開き直したので、画面から開いたときに自動で更新されるかは確かめていません。

リンク先のファイルが見つからないとき、CCライブラリのグラフィック、PSD以外のファイル(PSB・AIなど)、アートボードのある文書は試していません。

Mac版と、ほかの版のPhotoshopも確かめていません。

レイヤーを操作するスクリプトは、ほかにもあります。

スポンサーリンク

よくある質問:リンクスマートオブジェクトのレイヤーカンプ一覧

スマートオブジェクトの中のレイヤーカンプを、取得できますか?

この記事ではActionManagerで配置先レイヤーが持つカンプ情報を読み取ります。対象はアクティブな文書のレイヤーとグループ内で、スマートオブジェクトの中身は開きません。取得できたカンプがあるレイヤーだけを表示します。このコードは取得例外を表示せず、取得前の失敗では空配列を返すため、「見つかりませんでした」はカンプの不在を証明しません。一部のレイヤーだけ取得に失敗しても、その失敗は一覧に表示されません。調査用に使う場合は、別のコピーで例外のレイヤー名と内容を記録する改修が必要です。

どんな仕組みで取得しているのですか?

処理の要となるのは、executeActionGet()とActionReferenceの組み合わせです。この処理により、レイヤーのプロパティ情報に直接アクセスできます。取得したプロパティ内には、スマートオブジェクト専用のsmartObjectキーが存在し、その階層下のcompsListオブジェクトからcompListリストを取得します。必要なキーがない場合と取得例外は、このコードでは区別されません。

取得できるレイヤーカンプの情報は、何ですか?

各compオブジェクトには、レイヤーカンプの名前(name)と、カンプに割り当てられたID(ID)が含まれています。

公式のDOMでは、なぜ取れないのですか?

文書のカンプはDocument.layerCompsで扱えますが、この記事は配置先スマートオブジェクトの内部プロパティを読む方法です。確認した2020年版の公式参照資料では、そのcompsList/compList構造の仕様は確認できていません。代替手段として、ActionManager(AMコード)と呼ばれる低レベルAPIを利用し、Photoshop内部のプロパティを参照しています。こうした記述方法は、Photoshopの操作をコード化するScripting Listenerプラグインなどで出力ログを解析して特定されています。

公式ドキュメントに記載のない方法を使っても、大丈夫ですか?

ActionReferenceやexecuteActionGet()自体は公式参照資料にあります。ただし、この例で使う内部プロパティの構造や版をまたぐ互換性まで確認できたわけではありません。Photoshopの非公開内部情報を参照する方法のため、使う前に、コピーしたファイルで動作を確認してください。

スクリプトは、どうやって実行しますか?

サンプルコードを、拡張子が.jsxのファイルとして保存し、Photoshopから実行します。この記事で紹介しているコードは、GitHubのMOTOKI-LLC/cg-method-codeにもまとめられています。Photoshopのほかの自動化手順は、まとめ記事で確認できます。

記事の内容は、今のPhotoshopで確認されていますか? 最新はどこで確認しますか?

掲載のコードは、2026年10月20日にPhotoshop 2026(27.11.0)とWindows 11 Proで実行して確かめました。

リンク配置と埋め込みの両方で一覧が出て、元のファイルでカンプを足したときは、内容を更新するまで古い一覧のままでした。

非公開の内部情報を使う方法のため、ほかの版では、まずコピーしたファイルで試してください。

最新はAdobe公式のScripting Guideなどの資料で確認してください。

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

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

Photoshopのおすすめ書籍

動作要件とPCの確認項目

周辺機器の優先度

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