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

Photoshopスクリプト(jsx)│レイヤーを縦/横にピッタリ並べる方法

Photoshopで選んだ複数の画像ファイルを、新しいドキュメントに隙間なく縦または横に並べるスクリプトを紹介します。

同サイズの画像を規則正しく並べる作業に適しています。

実行するとファイルを選ぶ窓が開き、選んだ画像が「sample」という新しいドキュメントにレイヤーとして読み込まれてから並びます。

すでに開いているドキュメントのレイヤーや、レイヤーパネルで選んだレイヤーを並べるスクリプトではありません。

2026年10月19日に、Photoshop 2026(27.11.0)とWindows 11 Proで2つのコードを実行して確かめました。

2026年10月20日にコードを直しました。

画像を1つだけ選ぶとエラーで止まり、大きさの違う画像を並べると隙間や重なりができる不具合がありました。

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

目次

レイヤーをピッタリ並べるメリット

  • 複数のレイヤーを均等に整列可能
  • 手動で位置を微調整する手間を削減
  • 並べる作業にかかる時間を短縮
スポンサーリンク

スクリプトの導入方法

STEP.1 スクリプトファイルの作成と配置

  1. 下記のコードをテキストエディタに貼り付けて保存します(横並び用と縦並び用の2種類があります)。最初は72 ppi・透明余白のない画像のコピーで試し、定規の単位をピクセルにしてください。コードは単位を設定せずに数値を扱います。入力画像は保存済みのものを閉じてから選んでください。読み込んだ文書を変更を保存せず閉じる処理があるため、編集中のファイルは対象にしないでください。

Photoshopのほかの操作は、まとめからご覧いただけます。

CGM_SelectFilesSideBySideJoinHorizontal.jsx

app.bringToFront();
//新規ドキュメント
var newDoc = documents.add(512, 512, 72, 'sample', NewDocumentMode.RGB, DocumentFill.TRANSPARENT, 1);
var doc = activeDocument;
doc.suspendHistory("レイヤーを横に並べる", "main()");

function main()
{
    //ファイルを読み込む
    sub1();

    //レイヤーを横にぴったり並べる
    sub2();

    function sub1()
    {
        var fileObj = new File();
        var fileArray = fileObj.openDlg('ファイルを選択してください:', '*', true);

        saveName = fileArray[0].name;
        savePath = fileArray[0].path;

        for (var i = 0; i < fileArray.length; i++)
        {
            var doc = open(fileArray[i]);
            //新しくドキュメントに読み込み
            doc.artLayers.add();
            //レイヤーを統合(透明のレイヤーと統合するので影響なし)
            doc.mergeVisibleLayers();
            //読み込んだファイル名を取得
            var name = doc.name;
            var layer = doc.activeLayer;
            //レイヤー名をドキュメント名に
            layer.name = name;
            //始めに作った新規ドキュメントへ複製コピー
            layer.duplicate(newDoc, ElementPlacement.PLACEATBEGINNING);
            //読み込んだドキュメントを閉じる
            doc.close(SaveOptions.DONOTSAVECHANGES);
        }

        //一番下のレイヤーの削除
        var layObj = activeDocument.artLayers;
        var bgLayer = layObj[layObj.length - 1];
        bgLayer.remove();
    }

    function sub2()
    {

        var lay = doc.layers;
        var len = doc.artLayers.length;

        function getSize(layer)
        {
            var height = parseInt(layer.bounds[3]) - parseInt(layer.bounds[1]);
            var width = parseInt(layer.bounds[2]) - parseInt(layer.bounds[0]);
            return {
                height: height,
                width: width
            };
        }

        function getPosition(layer)
        {
            var left = parseInt(layer.bounds[0]);
            var top = parseInt(layer.bounds[1]);
            return {
                left: left,
                top: top
            };
        }

        for (var i = len - 1; i >= 0; i--)
        {
            //レイヤー数が2以上場合
            if (len >= 2)
            {
                //一番下のレイヤー
                if (i == len - 1) { }
                //それ以外は、1つ下のレイヤーの右端に左端を合わせる
                if (i <= len - 2)
                {
                    var A = getPosition(lay[i + 1]).left + getSize(lay[i + 1]).width;
                    lay[i].translate(A - getPosition(lay[i]).left, 0);
                }
            }
        }

        function SavePng()
        {
            var doc = app.activeDocument;
            var docName = doc.name;
            var docPath = savePath; //'~/Desktop/';
            var folder = new Folder(docPath);
            if (docName.indexOf(".") != -1)
            {
                var baseName = docName.match(/(.*)\.[^\.]+$/)[1];
            } else
            {
                var baseName = docName;
            }
            if (folder == null)
            {
                return;
            }
            exportPng(doc, folder, baseName + '_結合' + '.png');
        }

        function exportPng(doc, folder, name)
        {
            var file = new File(folder.fsName + "/" + name);
            var options = new ExportOptionsSaveForWeb();
            options.format = SaveDocumentType.PNG;
            options.optimized = true;
            options.interlaced = false;
            doc.exportDocument(file, ExportType.SAVEFORWEB, options);
        }
        //すべての領域を表示
        activeDocument.revealAll();

        //透明部分のトリミング
        activeDocument.trim(TrimType.TRANSPARENT, true, true, true, true);

        //画像の統合
        //activeDocument.flatten();

        //同階層に保存
        //SavePng();
    }
}

CGM_SelectFilesSideBySideJoinVertical.jsx

app.bringToFront();
//新規ドキュメント
var newDoc = documents.add(512, 512, 72, 'sample', NewDocumentMode.RGB, DocumentFill.TRANSPARENT, 1);
var doc = activeDocument;
doc.suspendHistory("レイヤーを縦に並べる", "main()");

function main() {
    //ファイルを読み込む
    sub1();

    //レイヤーを横にぴったり並べる
    sub2();

    function sub1() {
        var fileObj = new File();
        var fileArray = fileObj.openDlg('ファイルを選択してください:', '*', true);
        
        saveName = fileArray[0].name;
        savePath = fileArray[0].path;
       
        for (var i = 0; i < fileArray.length; i++) {
            var doc = open(fileArray[i]);
            //新しくドキュメントに読み込み
            doc.artLayers.add();
            //レイヤーを統合(透明のレイヤーと統合するので影響なし)
            doc.mergeVisibleLayers();
            //読み込んだファイル名を取得
            var name = doc.name;
            var layer = doc.activeLayer;
            //レイヤー名をドキュメント名に
            layer.name = name;
            //始めに作った新規ドキュメントへ複製コピー
            layer.duplicate(newDoc, ElementPlacement.PLACEATBEGINNING);
            //読み込んだドキュメントを閉じる
            doc.close(SaveOptions.DONOTSAVECHANGES);
        }

        //一番下のレイヤーの削除
        var layObj = activeDocument.artLayers;
        var bgLayer = layObj[layObj.length - 1];
        bgLayer.remove();
    }

    function sub2() {

        var lay = doc.layers;
        var len = doc.artLayers.length;

        function getSize(layer) {
            var height = parseInt(layer.bounds[3]) - parseInt(layer.bounds[1]);
            var width = parseInt(layer.bounds[2]) - parseInt(layer.bounds[0]);
            return {
                height: height,
                width: width
            };
        }

        function getPosition(layer) {
            var left = parseInt(layer.bounds[0]);
            var top = parseInt(layer.bounds[1]);
            return {
                left: left,
                top: top
            };
        }

        for (var i = len - 1; i >= 0; i--) {
            //レイヤー数が2以上場合
            if (len >= 2) {
                //一番下のレイヤー
                if (i == len - 1) {}
                //それ以外は、1つ下のレイヤーの下端に上端を合わせる
                if (i <= len - 2) {
                    var A = getPosition(lay[i + 1]).top + getSize(lay[i + 1]).height;
                    lay[i].translate(0, A - getPosition(lay[i]).top);
                }
            }
        }

        function SavePng() {
            var doc = app.activeDocument;
            var docName = doc.name;
            var docPath = savePath; //'~/Desktop/';
            var folder = new Folder(docPath);
            if (docName.indexOf(".") != -1) {
                var baseName = docName.match(/(.*)\.[^\.]+$/)[1];
            } else {
                var baseName = docName;
            }
            if (folder == null) {
                return;
            }
            exportPng(doc, folder, baseName + '_結合' + '.png');
        }

        function exportPng(doc, folder, name) {
                var file = new File(folder.fsName + "/" + name);
                var options = new ExportOptionsSaveForWeb();
                options.format = SaveDocumentType.PNG;
                options.optimized = true;
                options.interlaced = false;
                doc.exportDocument(file, ExportType.SAVEFORWEB, options);
            }
            //すべての領域を表示
        activeDocument.revealAll();

        //透明部分のトリミング
        activeDocument.trim(TrimType.TRANSPARENT, true, true, true, true);

        //画像の統合
        //activeDocument.flatten();

        //同階層に保存
        //SavePng();
    }
}
  1. CGM_SelectFilesSideBySideJoinHorizontal.jsxおよびCGM_SelectFilesSideBySideJoinVertical.jsxをPresets/Scriptsフォルダ内に保存します。
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. [ファイル] → [スクリプト] → [CGM_SelectFilesSideBySideJoinHorizontal] または [CGM_SelectFilesSideBySideJoinVertical]を選択します。
  2. 「ファイルを選択してください:」の窓で、並べたい画像ファイルを選んで[OK]を押します。
  3. 新しいドキュメント「sample」に画像がレイヤーとして読み込まれ、横並び用は横に、縦並び用は縦に隙間なく並びます。

Photoshop 2026で実行した結果

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

並べる画像(数字を入れた単色のPNGとJPEG)は別に用意したもので、作り方は確認に含めていません。

ファイルを選ぶ窓で、画像を2つ以上まとめて選ぶ

ファイルを選択してくださいという窓で、ファイル名の欄にa1.png、a2.png、a3.pngの3つの名前を引用符で囲んで並べて入力した画面
2026-10-19撮影。Adobe Photoshop 2026 (27.11.0)、Windows 11 Pro (10.0.26200)。スクリプトを実行すると開く「ファイルを選択してください:」の窓。並べたい画像を2つ以上選んで[OK]を押す。左の一覧は塗りつぶしている。

実行するとすぐに「ファイルを選択してください:」という窓が開きました。

この窓は、最初はPhotoshopのインストール先のフォルダーを表示していました。

並べたい画像のフォルダーに移り、ファイル名の欄に "a1.png" "a2.png" "a3.png" のように引用符で囲んだ名前を並べて入力し、[OK]で選びました。

一覧でCtrlキーを押しながらクリックして選ぶ方法は試していません。

選んだ画像はコードの中で1つずつ開かれ、表示中のレイヤーを結合してから、新文書へ複製されます。入力ファイル内のレイヤー構造をそのまま移すコードではありません。読み込み元の文書は変更を保存せずに閉じます。複数レイヤーのPSDでの結果は実機未確認です。

実行後に開いていたのは「sample」だけでした。

同じ大きさの画像は、横にも縦にも隙間なく並んだ

300×200ピクセルの画像3つが、1、2、3の順に隙間なく横に並び、レイヤーパネルにa3.png、a2.png、a1.pngが並んだ画面
2026-10-19撮影。Adobe Photoshop 2026 (27.11.0)、Windows 11 Pro (10.0.26200)。同じ大きさの画像3つを横並び用で並べた結果。白い縁は練習用の画像に描いた枠。

300×200 pxの画像3つを横並び用で並べると、900×200 pxのドキュメント「sample」ができ、3つが隙間なく横に並びました。

a1・a2・a3の順に選んだところ、a1が左端、a3が右端になり、レイヤーパネルでは後から読み込んだa3が一番上でした。

レイヤー名は、読み込んだファイルの名前になりました。

300×200ピクセルの画像3つが、1、2、3の順に隙間なく縦に並んだ画面
2026-10-19撮影。Adobe Photoshop 2026 (27.11.0)、Windows 11 Pro (10.0.26200)。同じ3つを縦並び用で並べた結果。

同じ3つを縦並び用で並べると、300×600 pxのドキュメントになり、a1が一番上、a3が一番下に並びました。

どちらも、ヒストリーには「レイヤーを横に並べる」または「レイヤーを縦に並べる」が1つだけ増えました。

2026年10月20日に直したコードでも、同じ3つは横・縦とも同じ大きさ・同じ並びになりました。

ドキュメントは保存されず、画像のあったフォルダーにも新しいファイルはできませんでした。

コードの中の保存の処理(SavePng())は行頭の // で止められているので、完成した「sample」は自分で保存します。画像の枚数・順序・寸法・隙間や重なりを確認し、[ファイル]→[別名で保存]で保存先と入力画像とは別の名前を指定してください。後から各画像の位置を直す場合はPhotoshop(PSD)形式を選び、[レイヤー]を保持して保存します。保存したPSDを開き直し、画像ごとのレイヤーが残っているか確認してください。この保存・再読操作は今回実機では試していません。

JPEGや透明の無いPNGも、そのまま並んだ

透明の無いPNGやJPEGは、Photoshopで開くとレイヤーが「背景」になります。

使い捨てのドキュメントで命令だけを試したところ、「背景」に名前を付けると通常のレイヤーに変わりました(画面からの実行ではありません)。

JPEGを混ぜて実行したときも、ほかの画像と同じように並びました。

直す前のコードは、大きさの違う画像で隙間や重なりができた

大きさの違う4つの画像を横に並べた結果、1と2の間と3と4の間に隙間ができ、3が2に重なった画面
2026-10-19撮影。Adobe Photoshop 2026 (27.11.0)、Windows 11 Pro (10.0.26200)。大きさの違う4つ(4だけJPEG)を横並び用で並べた結果。表示は画面サイズに合わせて縮めている。

200×200、400×150、150×300、250×250 pxの4つ(最後だけJPEG)を直す前の横並び用で並べると、ぴったりには並びませんでした。

1つ目と2つ目の間に50 pxの隙間ができ、3つ目は2つ目に重なり、3つ目と4つ目の間には250 pxの隙間ができました。

直す前のコードは、2つ目は一番上のレイヤーの幅、3つ目からは2つ下のレイヤーの幅を使って位置を決めていたため、幅がそろっていないとずれました。

上端はそろい、高さの違う分は下が空きました。

2026年10月20日に、同じ4つを直す前の縦並び用で並べると、1つ目と2つ目の間に100 px、2つ目と3つ目の間に50 pxの隙間ができ、4つ目は3つ目に重なりました。

直したコードは、1つ下のレイヤーの右端(縦並び用は下端)に合わせて置くので、大きさが違っても隙間なく並びます。

2026年10月20日に、直したコードで同じ4つを並べました。

ファイルを選ぶ窓の代わりにファイルの一覧を渡した確かめ用の版を、別のスクリプトから実行しています(2026年10月20日の確認はすべてこの方法です)。

横並び用は1000×300 px、縦並び用は400×900 pxのドキュメントになり、どちらも隙間も重なりもなく並びました。

今回の不透明画像では横並び用の上端、縦並び用の左端がそろい、大きさの違う分は空きました。コードが接する位置を決めるのはレイヤーのboundsです。透明余白を含む元ファイルの外枠を基準に並べる処理ではなく、横並びの上下位置・縦並びの左右位置をそろえる追加処理もありません。

直す前のコードは、画像を1つだけ選ぶとエラーで止まった

空のsampleドキュメントの上に、エラー21 undefinedはオブジェクトではありません、ライン20と表示された画面
2026-10-19撮影。Adobe Photoshop 2026 (27.11.0)、Windows 11 Pro (10.0.26200)。画像を1つだけ選んだときのエラー。空の「sample」が残る。

直す前のコードで画像を1つだけ選んで[OK]を押すと、「エラー 21: undefined はオブジェクトではありません。」が出て止まりました。

エラーの行は saveName = fileArray[1].name; で、2つ目のファイルが無いと先に進めない作りでした。

[OK]で閉じると、512×512 pxの空の「sample」だけが残ったので、保存せずに閉じました。

直したコードでは、この行を1つ目のファイルの名前を読む形に変えました。

直したコードに画像を1つだけ渡すと、エラーは出ず、300×200 pxのドキュメントにその画像が1つ入りました。

確かめていないこと

Scriptsフォルダーへの配置と再起動(メニューに出る名前)、ファイルを選ぶ窓の[キャンセル]、レイヤーが複数あるPSDや透明の余白がある画像、72 ppi以外の画像、定規の単位がpx以外のとき、Mac版と他の版は確かめていません。

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

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

スポンサーリンク

まとめ

  • 複数レイヤーを隙間なく整列可能
  • 手動での位置合わせが不要
  • 連続した並べ替え作業を効率化

Photoshopでレイヤー配置の手間を減らし、作業を効率化してみてください。

よくある質問:選択した画像ファイルを縦・横に並べる

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

選んだ複数の画像ファイルを新しいドキュメントに読み込み、隙間なく縦または横に並べます。

開いているドキュメントのレイヤーを並べるものではありません。

同サイズの画像を規則正しく並べる作業に適しています。

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

複数のレイヤーを均等に整列できます。手動で位置を微調整する手間を減らし、並べる作業にかかる時間を短縮できます。

横並び用と縦並び用の2種類があるのですか?

はい。CGM_SelectFilesSideBySideJoinHorizontal.jsx(横並び用)とCGM_SelectFilesSideBySideJoinVertical.jsx(縦並び用)の2種類を紹介しています。並べたい向きに合わせて使い分けます。

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

記事のコードをテキストエディタに貼り付けて保存し、横並び用と縦並び用の両方のファイルをPresets/Scriptsフォルダ内に保存します。保存後にPhotoshopを再起動してください。

10月19日の旧コードは[ファイル]→[スクリプト]→[参照]から実行しました。10月20日の修正版はファイル一覧を直接渡す確認用の版を別スクリプトから実行しており、修正版のファイル選択窓・キャンセル操作は未確認です。

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

[ファイル] → [スクリプト] から、横並び用または縦並び用のスクリプトを選択します。

「ファイルを選択してください:」の窓が開くので、並べたい画像ファイルを選んで[OK]を押します。

直す前のコードは画像を1つだけ選ぶとエラーで止まりましたが、2026年10月20日に直しました。

どんな作業に向いていますか?

複数のレイヤーを一列に並べる、連続した並べ替え作業に向いています。手動での位置合わせが不要になり、レイヤー配置の手間を減らせます。

2026年10月20日の修正版では、試した不透明画像は大きさが違っても隙間なく並びました。透明余白を含むファイルの外枠をそろえる処理ではありません。また結果は自動保存されないため、並びを確認してから別名のPSDとして保存してください。

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

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

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

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

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

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

Photoshopのおすすめ書籍

動作要件とPCの確認項目

周辺機器の優先度

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