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