• Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
    Dedicated community for Japanese speakers
  • 한국 커뮤니티
    Dedicated community for Korean speakers
Exit
1

Using datasets

Community Beginner ,
Apr 29, 2010 Apr 29, 2010

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

TOPICS
Actions and scripting

Views

3.0K

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines

correct answers 3 Correct answers

Guru , Apr 30, 2010 Apr 30, 2010

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
...

Votes

Translate

Translate
Community Beginner , Jun 24, 2019 Jun 24, 2019

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)

Votes

Translate

Translate
LEGEND , Sep 09, 2021 Sep 09, 2021

I corrected the script that now it works.

Votes

Translate

Translate
Adobe
Guru ,
Apr 30, 2010 Apr 30, 2010

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

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Dec 21, 2020 Dec 21, 2020

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.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
LEGEND ,
Sep 09, 2021 Sep 09, 2021

Copy link to clipboard

Copied

I corrected the script that now it works.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
May 30, 2021 May 30, 2021

Copy link to clipboard

Copied

To make it loop through all dataset names, just change getDataSetNames function to this : 

 

getDataSetNames = function(csvFileRef) {
     _ftn = function(string){
          var csvItems = string.split(",");
          datasetNames = csvItems[0]          
          return datasetNames;
     }
     csvcsvFileRef.open();
     var datasetArray = new Array();
     var csvLine = csvFileRef.length
     var read;
     for (var i = 1i < csvLinei++) {
        read = csvFileRef.readln();    
        if (read.length < 2continue// Skip empty lines
            datasetArray = _ftn(read);
     }       
     csvList.close();
     return datasetArray;
}

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
May 30, 2021 May 30, 2021

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)

datasetArray.push(_ftn(read));
 
 

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Beginner ,
Apr 30, 2019 Apr 30, 2019

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?

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Beginner ,
Apr 30, 2019 Apr 30, 2019

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.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
May 01, 2019 May 01, 2019

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....

JJMack

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Aug 01, 2022 Aug 01, 2022

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?

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Beginner ,
Jun 21, 2019 Jun 21, 2019

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

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Beginner ,
Jun 21, 2019 Jun 21, 2019

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.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Beginner ,
Jun 24, 2019 Jun 24, 2019

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)

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Beginner ,
Jun 24, 2019 Jun 24, 2019

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!

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
May 10, 2024 May 10, 2024

Copy link to clipboard

Copied

LATEST

@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 () {
               
               // 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);
               }


               ///// 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);
               };

               // Old code updated 10th May 2024
               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;
               };

          })();

     } 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

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines