Skip to main content
Known Participant
May 9, 2024
Question

Script error replacing smart object layers if placed in group within layers panel

  • May 9, 2024
  • 1 reply
  • 228 views

Hello,

 

I have this script that works to replace smart object layers on the main layers panel, however if I place a smart object(s) into a group or folder, I am getting this error. hopefully there is an easy solution.

(see attachment)

 

Here is the script:

 

#target photoshop

app.activeDocument.suspendHistory("Relink Top-Level Smart Object Layers Using New Name Prefix.jsx", "promptAndReplace()");

//-------- Used in promptAndReplace() --------

function getSmartObjectReference() {
// https://stackoverflow.com/questions/63010107/get-a-smart-objects-layers-files-directory-source-in-jsx
try {
var smartObject = {
found: false,
fileRef: '',
filePath: '',
linked: false,
};
var ref, so;
ref = new ActionReference();
ref.putProperty(charIDToTypeID("Prpr"), stringIDToTypeID("smartObject"));
ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
so = executeActionGet(ref).getObjectValue(stringIDToTypeID("smartObject"));
smartObject.found = true;
smartObject.linked = so.getBoolean(stringIDToTypeID("linked"));
smartObject.fileRef = so.getString(stringIDToTypeID("fileReference"));
if (smartObject.linked) {
smartObject.filePath = so.getPath(stringIDToTypeID("link"));
} else {
smartObject.filePath = Folder.temp + '/' + smartObject.fileRef;
}
return smartObject;
} catch (e) {
alert(e);
return smartObject;
}
}

//------ main function -------
function promptAndReplace() {

// Get the active document
var doc = app.activeDocument;

// Set global team name avariables
var prefixTeam1 = ""
var prefixTeam2 = ""
var prefixTeam3 = ""
var prefixTeam4 = ""

//Check for the existence of layers that have TEAM1 then prompt user
for (var i = 0; i < doc.layers.length; i++) {
var layer = doc.layers[i];
activeDocument.activeLayer = activeDocument.artLayers[i];
var layerName = layer.name;

if (layer.kind == LayerKind.SMARTOBJECT) {
var ref = new ActionReference();
ref.putProperty(charIDToTypeID("Prpr"), stringIDToTypeID("smartObject"));
ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
var so = executeActionGet(ref).getObjectValue(stringIDToTypeID("smartObject"));

if (so.getBoolean(stringIDToTypeID("linked"))) {

// Relink file if the layer name contains "AWAY" of "HOME" and is NOT a swatch
if ((layerName.indexOf("TEAM1") !== -1)) {

prefixTeam1 = prompt("Enter the new linked filename prefix for TEAM1:", "TEAM1");
break;
}
}
}
}

//Check for the existence of layers that have TEAM_02 then prompt user
for (var i = 0; i < doc.layers.length; i++) {
var layer = doc.layers[i];
activeDocument.activeLayer = activeDocument.artLayers[i];
var layerName = layer.name;

if (layer.kind == LayerKind.SMARTOBJECT) {
var ref = new ActionReference();
ref.putProperty(charIDToTypeID("Prpr"), stringIDToTypeID("smartObject"));
ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
var so = executeActionGet(ref).getObjectValue(stringIDToTypeID("smartObject"));

if (so.getBoolean(stringIDToTypeID("linked"))) {

// Relink file if the layer name contains "AWAY" of "HOME" and is NOT a swatch
if ((layerName.indexOf("TEAM2") !== -1)) {

prefixTeam2 = prompt("Enter the new linked filename prefix for TEAM2:", "TEAM2");
break;
}
}
}
}

//Check for the existence of layers that have TEAM3 then prompt user
for (var i = 0; i < doc.layers.length; i++) {
var layer = doc.layers[i];
activeDocument.activeLayer = activeDocument.artLayers[i];
var layerName = layer.name;

if (layer.kind == LayerKind.SMARTOBJECT) {
var ref = new ActionReference();
ref.putProperty(charIDToTypeID("Prpr"), stringIDToTypeID("smartObject"));
ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
var so = executeActionGet(ref).getObjectValue(stringIDToTypeID("smartObject"));

if (so.getBoolean(stringIDToTypeID("linked"))) {

// Relink file if the layer name contains "AWAY" of "HOME" and is NOT a swatch
if ((layerName.indexOf("TEAM3") !== -1)) {

prefixTeam3 = prompt("Enter the new linked filename prefix for TEAM3:", "TEAM3");
break;
}
}
}
}

//Check for the existence of layers that have TEAM4 then prompt user
for (var i = 0; i < doc.layers.length; i++) {
var layer = doc.layers[i];
activeDocument.activeLayer = activeDocument.artLayers[i];
var layerName = layer.name;

if (layer.kind == LayerKind.SMARTOBJECT) {
var ref = new ActionReference();
ref.putProperty(charIDToTypeID("Prpr"), stringIDToTypeID("smartObject"));
ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
var so = executeActionGet(ref).getObjectValue(stringIDToTypeID("smartObject"));

if (so.getBoolean(stringIDToTypeID("linked"))) {

// Relink file if the layer name contains "AWAY" of "HOME" and is NOT a swatch
if ((layerName.indexOf("TEAM4") !== -1)) {

prefixTeam4 = prompt("Enter the new linked filename prefix for TEAM4:", "TEAM4");
break;
}
}
}
}

// MAIN - Iterates thru layers and changes path based on layer name
for (var i = 0; i < doc.layers.length; i++) {
var layer = doc.layers[i];
activeDocument.activeLayer = activeDocument.artLayers[i];
var layerName = layer.name;

if (layer.kind == LayerKind.SMARTOBJECT) {
var ref = new ActionReference();
ref.putProperty(charIDToTypeID("Prpr"), stringIDToTypeID("smartObject"));
ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
var so = executeActionGet(ref).getObjectValue(stringIDToTypeID("smartObject"));
if (so.getBoolean(stringIDToTypeID("linked"))) {

// Set the file path and name variables
var thePathFull = getSmartObjectReference().filePath.fsName.toString();

// Get the path up to the file itself
var finalSlashIndex = thePathFull.lastIndexOf("\\");
var thePath = thePathFull.substring(0, finalSlashIndex + 1);

// Get the suffix of the file name after the first underscore
var theFileNameFull = thePathFull.substring(finalSlashIndex); // the full filename
var firstUnderscoreIndex = theFileNameFull.indexOf("_"); //location of the first underscore in filename
var theName = theFileNameFull.substring(firstUnderscoreIndex);

var theAD = new ActionDescriptor();

if ((layerName.indexOf("TEAM1") !== -1) && (layerName.indexOf("_") !== -1)) { // TEAM1 non-swatch

theAD.putPath(stringIDToTypeID("null"), new File(thePath + prefixTeam1 + theName));
executeAction(stringIDToTypeID("placedLayerRelinkToFile"), theAD, DialogModes.NO);

} else if ((layerName.indexOf("TEAM1") !== -1) && (layerName.indexOf("_") == -1)) { // TEAM1 swatch

theAD.putPath(stringIDToTypeID("null"), new File(thePath + prefixTeam1 + ".png"));
executeAction(stringIDToTypeID("placedLayerRelinkToFile"), theAD, DialogModes.NO);

} else if ((layerName.indexOf("TEAM2") !== -1) && (layerName.indexOf("_") !== -1)) { // TEAM2 non-swatch

theAD.putPath(stringIDToTypeID("null"), new File(thePath + prefixTeam2 + theName));
executeAction(stringIDToTypeID("placedLayerRelinkToFile"), theAD, DialogModes.NO);

} else if ((layerName.indexOf("TEAM2") !== -1) && (layerName.indexOf("_") == -1)) { // TEAM2 swatch

theAD.putPath(stringIDToTypeID("null"), new File(thePath + prefixTeam2 + ".png"));
executeAction(stringIDToTypeID("placedLayerRelinkToFile"), theAD, DialogModes.NO);

} else if ((layerName.indexOf("TEAM3") !== -1) && (layerName.indexOf("_") !== -1)) { // TEAM3 non-swatch

theAD.putPath(stringIDToTypeID("null"), new File(thePath + prefixTeam3 + theName));
executeAction(stringIDToTypeID("placedLayerRelinkToFile"), theAD, DialogModes.NO);

} else if ((layerName.indexOf("TEAM3") !== -1) && (layerName.indexOf("_") == -1)) { // TEAM3 swatch

theAD.putPath(stringIDToTypeID("null"), new File(thePath + prefixTeam3 + ".png"));
executeAction(stringIDToTypeID("placedLayerRelinkToFile"), theAD, DialogModes.NO);

} else if ((layerName.indexOf("TEAM4") !== -1) && (layerName.indexOf("_") !== -1)) { // TEAM4 non-swatch

theAD.putPath(stringIDToTypeID("null"), new File(thePath + prefixTeam4 + theName));
executeAction(stringIDToTypeID("placedLayerRelinkToFile"), theAD, DialogModes.NO);

} else if ((layerName.indexOf("TEAM4") !== -1) && (layerName.indexOf("_") == -1)) { // TEAM4 swatch

theAD.putPath(stringIDToTypeID("null"), new File(thePath + prefixTeam4 + ".png"));
executeAction(stringIDToTypeID("placedLayerRelinkToFile"), theAD, DialogModes.NO);

}
}
}
}
}

This topic has been closed for replies.

1 reply

Stephen Marsh
Community Expert
Community Expert
May 9, 2024

 

Line 51:

 

var so = executeActionGet(ref).getObjectValue(stringIDToTypeID("smartObject"));

 

As the active layer is a layerSet, there is no smart object value to retrieve.

 

So you would need to add a conditional check to see if the active layer is a layerSet, and if it is loop over the layers in the set.

 

Code snippets (code isn't fully functional, it's just an example):

 

// Check if the active layer is a group
if (app.activeDocument.activeLayer.typename === "LayerSet") {
    // Loop over the contents of the selected layer group
    for (var i = 0; i < app.activeDocument.activeLayer.layers.length; i++) {
    alert('Do stuff for layers in a group');
}
} else {
    alert('Do the same stuff for layers outside of a group');
}