Skip to main content
Participant
May 7, 2024
Answered

How to Export to artboards using the photoshop variables

  • May 7, 2024
  • 4 replies
  • 1872 views

I know how to export to each psd file using the photoshop variables.
But I want to know how to replicate artboards with the data in my csv file.

Correct answer Stephen Marsh

@Lucas347275917lt9 

 

Assuming that you have a folder containing layered PSD files created from the data sets, you can try the following script to stack each PSD as an artboard, retaining the original layers from each separate PSD. This script is only intended for later CC versions and has been successfully tested in v2021, v2024 and v2025 on Mac and Win.

 

EDIT: Original code upated to v1.7 (20th August 2025)

 

/*
Stack Layered Files to Artboards.jsx
Stephen Marsh
v1.0 - 8th May 2024: Initial release.
v1.1 - 9th May 2024: Added code to set the artboard background colour.
v1.2 - 13th August 2025: Reworked the selectAllLayers function. Reworked the smart object conversion code.
v1.3 - 14th August 2025: Added a step to unlock all selected floating layers before converting to a smart object. Various UX enhancements.
v1.4 - 15th August 2025: Artboard creation reworked to correctly handle content extending out of the artboard bounds. Smart objects are no longer used to dupe artboards.
v1.5 - 16th August 2025: Added checks to abort the script if artboards are detected in the input files.
v1.6 - 19th August 2025: Artboard arrangement modified: 0 = one single row, 1 = one single column, 2 = two columns etc. Digit validation check added to the column number prompt.
v1.7 - 20th August 2025: Code refactored, hopefully it's not broken! :]

https://community.adobe.com/t5/photoshop-ecosystem-discussions/how-to-export-to-artboards-using-the-photoshop-variables/td-p/14603249

Originally based on:
https://community.adobe.com/t5/photoshop-ecosystem/combining-mulitple-photoshop-files-into-1-photoshop-file-with-artboards/td-p/12218200
*/

// Global helpers
var c2t = function (s) { return app.charIDToTypeID(s); };
var s2t = function (s) { return app.stringIDToTypeID(s); };

#target photoshop

try {
    if (app.documents.length === 0) {
        (function () {
            var origUnits = app.preferences.rulerUnits;
            app.preferences.rulerUnits = Units.PIXELS;

            var inputFolder = Folder.selectDialog('Please select the input folder:');
            if (inputFolder === null) {
                app.beep();
                return;
            }

            var inputFiles = inputFolder.getFiles(/\.(webp|avif|jpg|jpeg|tif|tiff|png|psd|psb)$/i);
            inputFiles.sort(function (a, b) {
                return decodeURI(a.name).toLowerCase().localeCompare(decodeURI(b.name).toLowerCase());
            }).reverse();

            // Open first file
            var firstFile = app.open(File(inputFiles[0]));
            if (checkForArtboardsAndAbort(firstFile)) return;

            normalizeBackgroundLayer();
            selectAllLayers();
            applyLocking(true);
            newArtboard();
            app.activeDocument.duplicate("Artboard Stack from Files", false);
            firstFile.close(SaveOptions.DONOTSAVECHANGES);

            var artboardStack = app.activeDocument;
            artboardStack.activeLayer.name = app.activeDocument.name.replace(/\.[^\.]+$/, '');

            // Process remaining files
            for (var i = 1; i < inputFiles.length; i++) {
                var remainingFile = app.open(File(inputFiles[i]));
                if (checkForArtboardsAndAbort(remainingFile, artboardStack)) return;

                normalizeBackgroundLayer();
                selectAllLayers();
                applyLocking(true);
                newArtboard();
                dupeToBaseDoc(remainingFile, artboardStack);
            }

            // Arrange & cleanup
            app.beep();
            arrangeArtboards();
            app.activeDocument.trim(TrimType.TRANSPARENT);
            app.preferences.rulerUnits = origUnits;

            app.togglePalettes();
            app.beep();
            selectTool('artboardTool');
            selectView("fitOnScreen");
            selectView("zoomOut");
            alert("Script completed!" + "\r\r" + "Manually arrange the artboards as required (Press Tab to restore the hidden panels).");


            ///// Functions /////

            function normalizeBackgroundLayer() {
                var layers = app.activeDocument.layers;
                var layer = layers[layers.length - 1];
                if (layer.isBackgroundLayer) layer.name = 'Background';
            }

            function checkForArtboardsAndAbort(docToClose, stackDoc) {
                if (findArtboards().length > 0) {
                    alert("Artboards are not supported as input!");
                    docToClose.close(SaveOptions.DONOTSAVECHANGES);
                    if (stackDoc) stackDoc.close(SaveOptions.DONOTSAVECHANGES);
                    return true;
                }
                return false;
            }

            function selectAllLayers() {
                try {
                    var doc = app.activeDocument;
                    var descriptor = new ActionDescriptor();
                    var reference2 = new ActionReference();
                    reference2.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
                    descriptor.putReference(c2t("null"), reference2);
                    executeAction(s2t("selectAllLayers"), descriptor, DialogModes.NO);

                    if (doc.layers[doc.layers.length - 1].isBackgroundLayer) {
                        var descriptor2 = new ActionDescriptor();
                        var reference = new ActionReference();
                        reference.putProperty(s2t("layer"), s2t("background"));
                        descriptor2.putReference(c2t("null"), reference);
                        descriptor2.putEnumerated(s2t("selectionModifier"), s2t("selectionModifierType"), s2t("addToSelection"));
                        descriptor2.putBoolean(s2t("makeVisible"), false);
                        executeAction(s2t("select"), descriptor2, DialogModes.NO);
                    }
                } catch (e) {
                    alert("selectAllLayers() error!\r" + e + " " + e.line);
                }
            }

            function applyLocking(protectNone) {
                try {
                    var descriptor = new ActionDescriptor();
                    var descriptor2 = new ActionDescriptor();
                    var reference = new ActionReference();
                    reference.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
                    descriptor.putReference(c2t("null"), reference);
                    descriptor2.putBoolean(s2t("protectNone"), protectNone);
                    descriptor.putObject(s2t("layerLocking"), s2t("layerLocking"), descriptor2);
                    executeAction(s2t("applyLocking"), descriptor, DialogModes.NO);
                } catch (e) {
                    alert("applyLocking() error!\r" + e + " " + e.line);
                }
            }

            function arrangeArtboards() {
                try {
                    var abLength = app.activeDocument.layerSets.length;
                    var theColumns = 1;
                    var space_x = 250;
                    var space_y = 250;

                    while (isNaN(theColumns = prompt("Arrange " + abLength + " artboards into a grid. \rEnter the number of columns (0 = one single row, 1 = one single column, 2 = two columns etc.):", theColumns))) {
                        if (theColumns === null || theColumns === "") {
                            alert('Script cancelled!');
                            return;
                        }
                        alert('Please enter a valid whole number!');
                    }
                    theColumns = parseInt(theColumns);
                    if (theColumns === 0) return;
                    if (theColumns < 1) theColumns = 1;

                    var theArtboards = [], w = 0, h = 0;
                    for (var i = 0; i < activeDocument.layerSets.length; i++) {
                        var r = new ActionReference();
                        r.putProperty(s2t("property"), s2t("artboardEnabled"));
                        r.putIdentifier(s2t("layer"), activeDocument.layerSets[i].id);

                        if (executeActionGet(r).getBoolean(s2t("artboardEnabled"))) {
                            var r2 = new ActionReference();
                            r2.putProperty(s2t("property"), s2t("artboard"));
                            r2.putIdentifier(s2t("layer"), activeDocument.layerSets[i].id);
                            var rect = executeActionGet(r2).getObjectValue(s2t("artboard")).getObjectValue(s2t("artboardRect"));

                            var l = rect.getDouble(s2t("left"));
                            var t = rect.getDouble(s2t("top"));
                            var rgt = rect.getDouble(s2t("right"));
                            var b = rect.getDouble(s2t("bottom"));

                            theArtboards.push([activeDocument.layerSets[i], [l, t, rgt, b]]);
                            var w1 = rgt - l, h1 = b - t;
                            if (w1 > w) w = w1;
                            if (h1 > h) h = h1;
                        }
                    }

                    var rows = Math.floor(theArtboards.length / theColumns);
                    if (rows * theColumns < theArtboards.length) rows++;

                    var i = 0;
                    for (var y = 0; y < rows; y++) {
                        var pos_y = y * (h + space_y);
                        for (var x = 0; x < theColumns; x++) {
                            if (i >= theArtboards.length) break;
                            activeDocument.activeLayer = theArtboards[i][0];
                            var pos_x = x * (w + space_x);
                            move(pos_x - theArtboards[i][1][0], pos_y - theArtboards[i][1][1]);
                            i++;
                        }
                    }

                    function move(x, y) {
                        try {
                            var d = new ActionDescriptor();
                            var r = new ActionReference();
                            r.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
                            d.putReference(s2t("null"), r);
                            var d1 = new ActionDescriptor();
                            d1.putUnitDouble(s2t("horizontal"), s2t("pixelsUnit"), x);
                            d1.putUnitDouble(s2t("vertical"), s2t("pixelsUnit"), y);
                            d.putObject(s2t("to"), s2t("offset"), d1);
                            executeAction(s2t("move"), d, DialogModes.NO);
                        } catch (e) {
                            alert("arrangeArtboards.move() error!\r" + e + " " + e.line);
                        }
                    }
                } catch (e) {
                    alert("arrangeArtboards() error!\r" + e + " " + e.line);
                }
            }

            function artboardBackground(artboardColor) {
                try {
                    var ideditArtboardEvent = s2t("editArtboardEvent");
                    var desc520 = new ActionDescriptor();
                    var ref129 = new ActionReference();
                    ref129.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
                    desc520.putReference(c2t("null"), ref129);
                    var desc521 = new ActionDescriptor();
                    var idcolor = s2t("color");
                    var desc523 = new ActionDescriptor();
                    desc523.putDouble(s2t("red"), 128);
                    desc523.putDouble(s2t("grain"), 128);
                    desc523.putDouble(s2t("blue"), 128);
                    desc521.putObject(idcolor, s2t("RGBColor"), desc523);
                    desc521.putInteger(s2t("artboardBackgroundType"), artboardColor);
                    desc520.putObject(s2t("artboard"), s2t("artboard"), desc521);
                    desc520.putInteger(s2t("changeBackground"), 1);
                    executeAction(ideditArtboardEvent, desc520, DialogModes.NO);
                } catch (e) {
                    alert("artboardBackground() error!\r" + e + " " + e.line);
                }
            }

            function selectTool(tool) {
                try {
                    var desc9 = new ActionDescriptor();
                    var ref7 = new ActionReference();
                    ref7.putClass(s2t(tool));
                    desc9.putReference(c2t('null'), ref7);
                    executeAction(c2t('slct'), desc9, DialogModes.NO);
                } catch (e) {
                    alert("selectTool() error!\r" + e + " " + e.line);
                }
            }

            function selectView(menuItem) {
                try {
                    var descriptor = new ActionDescriptor();
                    var reference = new ActionReference();
                    reference.putEnumerated(s2t("menuItemClass"), s2t("menuItemType"), s2t(menuItem));
                    descriptor.putReference(c2t("null"), reference);
                    executeAction(s2t("select"), descriptor, DialogModes.NO);
                } catch (e) {
                    alert("selectView() error!\r" + e + " " + e.line);
                }
            }

            function newArtboard() {
                try {
                    var descriptor = new ActionDescriptor();
                    var descriptor2 = new ActionDescriptor();
                    var reference = new ActionReference();
                    reference.putClass(s2t("artboardSection"));
                    descriptor.putReference(c2t("null"), reference);
                    descriptor.putString(s2t("name"), app.activeDocument.name.replace(/\.[^\.]+$/, ''));
                    descriptor2.putDouble(s2t("top"), 0.0);
                    descriptor2.putDouble(s2t("left"), 0.0);
                    descriptor2.putDouble(s2t("bottom"), app.activeDocument.height.value);
                    descriptor2.putDouble(s2t("right"), app.activeDocument.width.value);
                    descriptor.putObject(s2t("artboardRect"), s2t("classFloatRect"), descriptor2);
                    executeAction(s2t("make"), descriptor, DialogModes.NO);
                    app.activeDocument.activeLayer.name = app.activeDocument.name.replace(/\.[^\.]+$/, '');
                    artboardBackground(3);
                } catch (e) {
                    alert("newArtboard() error!\r" + e + " " + e.line);
                }
            }

            function dupeToBaseDoc(openFile, stackDoc) {
                try {
                    var descriptor = new ActionDescriptor();
                    var reference = new ActionReference();
                    reference.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
                    descriptor.putReference(c2t("null"), reference);
                    var reference2 = new ActionReference();
                    reference2.putName(s2t("document"), stackDoc.name);
                    descriptor.putReference(s2t("to"), reference2);
                    descriptor.putInteger(s2t("destinationDocumentID"), stackDoc.id); // dynamic doc ID
                    descriptor.putString(s2t("name"), app.activeDocument.name.replace(/\.[^\.]+$/, ''));
                    descriptor.putInteger(s2t("version"), 5);
                    executeAction(s2t("duplicate"), descriptor, DialogModes.NO);
                    openFile.close(SaveOptions.DONOTSAVECHANGES);
                    artboardBackground(3);
                    app.activeDocument.activeLayer = app.activeDocument.activeLayer.layers[0];
                } catch (e) {
                    alert("dupeToBaseDoc() error!\r" + e + " " + e.line);
                }
            }

            function findArtboards() {
                try {
                    var layers = app.activeDocument.layers;
                    var artboards = [];
                    for (var i = 0; i < layers.length; i++) {
                        if (isArtboard(layers[i].id)) {
                            artboards.push(layers[i]);
                        }
                    }
                    return artboards;

                    function isArtboard(layerID) {
                        try {
                            var r = new ActionReference();
                            r.putIdentifier(s2t('layer'), layerID);
                            var options = executeActionGet(r);
                            return options.hasKey(s2t('artboard'));
                        } catch (e) {
                            return false;
                        }
                    }
                } catch (e) {
                    alert("findArtboards() error!\r" + e + " " + e.line);
                }
            }

        })();
    } else {
        alert('Please close all open files before running this script...');
    }
} catch (e) {
    alert("Error!\r" + e + " " + e.line);
}

 

https://prepression.blogspot.com/2017/11/downloading-and-installing-adobe-scripts.html

 

4 replies

Stephen Marsh
Community Expert
Community Expert
July 21, 2026

 

/*
Stack Layered Files to Artboards scriptUI GUI v2-0.jsx
Stephen Marsh
v1.0 - 8th May 2024, Initial release.
v1.1 - 9th May 2024, Added code to set the artboard background colour.
v1.2 - 13th August 2025, Reworked the selectAllLayers function, reworked the smart object conversion code.
v1.3 - 14th August 2025, Added a step to unlock all selected floating layers before converting to a smart object. Various UX enhancements.
v1.4 - 15th August 2025, Artboard creation reworked to correctly handle content extending out of the artboard bounds
v1.5 - 16th August 2025, Added checks to abort the script if artboards are detected in the input files
v1.6 - 19th August 2025, Artboard arrangement modified (0 = one single row, 1 = one single column, 2 = two columns etc.)
v2.0 - 19th August 2025, Added a consolidated user interface, replacing the use of system prompts

https://community.adobe.com/t5/photoshop-ecosystem-discussions/how-to-export-to-artboards-using-the-photoshop-variables/td-p/14603249

Based on:
https://community.adobe.com/t5/photoshop-ecosystem/combining-mulitple-photoshop-files-into-1-photoshop-file-with-artboards/td-p/12218200
*/

#target photoshop

try {
if (app.documents.length === 0) {
var dialog = createDialog();
dialog.show();
} else {
alert('Please close all open files before running this script...');
}
} catch (e) {
alert("Error!" + "\r" + e + ' ' + e.line);
}

function createDialog() {
try {
var dialog = new Window("dialog", "Stack Files to Artboards (v2.0)");
dialog.orientation = "column";
dialog.alignChildren = "fill";
dialog.spacing = 10;
dialog.margins = [10, 15, 10, 10];

// Main UI panel
var mainPanel = dialog.add("panel", undefined, ""); // Blank panel/group heading
mainPanel.orientation = "column";
mainPanel.alignChildren = "fill";
mainPanel.spacing = 10;
mainPanel.margins = 10;

// Input folder UI selection
var folderLabel = mainPanel.add("statictext", undefined, "Input Folder:");

var folderGroup = mainPanel.add("group");
folderGroup.orientation = "row";
folderGroup.alignChildren = "center";

var browseBtn = folderGroup.add("button", undefined, "Browse...");
browseBtn.preferredSize.width = 80;

var folderPath = folderGroup.add("edittext", undefined, "No folder selected...");
folderPath.alignment = ["fill", "center"]; // maximise the field width
folderPath.enabled = false;

// Grid UI settings
var gridGroup = mainPanel.add("group");
gridGroup.orientation = "row";
gridGroup.alignChildren = "center";

var columnsHelpTip = "(0 = one single row, 1 = one single column, 2 = two columns etc.)";

var columnsLabel = gridGroup.add("statictext", undefined, "Grid Columns:");
columnsLabel.helpTip = columnsHelpTip;
columnsLabel.preferredSize.width = 100;

var columnsInput = gridGroup.add("editnumber", undefined, "1");
columnsInput.helpTip = columnsHelpTip;
columnsInput.preferredSize.width = 60;
columnsInput.justify = "center";

gridGroup.add("statictext", undefined, "Spacing X (px):");
var spacingXInput = gridGroup.add("editnumber", undefined, "300");
spacingXInput.preferredSize.width = 60;
spacingXInput.justify = "center";

gridGroup.add("statictext", undefined, "Spacing Y (px):");
var spacingYInput = gridGroup.add("editnumber", undefined, "300");
spacingYInput.preferredSize.width = 60;
spacingYInput.justify = "center";

// Background color UI options
var bgGroup = mainPanel.add("group");
bgGroup.orientation = "row";
bgGroup.alignChildren = "center";

var bgLabel = bgGroup.add("statictext", undefined, "Artboard Background:");
bgLabel.preferredSize.width = 100;

var bgRadio1 = bgGroup.add("radiobutton", undefined, "White");
var bgRadio2 = bgGroup.add("radiobutton", undefined, "Black");
var bgRadio3 = bgGroup.add("radiobutton", undefined, "Transparent");
bgRadio3.value = true; // Default to transparent

// File format UI info
var infoText = mainPanel.add("statictext", undefined, "Supported extensions: WEBP, AVIF, JPG/JPEG, TIF/TIFF, PNG, PSD, PSB", { multiline: true });
infoText.preferredSize.width = 400;

// Buttons
var buttonGroup = dialog.add("group");
buttonGroup.orientation = "row";
buttonGroup.alignment = "right";
buttonGroup.spacing = 10;
buttonGroup.margins = 10;

var cancelBtn = buttonGroup.add("button", undefined, "Cancel", { name: "cancel" });
var okBtn = buttonGroup.add("button", undefined, "OK", { name: "ok" });
okBtn.enabled = false;

// Store references for global access
dialog.folderPath = folderPath;
dialog.columnsInput = columnsInput;
dialog.spacingXInput = spacingXInput;
dialog.spacingYInput = spacingYInput;
dialog.bgRadio1 = bgRadio1;
dialog.bgRadio2 = bgRadio2;
dialog.bgRadio3 = bgRadio3;
dialog.okBtn = okBtn;
dialog.selectedFolder = null;
dialog.inputFiles = [];

// Event handlers
browseBtn.onClick = function () {
var folder = Folder.selectDialog('Please select the input folder:');
if (folder !== null) {
dialog.selectedFolder = folder;
folderPath.text = folder.fsName;

// Get supported files
var files = folder.getFiles(/\.(webp|avif|jpg|jpeg|tif|tiff|png|psd|psb)$/i);
dialog.inputFiles = files.sort().reverse();

if (files.length > 0) {
okBtn.enabled = true;
} else {
okBtn.enabled = false;
alert("No supported files found in selected folder");
}
}
};

// Process button event handler (capture settings BEFORE closing the dialog)
okBtn.onClick = function () {
// Build settings snapshot safely before closing UI
var settings = {
columns: (dialog.columnsInput.value !== null && dialog.columnsInput.value !== undefined) ? dialog.columnsInput.value : 1,
spacingX: dialog.spacingXInput.value || 300,
spacingY: dialog.spacingYInput.value || 300,
backgroundColor: dialog.bgRadio1.value ? 1 : (dialog.bgRadio2.value ? 2 : 3),
inputFiles: dialog.inputFiles.slice(0),
selectedFolder: dialog.selectedFolder
};

app.bringToFront();
dialog.close(1); // close main UI dialog

// Open the progress bar window and run
var progressWin = createProgressWindow(settings.inputFiles.length);
try {
processFiles.call({ settings: settings, progressWin: progressWin });
} catch (e) {
alert("Processing error!" + "\r" + e + ' ' + e.line);
} finally {
try {
// End of script
app.bringToFront();
progressWin.close();
app.togglePalettes();
selectTool('artboardTool');
selectView("fitOnScreen");
selectView("zoomOut");
progressWin.updateProgress(settings.inputFiles.length, "Complete!");
app.beep();
alert("Script completed!" + "\r\r" + "Manually arrange the artboards as required (Press Tab to restore the hidden panels).");
} catch (e) { }
}
};
return dialog;
} catch (e) {
alert("createDialog function error!" + "\r" + e + ' ' + e.line);
}
}

// Progress bar window
function createProgressWindow(totalFiles) {
var win = new Window("palette", "Processing Files", undefined, { closeButton: false });
win.orientation = "column";
win.alignChildren = "fill";
win.spacing = 10;
win.margins = 10;

var statusText = win.add("statictext", undefined, "Starting...");
var progressBar = win.add("progressbar", undefined, 0, Math.max(1, totalFiles));
progressBar.preferredSize.width = 400;
progressBar.preferredSize.height = 20;

win.updateProgress = function (current, text) {
progressBar.value = Math.min(progressBar.maxvalue, Math.max(0, current));
statusText.text = text || "";
win.update();
app.refresh();
};

win.show();
return win;
}

function processFiles() {
try {
var settings = this.settings;
var progressWin = this.progressWin;

if (!settings || !settings.selectedFolder) {
alert("No folder selected!");
return;
}

if (!settings.inputFiles || settings.inputFiles.length === 0) {
alert("No supported files found!");
return;
}

// Capture the original ruler units and set to pixels
var origUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;

// Open the first "base" file
progressWin.updateProgress(0, "Initialising...");
var firstFile = app.open(File(settings.inputFiles[0]));

// Artboard check
var artboards = findArtboards();
if (artboards.length > 0) {
alert("Artboards are not supported as input!");
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
app.preferences.rulerUnits = origUnits;
return;
}

// Process the "base" file
var firstFileName = app.activeDocument.name.replace(/\.[^\.]+$/, '');
var layers = app.activeDocument.layers;
var layer = layers[layers.length - 1];
if (layer.isBackgroundLayer) {
layer.name = 'Background';
}
selectAllLayers();
applyLocking(true);
newArtboard(settings.backgroundColor);
app.activeDocument.duplicate("Artboard Stack from Files", false);
firstFile.close(SaveOptions.DONOTSAVECHANGES);
var artboardStack = app.activeDocument;
artboardStack.activeLayer.name = firstFileName;

// Update the progress bar
progressWin.updateProgress(1, "Processed 1 of " + settings.inputFiles.length + " files");

// Open the remaining files
for (var i = 1; i < settings.inputFiles.length; i++) {
progressWin.updateProgress(i, "Processing file " + (i + 1) + " of " + settings.inputFiles.length + "...");

app.open(File(settings.inputFiles[i]));

// Artboard check
artboards = findArtboards();
if (artboards.length > 0) {
alert("Artboards are not supported as input!");
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
artboardStack.close(SaveOptions.DONOTSAVECHANGES);
app.preferences.rulerUnits = origUnits;
return;
}

layers = app.activeDocument.layers;
layer = layers[layers.length - 1];
if (layer.isBackgroundLayer) {
layer.name = 'Background';
}
selectAllLayers();
applyLocking(true);
newArtboard(settings.backgroundColor);
dupeToBaseDoc(settings.backgroundColor);
}

// Update the progress bar
progressWin.updateProgress(settings.inputFiles.length, "Arranging artboards...");

// Arrange the artboards into a grid (skip if 0 columns)
if (settings.columns > 0) {
arrangeArtboards(settings.columns, settings.spacingX, settings.spacingY);
}
app.activeDocument.trim(TrimType.TRANSPARENT);

// Update the progress bar
progressWin.updateProgress(settings.inputFiles.length, "Finalizing...");

// Return the original ruler units
app.preferences.rulerUnits = origUnits;

} catch (e) {
alert("processFiles function error!" + "\r" + e + ' ' + e.line);
}
}


///// Helper Functions /////

function arrangeArtboards(clms, space_x, space_y) {
try {

/*
https://community.adobe.com/t5/photoshop-ecosystem-discussions/script-to-arrange-artboard-in-grid/td-p/9417657
by r-bin
modified for 1-column layout
*/

var abLength = app.activeDocument.layerSets.length;

clms = Number(clms);
if (isNaN(clms) || clms <= 0) {
// Invalid value or 0 columns, just return without arranging
return;
}

space_x = Number(space_x) || 300;
space_y = Number(space_y) || 300;

var arts = new Array();
var w = 300;
var h = 300;

// Collect artboards and their rects
for (var i = 0; i < activeDocument.layerSets.length; i++) {
var r = new ActionReference();
r.putProperty(stringIDToTypeID("property"), stringIDToTypeID("artboardEnabled"));
r.putIdentifier(stringIDToTypeID("layer"), activeDocument.layerSets[i].id);

if (executeActionGet(r).getBoolean(stringIDToTypeID("artboardEnabled"))) {
var r2 = new ActionReference();
r2.putProperty(stringIDToTypeID("property"), stringIDToTypeID("artboard"));
r2.putIdentifier(stringIDToTypeID("layer"), activeDocument.layerSets[i].id);

var rect = executeActionGet(r2).getObjectValue(stringIDToTypeID("artboard")).getObjectValue(stringIDToTypeID("artboardRect"));

var l = rect.getDouble(stringIDToTypeID("left"));
var t = rect.getDouble(stringIDToTypeID("top"));
var rgt = rect.getDouble(stringIDToTypeID("right"));
var b = rect.getDouble(stringIDToTypeID("bottom"));

// store the specific layerSet reference and its rect
arts.push([activeDocument.layerSets[i], [l, t, rgt, b]]);

var w1 = rgt - l;
var h1 = b - t;
if (w1 > w) w = w1;
if (h1 > h) h = h1;
}
}

// calculate rows
var rows = Math.floor(arts.length / clms);
if (rows * clms < arts.length) rows++;

// arrange artboards
var i = 0;
for (var y = 0; y < rows; y++) {
var pos_y = y * (h + space_y);
for (var x = 0; x < clms; x++) {
if (i >= arts.length) break;
activeDocument.activeLayer = arts[i][0];
var pos_x = x * (w + space_x);
move(pos_x - arts[i][1][0], pos_y - arts[i][1][1]);
i++;
}
}

function move(x, y) {
try {
var d = new ActionDescriptor();
var r = new ActionReference();
r.putEnumerated(stringIDToTypeID("layer"), stringIDToTypeID("ordinal"), stringIDToTypeID("targetEnum"));
d.putReference(stringIDToTypeID("null"), r);
var d1 = new ActionDescriptor();
d1.putUnitDouble(stringIDToTypeID("horizontal"), stringIDToTypeID("pixelsUnit"), x);
d1.putUnitDouble(stringIDToTypeID("vertical"), stringIDToTypeID("pixelsUnit"), y);
d.putObject(stringIDToTypeID("to"), stringIDToTypeID("offset"), d1);
executeAction(stringIDToTypeID("move"), d, DialogModes.NO);
} catch (e) {
alert("arrangeArtboards.move() error!\r" + e + " " + e.line);
}
}
} catch (e) {
alert("arrangeArtboards() error!\r" + e + " " + e.line);
}
}

function selectAllLayers() {
try {
// Select all non-background layers
var c2t = function (s) { return app.charIDToTypeID(s); };
var s2t = function (s) { return app.stringIDToTypeID(s); };
var doc = app.activeDocument;
var descriptor = new ActionDescriptor();
var reference2 = new ActionReference();
reference2.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
descriptor.putReference(c2t("null"), reference2);
executeAction(s2t("selectAllLayers"), descriptor, DialogModes.NO);
// If the bottom layer is a background layer, add it to the selection
if (doc.layers[doc.layers.length - 1].isBackgroundLayer) {
var descriptor2 = new ActionDescriptor();
var reference = new ActionReference();
reference.putProperty(s2t("layer"), s2t("background"));
descriptor2.putReference(c2t("null"), reference);
descriptor2.putEnumerated(s2t("selectionModifier"), s2t("selectionModifierType"), s2t("addToSelection"));
descriptor2.putBoolean(s2t("makeVisible"), false);
executeAction(s2t("select"), descriptor2, DialogModes.NO);
}
} catch (e) {
alert("selectAllLayers function error!" + "\r" + e + ' ' + e.line);
}
}

function applyLocking(protectNone) {
try {
var c2t = function (s) { return app.charIDToTypeID(s); };
var s2t = function (s) { return app.stringIDToTypeID(s); };
var descriptor = new ActionDescriptor();
var descriptor2 = new ActionDescriptor();
var reference = new ActionReference();
reference.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
descriptor.putReference(c2t("null"), reference);
descriptor2.putBoolean(s2t("protectNone"), protectNone);
descriptor.putObject(s2t("layerLocking"), s2t("layerLocking"), descriptor2);
executeAction(s2t("applyLocking"), descriptor, DialogModes.NO);
} catch (e) {
alert("applyLocking function error!" + "\r" + e + ' ' + e.line);
}
}

function artboardBackground(artboardColor) {
try {
var ideditArtboardEvent = stringIDToTypeID("editArtboardEvent");
var desc520 = new ActionDescriptor();
var idnull = stringIDToTypeID("null");
var ref129 = new ActionReference();
var idlayer = stringIDToTypeID("layer");
var idordinal = stringIDToTypeID("ordinal");
var idtargetEnum = stringIDToTypeID("targetEnum");
var desc521 = new ActionDescriptor();
var idartboard = stringIDToTypeID("artboard");
var idchangeBackground = stringIDToTypeID("changeBackground");
ref129.putEnumerated(idlayer, idordinal, idtargetEnum);
desc520.putReference(idnull, ref129);
// Static options for "Other" idartboardBackgroundType = 4
var idcolor = stringIDToTypeID("color");
var desc523 = new ActionDescriptor();
var idred = stringIDToTypeID("red");
desc523.putDouble(idred, 128.000000);
var idgrain = stringIDToTypeID("grain");
desc523.putDouble(idgrain, 128.000000);
var idblue = stringIDToTypeID("blue");
desc523.putDouble(idblue, 128.000000);
var idRGBColor = stringIDToTypeID("RGBColor");
desc521.putObject(idcolor, idRGBColor, desc523);
var idartboardBackgroundType = stringIDToTypeID("artboardBackgroundType");
// putInteger 1 = White, 2 = Black, 3 = Transparent, 4 = Other
desc521.putInteger(idartboardBackgroundType, artboardColor);
desc520.putObject(idartboard, idartboard, desc521);
desc520.putInteger(idchangeBackground, 1);
executeAction(ideditArtboardEvent, desc520, DialogModes.NO);
} catch (e) {
alert("artboardBackground function error!" + "\r" + e + ' ' + e.line);
}
}

function selectTool(tool) {
try {
var desc9 = new ActionDescriptor();
var ref7 = new ActionReference();
ref7.putClass(app.stringIDToTypeID(tool));
desc9.putReference(app.charIDToTypeID('null'), ref7);
executeAction(app.charIDToTypeID('slct'), desc9, DialogModes.NO);
} catch (e) {
alert("selectTool function error!" + "\r" + e + ' ' + e.line);
}
}

function selectView(menuItem) {
try {
var c2t = function (s) { return app.charIDToTypeID(s); };
var s2t = function (s) { return app.stringIDToTypeID(s); };
var descriptor = new ActionDescriptor();
var reference = new ActionReference();
reference.putEnumerated(s2t("menuItemClass"), s2t("menuItemType"), s2t(menuItem));
descriptor.putReference(c2t("null"), reference);
executeAction(s2t("select"), descriptor, DialogModes.NO);
} catch (e) {
alert("selectView function error!" + "\r" + e + ' ' + e.line);
}
}

function newArtboard(backgroundColor) {
try {
var c2t = function (s) { return app.charIDToTypeID(s); };
var s2t = function (s) { return app.stringIDToTypeID(s); };
var descriptor = new ActionDescriptor();
var descriptor2 = new ActionDescriptor();
var reference = new ActionReference();
reference.putClass(s2t("artboardSection"));
descriptor.putReference(c2t("null"), reference);
descriptor.putString(s2t("name"), app.activeDocument.name.replace(/\.[^\.]+$/, ''));
descriptor2.putDouble(s2t("top"), 0.000000);
descriptor2.putDouble(s2t("left"), 0.000000);
descriptor2.putDouble(s2t("bottom"), app.activeDocument.height.value);
descriptor2.putDouble(s2t("right"), app.activeDocument.width.value);
descriptor.putObject(s2t("artboardRect"), s2t("classFloatRect"), descriptor2);
executeAction(s2t("make"), descriptor, DialogModes.NO);
app.activeDocument.activeLayer.name = app.activeDocument.name.replace(/\.[^\.]+$/, '');
artboardBackground(backgroundColor || 3);
} catch (e) {
alert("newArtboard function error!" + "\r" + e + ' ' + e.line);
}
}

function dupeToBaseDoc(backgroundColor) {
try {
var c2t = function (s) { return app.charIDToTypeID(s); };
var s2t = function (s) { return app.stringIDToTypeID(s); };
var descriptor = new ActionDescriptor();
var reference = new ActionReference();
var reference2 = new ActionReference();
reference.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
descriptor.putReference(c2t("null"), reference);
reference2.putName(s2t("document"), "Artboard Stack from Files");
descriptor.putReference(s2t("to"), reference2);
descriptor.putString(s2t("name"), app.activeDocument.name.replace(/\.[^\.]+$/, ''));
descriptor.putInteger(s2t("version"), 5);
executeAction(s2t("duplicate"), descriptor, DialogModes.NO);
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
artboardBackground(backgroundColor || 3);
app.activeDocument.activeLayer = app.activeDocument.activeLayer.layers[0];
} catch (e) {
alert("dupeToBaseDoc function error!" + "\r" + e + ' ' + e.line);
}
}

function findArtboards() {
try {
var layers = app.activeDocument.layers;
var artboards = [];
for (var i = 0; i < layers.length; i++) {
if (isArtboard(layers[i].id)) {
artboards.push(layers[i]);
}
}
return artboards;

function isArtboard(layerID) {
try {
var r = new ActionReference();
r.putIdentifier(stringIDToTypeID('layer'), layerID);
var options = executeActionGet(r);
return options.hasKey(stringIDToTypeID('artboard'));
} catch (e) {
return false;
}
}
} catch (e) {
alert("findArtboards function error!" + "\r" + e + ' ' + e.line);
}
}

 

Stephen Marsh
Community Expert
Community Expert
August 13, 2025
Stephen Marsh
Community Expert
Stephen MarshCommunity ExpertCorrect answer
Community Expert
May 8, 2024

@Lucas347275917lt9 

 

Assuming that you have a folder containing layered PSD files created from the data sets, you can try the following script to stack each PSD as an artboard, retaining the original layers from each separate PSD. This script is only intended for later CC versions and has been successfully tested in v2021, v2024 and v2025 on Mac and Win.

 

EDIT: Original code upated to v1.7 (20th August 2025)

 

/*
Stack Layered Files to Artboards.jsx
Stephen Marsh
v1.0 - 8th May 2024: Initial release.
v1.1 - 9th May 2024: Added code to set the artboard background colour.
v1.2 - 13th August 2025: Reworked the selectAllLayers function. Reworked the smart object conversion code.
v1.3 - 14th August 2025: Added a step to unlock all selected floating layers before converting to a smart object. Various UX enhancements.
v1.4 - 15th August 2025: Artboard creation reworked to correctly handle content extending out of the artboard bounds. Smart objects are no longer used to dupe artboards.
v1.5 - 16th August 2025: Added checks to abort the script if artboards are detected in the input files.
v1.6 - 19th August 2025: Artboard arrangement modified: 0 = one single row, 1 = one single column, 2 = two columns etc. Digit validation check added to the column number prompt.
v1.7 - 20th August 2025: Code refactored, hopefully it's not broken! :]

https://community.adobe.com/t5/photoshop-ecosystem-discussions/how-to-export-to-artboards-using-the-photoshop-variables/td-p/14603249

Originally based on:
https://community.adobe.com/t5/photoshop-ecosystem/combining-mulitple-photoshop-files-into-1-photoshop-file-with-artboards/td-p/12218200
*/

// Global helpers
var c2t = function (s) { return app.charIDToTypeID(s); };
var s2t = function (s) { return app.stringIDToTypeID(s); };

#target photoshop

try {
    if (app.documents.length === 0) {
        (function () {
            var origUnits = app.preferences.rulerUnits;
            app.preferences.rulerUnits = Units.PIXELS;

            var inputFolder = Folder.selectDialog('Please select the input folder:');
            if (inputFolder === null) {
                app.beep();
                return;
            }

            var inputFiles = inputFolder.getFiles(/\.(webp|avif|jpg|jpeg|tif|tiff|png|psd|psb)$/i);
            inputFiles.sort(function (a, b) {
                return decodeURI(a.name).toLowerCase().localeCompare(decodeURI(b.name).toLowerCase());
            }).reverse();

            // Open first file
            var firstFile = app.open(File(inputFiles[0]));
            if (checkForArtboardsAndAbort(firstFile)) return;

            normalizeBackgroundLayer();
            selectAllLayers();
            applyLocking(true);
            newArtboard();
            app.activeDocument.duplicate("Artboard Stack from Files", false);
            firstFile.close(SaveOptions.DONOTSAVECHANGES);

            var artboardStack = app.activeDocument;
            artboardStack.activeLayer.name = app.activeDocument.name.replace(/\.[^\.]+$/, '');

            // Process remaining files
            for (var i = 1; i < inputFiles.length; i++) {
                var remainingFile = app.open(File(inputFiles[i]));
                if (checkForArtboardsAndAbort(remainingFile, artboardStack)) return;

                normalizeBackgroundLayer();
                selectAllLayers();
                applyLocking(true);
                newArtboard();
                dupeToBaseDoc(remainingFile, artboardStack);
            }

            // Arrange & cleanup
            app.beep();
            arrangeArtboards();
            app.activeDocument.trim(TrimType.TRANSPARENT);
            app.preferences.rulerUnits = origUnits;

            app.togglePalettes();
            app.beep();
            selectTool('artboardTool');
            selectView("fitOnScreen");
            selectView("zoomOut");
            alert("Script completed!" + "\r\r" + "Manually arrange the artboards as required (Press Tab to restore the hidden panels).");


            ///// Functions /////

            function normalizeBackgroundLayer() {
                var layers = app.activeDocument.layers;
                var layer = layers[layers.length - 1];
                if (layer.isBackgroundLayer) layer.name = 'Background';
            }

            function checkForArtboardsAndAbort(docToClose, stackDoc) {
                if (findArtboards().length > 0) {
                    alert("Artboards are not supported as input!");
                    docToClose.close(SaveOptions.DONOTSAVECHANGES);
                    if (stackDoc) stackDoc.close(SaveOptions.DONOTSAVECHANGES);
                    return true;
                }
                return false;
            }

            function selectAllLayers() {
                try {
                    var doc = app.activeDocument;
                    var descriptor = new ActionDescriptor();
                    var reference2 = new ActionReference();
                    reference2.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
                    descriptor.putReference(c2t("null"), reference2);
                    executeAction(s2t("selectAllLayers"), descriptor, DialogModes.NO);

                    if (doc.layers[doc.layers.length - 1].isBackgroundLayer) {
                        var descriptor2 = new ActionDescriptor();
                        var reference = new ActionReference();
                        reference.putProperty(s2t("layer"), s2t("background"));
                        descriptor2.putReference(c2t("null"), reference);
                        descriptor2.putEnumerated(s2t("selectionModifier"), s2t("selectionModifierType"), s2t("addToSelection"));
                        descriptor2.putBoolean(s2t("makeVisible"), false);
                        executeAction(s2t("select"), descriptor2, DialogModes.NO);
                    }
                } catch (e) {
                    alert("selectAllLayers() error!\r" + e + " " + e.line);
                }
            }

            function applyLocking(protectNone) {
                try {
                    var descriptor = new ActionDescriptor();
                    var descriptor2 = new ActionDescriptor();
                    var reference = new ActionReference();
                    reference.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
                    descriptor.putReference(c2t("null"), reference);
                    descriptor2.putBoolean(s2t("protectNone"), protectNone);
                    descriptor.putObject(s2t("layerLocking"), s2t("layerLocking"), descriptor2);
                    executeAction(s2t("applyLocking"), descriptor, DialogModes.NO);
                } catch (e) {
                    alert("applyLocking() error!\r" + e + " " + e.line);
                }
            }

            function arrangeArtboards() {
                try {
                    var abLength = app.activeDocument.layerSets.length;
                    var theColumns = 1;
                    var space_x = 250;
                    var space_y = 250;

                    while (isNaN(theColumns = prompt("Arrange " + abLength + " artboards into a grid. \rEnter the number of columns (0 = one single row, 1 = one single column, 2 = two columns etc.):", theColumns))) {
                        if (theColumns === null || theColumns === "") {
                            alert('Script cancelled!');
                            return;
                        }
                        alert('Please enter a valid whole number!');
                    }
                    theColumns = parseInt(theColumns);
                    if (theColumns === 0) return;
                    if (theColumns < 1) theColumns = 1;

                    var theArtboards = [], w = 0, h = 0;
                    for (var i = 0; i < activeDocument.layerSets.length; i++) {
                        var r = new ActionReference();
                        r.putProperty(s2t("property"), s2t("artboardEnabled"));
                        r.putIdentifier(s2t("layer"), activeDocument.layerSets[i].id);

                        if (executeActionGet(r).getBoolean(s2t("artboardEnabled"))) {
                            var r2 = new ActionReference();
                            r2.putProperty(s2t("property"), s2t("artboard"));
                            r2.putIdentifier(s2t("layer"), activeDocument.layerSets[i].id);
                            var rect = executeActionGet(r2).getObjectValue(s2t("artboard")).getObjectValue(s2t("artboardRect"));

                            var l = rect.getDouble(s2t("left"));
                            var t = rect.getDouble(s2t("top"));
                            var rgt = rect.getDouble(s2t("right"));
                            var b = rect.getDouble(s2t("bottom"));

                            theArtboards.push([activeDocument.layerSets[i], [l, t, rgt, b]]);
                            var w1 = rgt - l, h1 = b - t;
                            if (w1 > w) w = w1;
                            if (h1 > h) h = h1;
                        }
                    }

                    var rows = Math.floor(theArtboards.length / theColumns);
                    if (rows * theColumns < theArtboards.length) rows++;

                    var i = 0;
                    for (var y = 0; y < rows; y++) {
                        var pos_y = y * (h + space_y);
                        for (var x = 0; x < theColumns; x++) {
                            if (i >= theArtboards.length) break;
                            activeDocument.activeLayer = theArtboards[i][0];
                            var pos_x = x * (w + space_x);
                            move(pos_x - theArtboards[i][1][0], pos_y - theArtboards[i][1][1]);
                            i++;
                        }
                    }

                    function move(x, y) {
                        try {
                            var d = new ActionDescriptor();
                            var r = new ActionReference();
                            r.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
                            d.putReference(s2t("null"), r);
                            var d1 = new ActionDescriptor();
                            d1.putUnitDouble(s2t("horizontal"), s2t("pixelsUnit"), x);
                            d1.putUnitDouble(s2t("vertical"), s2t("pixelsUnit"), y);
                            d.putObject(s2t("to"), s2t("offset"), d1);
                            executeAction(s2t("move"), d, DialogModes.NO);
                        } catch (e) {
                            alert("arrangeArtboards.move() error!\r" + e + " " + e.line);
                        }
                    }
                } catch (e) {
                    alert("arrangeArtboards() error!\r" + e + " " + e.line);
                }
            }

            function artboardBackground(artboardColor) {
                try {
                    var ideditArtboardEvent = s2t("editArtboardEvent");
                    var desc520 = new ActionDescriptor();
                    var ref129 = new ActionReference();
                    ref129.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
                    desc520.putReference(c2t("null"), ref129);
                    var desc521 = new ActionDescriptor();
                    var idcolor = s2t("color");
                    var desc523 = new ActionDescriptor();
                    desc523.putDouble(s2t("red"), 128);
                    desc523.putDouble(s2t("grain"), 128);
                    desc523.putDouble(s2t("blue"), 128);
                    desc521.putObject(idcolor, s2t("RGBColor"), desc523);
                    desc521.putInteger(s2t("artboardBackgroundType"), artboardColor);
                    desc520.putObject(s2t("artboard"), s2t("artboard"), desc521);
                    desc520.putInteger(s2t("changeBackground"), 1);
                    executeAction(ideditArtboardEvent, desc520, DialogModes.NO);
                } catch (e) {
                    alert("artboardBackground() error!\r" + e + " " + e.line);
                }
            }

            function selectTool(tool) {
                try {
                    var desc9 = new ActionDescriptor();
                    var ref7 = new ActionReference();
                    ref7.putClass(s2t(tool));
                    desc9.putReference(c2t('null'), ref7);
                    executeAction(c2t('slct'), desc9, DialogModes.NO);
                } catch (e) {
                    alert("selectTool() error!\r" + e + " " + e.line);
                }
            }

            function selectView(menuItem) {
                try {
                    var descriptor = new ActionDescriptor();
                    var reference = new ActionReference();
                    reference.putEnumerated(s2t("menuItemClass"), s2t("menuItemType"), s2t(menuItem));
                    descriptor.putReference(c2t("null"), reference);
                    executeAction(s2t("select"), descriptor, DialogModes.NO);
                } catch (e) {
                    alert("selectView() error!\r" + e + " " + e.line);
                }
            }

            function newArtboard() {
                try {
                    var descriptor = new ActionDescriptor();
                    var descriptor2 = new ActionDescriptor();
                    var reference = new ActionReference();
                    reference.putClass(s2t("artboardSection"));
                    descriptor.putReference(c2t("null"), reference);
                    descriptor.putString(s2t("name"), app.activeDocument.name.replace(/\.[^\.]+$/, ''));
                    descriptor2.putDouble(s2t("top"), 0.0);
                    descriptor2.putDouble(s2t("left"), 0.0);
                    descriptor2.putDouble(s2t("bottom"), app.activeDocument.height.value);
                    descriptor2.putDouble(s2t("right"), app.activeDocument.width.value);
                    descriptor.putObject(s2t("artboardRect"), s2t("classFloatRect"), descriptor2);
                    executeAction(s2t("make"), descriptor, DialogModes.NO);
                    app.activeDocument.activeLayer.name = app.activeDocument.name.replace(/\.[^\.]+$/, '');
                    artboardBackground(3);
                } catch (e) {
                    alert("newArtboard() error!\r" + e + " " + e.line);
                }
            }

            function dupeToBaseDoc(openFile, stackDoc) {
                try {
                    var descriptor = new ActionDescriptor();
                    var reference = new ActionReference();
                    reference.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
                    descriptor.putReference(c2t("null"), reference);
                    var reference2 = new ActionReference();
                    reference2.putName(s2t("document"), stackDoc.name);
                    descriptor.putReference(s2t("to"), reference2);
                    descriptor.putInteger(s2t("destinationDocumentID"), stackDoc.id); // dynamic doc ID
                    descriptor.putString(s2t("name"), app.activeDocument.name.replace(/\.[^\.]+$/, ''));
                    descriptor.putInteger(s2t("version"), 5);
                    executeAction(s2t("duplicate"), descriptor, DialogModes.NO);
                    openFile.close(SaveOptions.DONOTSAVECHANGES);
                    artboardBackground(3);
                    app.activeDocument.activeLayer = app.activeDocument.activeLayer.layers[0];
                } catch (e) {
                    alert("dupeToBaseDoc() error!\r" + e + " " + e.line);
                }
            }

            function findArtboards() {
                try {
                    var layers = app.activeDocument.layers;
                    var artboards = [];
                    for (var i = 0; i < layers.length; i++) {
                        if (isArtboard(layers[i].id)) {
                            artboards.push(layers[i]);
                        }
                    }
                    return artboards;

                    function isArtboard(layerID) {
                        try {
                            var r = new ActionReference();
                            r.putIdentifier(s2t('layer'), layerID);
                            var options = executeActionGet(r);
                            return options.hasKey(s2t('artboard'));
                        } catch (e) {
                            return false;
                        }
                    }
                } catch (e) {
                    alert("findArtboards() error!\r" + e + " " + e.line);
                }
            }

        })();
    } else {
        alert('Please close all open files before running this script...');
    }
} catch (e) {
    alert("Error!\r" + e + " " + e.line);
}

 

https://prepression.blogspot.com/2017/11/downloading-and-installing-adobe-scripts.html

 

Todd_Morgan
Legend
August 12, 2025

Using latest version of PSD 26.9.0

 

Stephen Marsh
Community Expert
Community Expert
August 13, 2025

@Todd_Morgan 

 

Please try the revised 1.2 version updated above.

Stephen Marsh
Community Expert
Community Expert
May 7, 2024

Variables/Data-driven graphics were around long before artboards. As you know, they only export to PSD as a native feature.

 

I am aware of an old custom script from the late Mike Hale to export directly to JPEG, so it is possible to extend variables via scripting. So perhaps somebody could directly script data sets to artboards.

 

You can make a feature request by making  a new post and labelling it as an “idea" rather than a discussion:

 

https://community.adobe.com/t5/photoshop-ecosystem-ideas/how-do-i-write-a-feature-request/idi-p/12384447

 

I can envisage an indirect script that would take the output from the variable PSD exports and create a new layered file with an artboard for each separate PSD created from the variables.

 

Artboards have sizes, names, spacing, child layers/groups etc. They are sometimes complex for automation and I have a tough time working with them for scripting their position and spacing. The problem with my approach is that all artboards would be stacked one on top the other, they would not be arranged in a grid or vertically or horizontally. EDIT: Solved!

 

Thinking about this, it would probably just be easier to ignore the built-in variable feature and script the creation of artboard content from a CSV file.