@Delta2487
Here is a script based on my previously suggested "A" approach... EDIT: Updated 24th November to vA1.1 to include a check for selected layers.
/*
Create Slices From Selected Layers Bounds vA1-1.jsx
Stephen Marsh
vA1.0 - 22nd November 2025: Initial release
vA1.1 - 24th November 2025: Added a check for selected layers
https://community.adobe.com/t5/photoshop-ecosystem-discussions/script-to-create-and-rename-slices-for-selected-layers/td-p/15603067
*/
#target photoshop
// Single history stage undo
activeDocument.suspendHistory("Create Slices From Selected Layers Bounds", "main()");
function main() {
// Check for active layer/s
if (!hasActiveLayer()) {
alert("No active layer/s selected!");
return;
}
// Get the selected layers: courtesy of jazz-y
var s2t = stringIDToTypeID;
(r = new ActionReference()).putProperty(s2t('property'), p = s2t('targetLayersIDs'));
r.putEnumerated(s2t('document'), s2t('ordinal'), s2t('targetEnum'));
var lrs = executeActionGet(r).getList(p),
sel = new ActionReference();
// Loop over the selected layers: courtesy of jazz-y
for (var l = 0; l < lrs.count; l++) {
sel.putIdentifier(s2t('layer'), p = lrs.getReference(l).getIdentifier(s2t('layerID')));
(r = new ActionReference()).putIdentifier(s2t('layer'), p);
(d = new ActionDescriptor()).putReference(s2t("target"), r);
//d.putBoolean(s2t("makeVisible"), false);
executeAction(s2t('select'), d, DialogModes.NO);
///// Start doing stuff to the selected layers /////
//alert(app.activeDocument.activeLayer.name);
createSliceFromActiveLayerBounds();
renameActiveSliceToLayerName();
///// Stop doing stuff to the selected layers /////
}
}
///// Functions /////
function createSliceFromActiveLayerBounds() {
var doc = app.activeDocument;
var layer = doc.activeLayer;
// Ensure pixel units
var originalRuler = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;
// Get layer bounds in pixels (redundant, but it can't hurt)
var b = layer.bounds;
var left = b[0].as("px");
var top = b[1].as("px");
var right = b[2].as("px");
var bottom = b[3].as("px");
// Build the slices using AM code
var idMk = charIDToTypeID("Mk ");
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putClass(stringIDToTypeID("slice"));
desc.putReference(charIDToTypeID("null"), ref);
var sliceDesc = new ActionDescriptor();
sliceDesc.putEnumerated(
charIDToTypeID("Type"),
stringIDToTypeID("sliceType"),
stringIDToTypeID("user")
);
var rect = new ActionDescriptor();
rect.putUnitDouble(charIDToTypeID("Top "), charIDToTypeID("#Pxl"), top);
rect.putUnitDouble(charIDToTypeID("Left"), charIDToTypeID("#Pxl"), left);
rect.putUnitDouble(charIDToTypeID("Btom"), charIDToTypeID("#Pxl"), bottom);
rect.putUnitDouble(charIDToTypeID("Rght"), charIDToTypeID("#Pxl"), right);
sliceDesc.putObject(charIDToTypeID("At "), charIDToTypeID("Rctn"), rect);
desc.putObject(charIDToTypeID("Usng"), stringIDToTypeID("slice"), sliceDesc);
executeAction(idMk, desc, DialogModes.NO);
// Restore the original ruler units
app.preferences.rulerUnits = originalRuler;
}
function renameActiveSliceToLayerName() {
var layerName = app.activeDocument.activeLayer.name;
var idsetd = charIDToTypeID("setd");
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putEnumerated(
stringIDToTypeID("slice"),
charIDToTypeID("Ordn"),
charIDToTypeID("Trgt")
);
desc.putReference(charIDToTypeID("null"), ref);
var inner = new ActionDescriptor();
inner.putString(charIDToTypeID("Nm "), layerName);
desc.putObject(
charIDToTypeID("T "),
stringIDToTypeID("slice"),
inner
);
executeAction(idsetd, desc, DialogModes.NO);
}
function hasActiveLayer() {
try {
// selected layer check by jazz-y
var s2t = stringIDToTypeID;
var r = new ActionReference();
r.putProperty(s2t('property'), s2t('targetLayers'));
r.putEnumerated(s2t("document"), s2t("ordinal"), s2t("targetEnum"));
var desc = executeActionGet(r);
var targetLayers = desc.getList(s2t('targetLayers'));
return targetLayers.count > 0;
} catch (e) {
return false;
}
}