Copy link to clipboard
Copied
Hi,
In a photoshop dataset, I wish to do the following-
1. save as .jpg
2. name the file using a variable used in the document
how can this be done? i am using cs4
Here is one way to save the sets as jpgs. It assumes that the activeDocument has datasets defined and uses the first fieldname in the dataset csv as the savename for the jpg.
fileImportDataSets = function(file) {
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putClass( stringIDToTypeID( "dataSetClass" ) );
desc.putReference( charIDToTypeID( "null" ), ref );
desc.putPath( charIDToTypeID( "Usng" ), new File( file ) );
desc.putEnumerate
...
I got it working by checking the listener for the menu item's apply dataset
Copied that into my code and it works fine
However, I have various dataset files in an array and processing it and saving
For some reason its only doing the 1st file and not cycling through the rest of the files
(no errors, but only does the 1st dataset file)
I corrected the script that now it works.
Copy link to clipboard
Copied
Here is one way to save the sets as jpgs. It assumes that the activeDocument has datasets defined and uses the first fieldname in the dataset csv as the savename for the jpg.
fileImportDataSets = function(file) {
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putClass( stringIDToTypeID( "dataSetClass" ) );
desc.putReference( charIDToTypeID( "null" ), ref );
desc.putPath( charIDToTypeID( "Usng" ), new File( file ) );
desc.putEnumerated( charIDToTypeID( "Encd" ), stringIDToTypeID( "dataSetEncoding" ), stringIDToTypeID( "dataSetEncodingAuto" ) );
desc.putBoolean( stringIDToTypeID( "eraseAll" ), true );
desc.putBoolean( stringIDToTypeID( "useFirstColumn" ), true );
executeAction( stringIDToTypeID( "importDataSets" ), desc, DialogModes.NO );
}
applyDataSet = function(setName) {
var desc = new ActionDescriptor();
var setRef = new ActionReference();
setRef.putName( stringIDToTypeID( "dataSetClass" ), setName );
desc.putReference( charIDToTypeID( "null" ), setRef );
executeAction( charIDToTypeID( "Aply" ), desc, DialogModes.NO );
}
getDataSetNames = function(csvFileRef) {
_ftn = function(string){
var csvItems = string.split(",");
datasetName = csvItems[0]
return datasetName;
}
csvFileRef.open();
var datasetArray = new Array();
var i = 0;
while (csvString = csvFileRef.readln()) {
if (csvString.length < 2) continue; // Skip empty lines
datasetArray[i] = _ftn(csvString);
i++;
}
csvFileRef.close();
return datasetArray;
}
// jpeg options used for all the saves
var jpgOptns = new JPEGSaveOptions();
jpgOptns.formatOptions = FormatOptions.STANDARDBASELINE;
jpgOptns.embedColorProfile = true;
jpgOptns.matte = MatteType.NONE;
jpgOptns.quality = 8;
//prompt for file
var csvFileRef = File.openDialog("Please select CSV file");
fileImportDataSets(csvFileRef); //inport the CSV file into the template
var datasetNames = getDataSetNames(csvFileRef);// set up the dataset array
//setup a loop for your data set names
for (i=1; i < datasetNames.length; i++) {
applyDataSet(datasetNames[i]);
//edit the file if needed
//save the file. Here I use testItem.contents of layer 'name' as the filename
app.activeDocument.activeLayer = app.activeDocument.artLayers.getByName("name");
jpgSaveFile = new File(csvFileRef.path + "/" + app.activeDocument.activeLayer.textItem.contents + ".jpg");
app.activeDocument.saveAs (jpgSaveFile ,jpgOptns , true, Extension.LOWERCASE);
}//loop to next data set
Copy link to clipboard
Copied
Found this linked from another thread and I'm a bit confused by its use. Is it supposed to loop automatically and save multiple JPG's one after the other with the data set data and filename applied? I tried it but all it does is save the last data set with name after churning a few seconds. I have about 80+ data sets in a CSV on the first column.
Copy link to clipboard
Copied
I corrected the script that now it works.
Copy link to clipboard
Copied
To make it loop through all dataset names, just change getDataSetNames function to this :
Copy link to clipboard
Copied
Update :
datasetArray = _ftn(read);
Need to change to this for store every line in datasetArray (else it will only store one value)
Copy link to clipboard
Copied
I'm getting an error when I run it on line 52, "Error 1302, No such element. "... app.activeDocument.activeLayer = app.activeDocument.artLayers.getByName("name");
Any ideas?
Copy link to clipboard
Copied
Nevermind! I just renamed my variable from 'filename' to what you had as 'name' and it worked great. This 10 year old java script is a life saver.
Copy link to clipboard
Copied
In the ten that yeares Mike Hale has passed but he is still helping us here Rest In Peace Mike thanks....
Copy link to clipboard
Copied
I've been running into a wall with this exact issue. Can you go more into detail what you did here?
Copy link to clipboard
Copied
Hmmm the dataset is not getting applied automatically for me on my PSD template
The window comes up to select the csv, I select it and it saves the jpg. However it saves the jpg with my template as is, without the data applied
I'm having to manually go into the menu under:
Image > Variables > Datasets
then since the dataset is already loaded, I need to click "Apply"
only then it applies the set
Any thoughts why its not happening automatic?
This is with PS 2019 and WIndows 10
Copy link to clipboard
Copied
The script is best used for "behind the scenes" saving. If you do really want it to update your open PSD, you'll have to continue using the method you mentioned above.
Copy link to clipboard
Copied
I got it working by checking the listener for the menu item's apply dataset
Copied that into my code and it works fine
However, I have various dataset files in an array and processing it and saving
For some reason its only doing the 1st file and not cycling through the rest of the files
(no errors, but only does the 1st dataset file)
Copy link to clipboard
Copied
Nevermind, all good and working now
I had 2 nested for loops, each using the same i to increment, duh!
Copy link to clipboard
Copied
@rejin89342351 – Thank you for your comment! I have updated the code, and tested it in v2019, v2021, v2024:
/*
Photoshop Variables DataSets to JPEG 2024 Update.jsx
https://community.adobe.com/t5/photoshop-ecosystem-discussions/using-datasets/td-p/2665594
by Mike Hale. Updated 10th May 2024 - tested with v2019, v2021 and v2024
It is assumed that the activeDocument has datasets defined and uses the first fieldname in the dataset csv as the savename for the jpg
*/
#target photoshop;
try {
if (app.documents.length > 0) {
(function () {
///// FUNCTIONS /////
fileImportDataSets = function (file) {
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putClass(stringIDToTypeID("dataSetClass"));
desc.putReference(charIDToTypeID("null"), ref);
desc.putPath(charIDToTypeID("Usng"), new File(file));
desc.putEnumerated(charIDToTypeID("Encd"), stringIDToTypeID("dataSetEncoding"), stringIDToTypeID("dataSetEncodingAuto"));
desc.putBoolean(stringIDToTypeID("eraseAll"), true);
desc.putBoolean(stringIDToTypeID("useFirstColumn"), true);
executeAction(stringIDToTypeID("importDataSets"), desc, DialogModes.NO);
};
applyDataSet = function (setName) {
var s2t = function (s) {
return app.stringIDToTypeID(s);
};
var descriptor = new ActionDescriptor();
var reference = new ActionReference();
reference.putName(s2t("dataSetClass"), setName);
descriptor.putReference(s2t("null"), reference);
executeAction(s2t("apply"), descriptor, DialogModes.NO);
};
getDataSetNames = function (csvFileRef) {
_ftn = function (string) {
var csvItems = string.split(",");
datasetName = csvItems[0];
return datasetName;
};
csvFileRef.open();
var datasetArray = new Array();
var i = 0;
while (csvString = csvFileRef.readln()) {
// Skip empty lines
if (csvString.length < 2) continue;
datasetArray[i] = _ftn(csvString);
i++;
}
csvFileRef.close();
return datasetArray;
};
// Prompt and import the CSV file into the template
var csvFileRef = File.openDialog("Please select CSV file:");
// Test if Cancel button returns null, then do nothing
if (csvFileRef === null) {
app.beep();
return;
}
fileImportDataSets(csvFileRef);
// Set up the dataset array
var datasetNames = getDataSetNames(csvFileRef);
// JPEG Save options
var jpgOptns = new JPEGSaveOptions();
jpgOptns.formatOptions = FormatOptions.STANDARDBASELINE;
jpgOptns.embedColorProfile = true;
jpgOptns.matte = MatteType.NONE;
jpgOptns.quality = 10;
// Select the text layer named 'name'
app.activeDocument.activeLayer = app.activeDocument.artLayers.getByName("name");
// Loop over the data sets
for (i = 1; i < datasetNames.length; i++) {
applyDataSet(datasetNames[i]);
// Remove the filename extension
var docName = app.activeDocument.name.replace(/\.[^\.]+$/, '');
// The textItem.contents of layer 'name' is used as the filename suffix
var suffix = app.activeDocument.activeLayer.textItem.contents;
// Save the file
jpgSaveFile = new File(csvFileRef.path + "/" + docName + "_" + suffix + ".jpg");
app.activeDocument.saveAs(jpgSaveFile, jpgOptns, true, Extension.LOWERCASE);
}
})();
} else {
alert('A template file must be open before running this script...');
}
} catch (error) {
alert(error + ', Line: ' + error.line + "\rHint: Is there an active text layer named 'name'?");
}
https://prepression.blogspot.com/2017/11/downloading-and-installing-adobe-scripts.html
Copy link to clipboard
Copied
Thanks for sharing the script. I was able to install it but could not run the script. I already have the CSV file and the dataset defined; instead of exporting datasets to PSD, I intend to export them to jpg. Can you please share step-by-step screenshots on how to go about doing it?
Copy link to clipboard
Copied
I was able to install it but could not run the script.
By @iRushab
I'm not sure what this really means. What Photoshop version? To confirm the steps:
Adobe Photoshop Script Installation Location
Scripts are installed in the /Presets/Scripts folder
Mac OS Example:
Copy link to clipboard
Copied
Hi, I'm trying to use the script too, it works... but it save only 1 image and do not iterate to the other variables, how do I do?
Copy link to clipboard
Copied
My problem was that the csv column data was formatted like "data", after I removed the ", it worked perfectly
Copy link to clipboard
Copied
My problem was that the csv column data was formatted like "data", after I removed the ", it worked perfectly
By @Valerio231295248snk
Do you mean that there was only a single column in the .csv file ending in commas?
Copy link to clipboard
Copied
My csv file was like this:
column_name, column_name, column_name, column_name
"data", "data", "data", "data", "data"
....
And using the function "alert(...)" to log the data, I saw that the "datasetNames[i]" and "applyDataSet" was working correctly, but I notised that also the " was getting logged, so I tried remove them from the .csv file and worked like it shoudl. So I'll add an advice to everyone to check if the .csv file have ", if yes, remove them.
Thanks again fro the script!
Copy link to clipboard
Copied
Thanks for replying. I know how to load the script. But it does not do anything to my file. My Photoshop file has all the variables defined; I just need to export the file as multiple JPG or PNG files. Is there a special way to organize the Photoshop file?
Copy link to clipboard
Copied
Thanks for replying. I know how to load the script. But it does not do anything to my file. My Photoshop file has all the variables defined; I just need to export the file as multiple JPG or PNG files. Is there a special way to organize the Photoshop file? I am using the latest Photoshop version v26.3
Copy link to clipboard
Copied
The dataset text file needs to be comma separated, but the code can be changed if you work with tab delimited files.
There must be a text layer named:
name
Which will be used for the first column to name the JPEG files. Perhaps if you supplied the PSD and CSV file, or at least pertinent screenshots.
Copy link to clipboard
Copied
Here is an updated version of the script, it will hopefully gracefully handle quoted strings, tested in v2019, v2021, v2024 and v2025:
/*
Photoshop Variables Data Sets to JPEG 2025 Update.jsx
v1.1
Updated and extended by Stephen Marsh, 18th February 2025 - tested with v2019, v2021, v2024 and v2025
Original script by Mike Hale, 2010
~ The active document must have Data Sets already defined.
~ The first column in the CSV will be used as the suffix for the JPEG file names, mapped to the appropriate text layer.
https://community.adobe.com/t5/photoshop-ecosystem-discussions/using-datasets/td-p/2665594
https://forums.adobe.com/thread/628182
https://forums.adobe.com/message/2773935#2773935
*/
#target photoshop;
// Adjust the following "user friendly" variables as required. A GUI for these file format options isn't planned!
var separator = '_'; // '_' | ' ' | '-' (underscore, space or hyphen)
var jpegEmbedColorProfile = true; // Boolean: true | false
var jpegFormatOptions = FormatOptions.STANDARDBASELINE; // FormatOptions.STANDARDBASELINE | FormatOptions.OPTIMIZEDBASELINE | FormatOptions.PROGRESSIVE
var jpegMatte = MatteType.NONE; // MatteType.NONE | MatteType.WHITE | MatteType.BLACK
var jpegQuality = 10; // Numeric: 0 - 12 (low quality to highest quality)
///// FUNCTIONS /////
function fileImportDataSets(file) {
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putClass(stringIDToTypeID("dataSetClass"));
desc.putReference(charIDToTypeID("null"), ref);
desc.putPath(charIDToTypeID("Usng"), new File(file));
desc.putEnumerated(charIDToTypeID("Encd"), stringIDToTypeID("dataSetEncoding"), stringIDToTypeID("dataSetEncodingAuto"));
desc.putBoolean(stringIDToTypeID("eraseAll"), true); // Remove all existing data sets
desc.putBoolean(stringIDToTypeID("useFirstColumn"), true);
executeAction(stringIDToTypeID("importDataSets"), desc, DialogModes.NO);
};
function applyDataSet(setName) {
var s2t = function (s) {
return app.stringIDToTypeID(s);
};
var descriptor = new ActionDescriptor();
var reference = new ActionReference();
reference.putName(s2t("dataSetClass"), setName);
descriptor.putReference(s2t("null"), reference);
executeAction(s2t("apply"), descriptor, DialogModes.NO);
};
function getDataSetNames(csvFileRef) {
var _ftn = function (string) {
var csvItems = string.split(",");
//var datasetName = csvItems[0];
var datasetName = csvItems[0].replace(/(^['"]|['"]$)/g, ''); // Clean both single and double quote-escaped values
return datasetName;
};
csvFileRef.open();
var datasetArray = [];
var i = 0;
var csvString;
while (!csvFileRef.eof) {
csvString = csvFileRef.readln();
// Skip empty lines
if (csvString.length < 2) continue;
datasetArray[i] = _ftn(csvString);
i++;
}
csvFileRef.close();
return datasetArray;
};
function padNumber(number) {
var str = number.toString();
while (str.length < 4) {
str = "0" + str;
}
return str;
};
// File format functions
function jpegSaveOptions() {
var jpgOptions = new JPEGSaveOptions();
jpgOptions.formatOptions = jpegFormatOptions;
jpgOptions.embedColorProfile = jpegEmbedColorProfile;
jpgOptions.matte = jpegMatte;
jpgOptions.quality = jpegQuality;
return jpgOptions;
};
///// SCRIPT EXECUTION /////
try {
if (app.documents.length > 0) {
(function () {
// Confirm with the user that the file meets the criteria
if (!confirm("Data Sets must be created before running this script. The text layer for the file name suffix must be active... Continue?", false)) {
return;
}
// Test if the active layer is a text layer
if (app.activeDocument.activeLayer.kind !== LayerKind.TEXT) {
app.beep();
alert("The active layer isn't a text layer!" + "\r" + "The text layer for the file name suffix must be active...");
return;
}
// Prompt and import the CSV file into the template
var csvFileRef = File.openDialog("Please select CSV file:");
// Test if Cancel button returns null, then do nothing
if (csvFileRef === null) {
//app.beep();
return;
}
fileImportDataSets(csvFileRef);
// Select the save folder
var saveFolder = Folder.selectDialog("Please select the output folder to save the files to:");
// Test if Cancel button returns null, then do nothing
if (saveFolder === null) {
//app.beep();
return;
}
// Set up the dataset array
var datasetNames = getDataSetNames(csvFileRef);
// JPEG Save options
var jpgOptions = jpegSaveOptions();
// Initialize the counter for the saved files
var fileCounter = 0;
// Loop over the data sets
for (i = 1; i < datasetNames.length; i++) {
applyDataSet(datasetNames[i]);
// Remove the filename extension
var docName = app.activeDocument.name.replace(/\.[^\.]+$/, '');
// The textItem.contents of active layer to be used as the filename suffix
var suffix = app.activeDocument.activeLayer.textItem.contents;
// The dataset index is used as the filename suffix
// var suffix = padNumber(i); // This will create "0001", "0002", "0003", "0010", "0100" etc.
// Save the file
var jpgSaveFile = new File(saveFolder + "/" + docName + separator + suffix + ".jpg");
app.activeDocument.saveAs(jpgSaveFile, jpgOptions, true, Extension.LOWERCASE);
// Increment the counter
fileCounter++;
}
// End of script notification
app.beep();
alert(fileCounter + " JPEG files have been saved to:" + "\n" + saveFolder.fsName);
// Close the template without saving so as not to affect the original data sets
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
})();
} else {
app.beep();
alert('A template file must be open before running this script...');
}
} catch (error) {
app.beep();
alert(error + ', Line: ' + error.line);
}