This version will create linked smart object layers for all selected "normal" top-level raster layers and layer groups. The linked SO PSB files will be automatically saved to the same path as the parent file (this could be changed to a sub-folder if more convenient for file management). A single undo history step is provided.
/*
Selected Layers to Linked Smart Objects.jsx
v1.0, 20th November 2022, Stephen Marsh
https://community.adobe.com/t5/photoshop-ecosystem-discussions/converting-to-linked-smart-object/td-p/13357539
*/
#target photoshop
function main() {
///// Process selected layers - from 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();
for (var i = 0; i < lrs.count; i++) {
sel.putIdentifier(s2t('layer'), p = lrs.getReference(i).getIdentifier(s2t('layerID')));
(r = new ActionReference()).putIdentifier(s2t('layer'), p);
(d = new ActionDescriptor()).putReference(s2t("target"), r);
executeAction(s2t('select'), d, DialogModes.NO);
/////
// Conditional check for normal or smart object layers, ignoring other layer kinds such as adjustment layers
if (activeDocument.activeLayer.kind == LayerKind.NORMAL || activeDocument.activeLayer.kind == LayerKind.SMARTOBJECT) {
newPlacedLayer();
placedLayerConvertToLinked();
}
///// Functions /////
// Convert the active layer to an embedded smart object
function newPlacedLayer() {
var s2t = function (s) {
return app.stringIDToTypeID(s);
};
executeAction(s2t("newPlacedLayer"), undefined, DialogModes.NO);
}
// Convert the active embedded smart object to a linked smart object
function placedLayerConvertToLinked() {
var savePath = activeDocument.path;
// RegEx remove illegal/invalid filename characters from document name
var layerName = activeDocument.activeLayer.name.replace(/[:\/\\*\?\"\<\>\|\\\r\\\n.]/g, ""); // "/\:*?"<>|\r\n" -> "-";;
var idplacedLayerConvertToLinked = stringIDToTypeID("placedLayerConvertToLinked");
var desc346 = new ActionDescriptor();
var idnull = stringIDToTypeID("null");
var ref49 = new ActionReference();
var idlayer = stringIDToTypeID("layer");
var idordinal = stringIDToTypeID("ordinal");
var idtargetEnum = stringIDToTypeID("targetEnum");
ref49.putEnumerated(idlayer, idordinal, idtargetEnum);
desc346.putReference(idnull, ref49);
var idusing = stringIDToTypeID("using");
desc346.putPath(idusing, new File(savePath + "/" + layerName + ".psb"));
executeAction(idplacedLayerConvertToLinked, desc346, DialogModes.NO);
}
}
}
app.activeDocument.suspendHistory("Selected Layers to Linked Smart Objects", "main()");