Last active
August 8, 2025 13:55
-
-
Save laryn/0a1f6bf0dab5b713395a835f9bfa805c to your computer and use it in GitHub Desktop.
Photoshop script to replace a smart object within a PSD with selected image(s) and save result as a JPG. (Transformations to the smart object will be applied to new images).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Replace SmartObject’s Content and Save as JPG | |
// 2017, use it at your own risk | |
// Via @Circle B: https://graphicdesign.stackexchange.com/questions/92796/replacing-a-smart-object-in-bulk-with-photoshops-variable-data-or-scripts/93359 | |
// JPG code from here: https://forums.adobe.com/thread/737789 | |
#target photoshop | |
if (app.documents.length > 0) { | |
var myDocument = app.activeDocument; | |
var theName = myDocument.name.match(/(.*)\.[^\.]+$/)[1]; | |
var thePath = myDocument.path; | |
var theLayer = myDocument.activeLayer; | |
// JPG Options; | |
jpgSaveOptions = new JPEGSaveOptions(); | |
jpgSaveOptions.embedColorProfile = true; | |
jpgSaveOptions.formatOptions = FormatOptions.STANDARDBASELINE; | |
jpgSaveOptions.matte = MatteType.NONE; | |
jpgSaveOptions.quality = 8; | |
// Check if layer is SmartObject; | |
if (theLayer.kind != "LayerKind.SMARTOBJECT") { | |
alert("selected layer is not a smart object") | |
} else { | |
// Select Files; | |
if ($.os.search(/windows/i) != -1) { | |
var theFiles = File.openDialog("please select files", "*.psd;*.tif;*.jpg", true) | |
} else { | |
var theFiles = File.openDialog("please select files", getFiles, true) | |
}; | |
if (theFiles) { | |
for (var m = 0; m < theFiles.length; m++) { | |
// Replace SmartObject | |
theLayer = replaceContents(theFiles[m], theLayer); | |
var theNewName = theFiles[m].name.match(/(.*)\.[^\.]+$/)[1]; | |
// Save JPG. If you have need of saving different artboards into separate files, | |
// see https://gist.github.com/laryn/0a1f6bf0dab5b713395a835f9bfa805c#gistcomment-3996733 | |
myDocument.saveAs((new File(thePath + "/" + theName + "_" + theNewName + ".jpg")), jpgSaveOptions, true,Extension.LOWERCASE); | |
} | |
} | |
} | |
}; | |
// Get PSDs, TIFs and JPGs from files | |
function getFiles(theFile) { | |
if (theFile.name.match(/\.(psd|tif|jpg)$/i) != null || theFile.constructor.name == "Folder") { | |
return true | |
}; | |
}; | |
// Replace SmartObject Contents | |
function replaceContents(newFile, theSO) { | |
app.activeDocument.activeLayer = theSO; | |
// ======================================================= | |
var idplacedLayerReplaceContents = stringIDToTypeID("placedLayerReplaceContents"); | |
var desc3 = new ActionDescriptor(); | |
var idnull = charIDToTypeID("null"); | |
desc3.putPath(idnull, new File(newFile)); | |
var idPgNm = charIDToTypeID("PgNm"); | |
desc3.putInteger(idPgNm, 1); | |
executeAction(idplacedLayerReplaceContents, desc3, DialogModes.NO); | |
return app.activeDocument.activeLayer | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@petergambos
Sorry for the late reply. I looked at your file. The reason it throws that error, is because this script can only replace when its a linked smartObject. I have been working on another version, the one i showed earlier with the GUI dialog. That one can also edit, meaning it opens the smartObject and places your file inside. Currently i only have jpg and webp implemented properly.
I tested your file yesterday and noticed the original version i made, v4, does throw this error. When i tested it using edit smartObject, it does work.
I can give the script as is, i didnt touch it for a couple months. Was working on some other scripts.
let me know