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

Script for exporting LAB Color swatch values to Excel (CSV)

Enthusiast ,
Oct 15, 2019 Oct 15, 2019

Copy link to clipboard

Copied

Not sure this landed on the right place. Where is the scripting part of the forum? Was it deleted? All that work...

 

(This post is not a question.)

Below you will find a sample script for exporting LAB color swatches from InDesign. InDesign seem to have difficulties keeping thousands of swatches in its palette, so take care. A variant of this script made for Illustrator or Photoshop would probably have been a better idea.

 

 

 

/*
	Script for exporting LAB colours from InDesign Swatches. 
	Number, Name, L, A, and B columns semi colon separated.
	By Andreas Jansson, Code Combinations AB, Sweden, 2019.
	
	Description:
	First import a library of Pantone Colours so that they are present in the swatches palette of InDesign (you can export swatches from Photoshop, to an ASE file that is importable in InDesign).
	Then alter the path below to a folder of your choice and run this script with InDesign.
	The resulting file, I pasted into Excel.
*/

var result = '';
for (var i = 0; i <= app.swatches.length-1; i++){	
	var currentSwatch = app.swatches[i];
	if (currentSwatch.hasOwnProperty('space') && currentSwatch.space == ColorSpace.LAB){
		var val = currentSwatch.colorValue;
		result += i.toString() + ';' + currentSwatch.name + ';' + val[0] + ';' + val[1] + ';' + val[2] + '\r\n';
	}
}
result = 'N:o;Name;Lightness;A;B' + '\r\n' + result;
var outPath = 'C:/temp/test/out.txt';  // Put an existing path here
alert(writeToFile (result, outPath));

function writeToFile(fileContents, destinationFilePath){
	var myFileOut = new File(destinationFilePath);
	myFileOut.open('w');
	// myFileOut.encoding = 'UTF-8';
	myFileOut.write(fileContents);
	myFileOut.close();
	return new File(destinationFilePath).fsName;
}

 

 

 

 

TOPICS
Scripting

Views

1.8K

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 ,
Nov 10, 2021 Nov 10, 2021

Copy link to clipboard

Copied

Good Day Everyone, 

 

I am a new Adobe Photoshop and InDesign user and am looking for some help or direction. I need to import a color library using the color name and L a b values for a set of colors into my  inDesign Swatch Library. Does anyone know of an available script to do this? I saw a post from Mark that had the formatted spreadsheet to do this and it had the MacOS script but not the PC javascript. The requestor was using a Mac. If anyone could point me in the right direction or suggest a script to do this on my PC it would be greatly appreciated. My data is in the following format in excel.  

 

Thank you! 

 

NAMEL*a*b*
SWATCH 150.00-30.0020.00
SWATCH 253.00-32.0021.00
SWATCH 356.00-34.0022.00
SWATCH 459.00-36.0023.00

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 ,
Nov 10, 2021 Nov 10, 2021

Copy link to clipboard

Copied

Hi @ColorDyeingMan2021 Save your csv named LabColors.csv to the desktop, and try this:

 

var path = File(Folder.desktop + "/LabColors.csv");
var cTable = readFile(path);
//split the table into an array of rows
var r = cTable.split("\n");

var doc = app.activeDocument;
var c, ns;

for (var i = 1; i < r.length-1; i++){
    //split the row into an array of cells
    c = r[i].split(",");
    ns = makeSwatch(doc, c[0]); 
    ns.model = ColorModel.PROCESS;
    ns.space = ColorSpace.LAB;
    ns.colorValue = [Number(c[1]),Number(c[2]),Number(c[3])]
};   


/**
* Read a text file 
* @param the file’s path 
* @return the file’s contents 
* 
*/

function readFile(p) {
	var f = new File(p);
	f.open("r");  
	var x = f.read();  
	f.close();
	return x; 
}


/**
* Makes a new swatch 
* @param the document to add the swatch to 
* @param swatch name 
* @return the new or existingswatch 
* 
*/
function makeSwatch(d, n){
    var s;
    try {
        d.colors.add({name:n});
    }catch(e) {
        s = d.colors.itemByName(n);
    } 
    return d.colors.itemByName(n);
}

 

Also, if the color channels are evenly incremented you wouldn’t need to load a spreadsheet—you should be able to increment the values in a loop

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 ,
Nov 10, 2021 Nov 10, 2021

Copy link to clipboard

Copied

Hi rob day, 

 

Thank you so much. I am not a programmer but was able to get the jsx file created (after a couple of tries and an error) and added as a script in InDesign and to try on the stored csv. Success!!! The colors and data values look great. I really appreciate this. One more question. If I wanted to store the swatches to a specific swatch library can /could I do that using this script? Or is this something I would do post importing? I want to be able to save a color library and share as an ASE file eventually.  I will look for more details on managing libraries and see if I can figure that out.

 

Again, thank you.This is gonna save me hours of time.  

 

ColorDyeingMan2021_1-1636572951925.png

 

 

 

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 ,
Nov 10, 2021 Nov 10, 2021

Copy link to clipboard

Copied

Unless something has changed with the new ID version, Libraries are not scriptable, and I don’t think there is a way to add an .ase file to a Library, but it’s easy to select the swaches and save an .ASE after you run the script.

 

You could make a matrix of rectangles filled with the Lab colors, and add that to the Library as a Graphic. If the user dragged the matrix graphic on the a document, the fill colors would be added to the Swatches panel, but an .ase seems simpler.

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 ,
Nov 10, 2021 Nov 10, 2021

Copy link to clipboard

Copied

Thank you for the advice. The graphic is an interesting idea.  

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 ,
Nov 10, 2021 Nov 10, 2021

Copy link to clipboard

Copied

This version creates a group of rectangles in the upper left corner of page 1, with the new Lab swatches as fills. If you drag the group into the CC Library, make a new document, and drag the library group on to the new doc the swatches should get added:

 

 

 

var path = File(Folder.desktop + "/LabColors.csv");
var cTable = readFile(path);
//split the table into an array of rows
var r = cTable.split("\n");

var doc = app.activeDocument;
app.scriptPreferences.measurementUnit = MeasurementUnits.INCHES
var sArray = []
var c, ns, sr;

for (var i = 1; i < r.length; i++){
    //split the row into an array of cells
    c = r[i].split(",");
    try {
       ns = makeSwatch(doc, c[0]); 
       ns.model = ColorModel.PROCESS;
       ns.space = ColorSpace.LAB;
       ns.colorValue = [Number(c[1]),Number(c[2]),Number(c[3])]
    }catch(e) {}  

    sr = doc.pages[0].rectangles.add({geometricBounds:[0, 0, 2, 2], fillColor:ns.name});
    sArray.push(sr)
};   

//makes a group of rectangles with the new swatch fills
var sGroup = doc.pages[0].groups.add(sArray);
sGroup.name = "LabSwatches"


/**
* Read a text file 
*  the file’s path 
*  the file’s contents 
* 
*/

function readFile(p) {
	var f = new File(p);
	f.open("r");  
	var x = f.read();  
	f.close();
	return x; 
}


/**
* Makes a new swatch 
*  the document to add the swatch to 
*  swatch name 
*  the new or existingswatch 
* 
*/
function makeSwatch(d, n){
    var s;
    try {
        d.colors.add({name:n});
    }catch(e) {
        s = d.colors.itemByName(n);
    } 
    return d.colors.itemByName(n);
}

 

 

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
Enthusiast ,
Nov 10, 2021 Nov 10, 2021

Copy link to clipboard

Copied

Hi,
creating ase files via script is possible

app.saveSwatches()
https://www.indesignjs.de/extendscriptAPI/indesign-latest/#Application.html#d1e42253__d1e48249

But CC libraries not, true. The old-style library files on the other hand would be...

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 ,
Nov 11, 2021 Nov 11, 2021

Copy link to clipboard

Copied

Thanks Jens, I was assuming @ColorDyeingMan2021 was looking for a way to distribute .ase files via a CCLibraries invite, but I don’t see a way to add .ase files to a CC or regular Library via scripting or the UI.

 

Another option might be to save the .ase files to a folder inside of the local Creative Cloud Files folder and share the ase folder with a group of users. In that case the .ase files would sync to the group’s computers as they are created.

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 ,
Nov 08, 2022 Nov 08, 2022

Copy link to clipboard

Copied

I need to get CMYK Swatch values into an Excel Spreadsheet. 5 Columns, Swatch Name, C, M, Y, K.
Does anybody have an Apple Script to do this? Or any other recommendations?

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
Enthusiast ,
Nov 08, 2022 Nov 08, 2022

Copy link to clipboard

Copied

My LAB version above script can easily be changed into any color space. Here is one for CMYK. Just change the local result path, and import the resulting csv file into Excel, after running the script.

You can use Javascript which is used for platform independent scripting in InDesign.

 

// My LAB version script can easily be changed into any color space. CMYK.
var result = '';
for (var i = 0; i <= app.swatches.length-1; i++){	
	var currentSwatch = app.swatches[i];
	if (currentSwatch.hasOwnProperty('space') && currentSwatch.space == ColorSpace.CMYK){
		var val = currentSwatch.colorValue;
		result += i.toString() + ';' + currentSwatch.name + ';' + val[0] + ';' + val[1] + ';' + val[2] + ';' + val[3] +  '\r\n';
	}
}
result = 'N:o;Name;C;M;Y;K' + '\r\n' + result;
// var outPath = 'C:/temp/test/out.txt';  // Put an existing path here
var outPath = app.activeDocument.filePath.parent + '/' + 'out.txt';
var resultFilePath = writeToFile (result, outPath);
alert('File path: ' + resultFilePath);

function writeToFile(fileContents, destinationFilePath){
	var myFileOut = new File(destinationFilePath);
	myFileOut.open('w');
	// myFileOut.encoding = 'UTF-8';
	myFileOut.write(fileContents);
	myFileOut.close();
	return new File(destinationFilePath).fsName;
}

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 ,
Nov 08, 2022 Nov 08, 2022

Copy link to clipboard

Copied

I should have mentioned that I'm on a Mac. Looks like this might be geared towards Windows, based on the C:/temp path. Is that correct? I appreciate the help!

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
Enthusiast ,
Nov 09, 2022 Nov 09, 2022

Copy link to clipboard

Copied

I guess you have never used a script in InDesign, right?

Open the scrits panel (Windows / Utilities / Scripts). In the foldout menu of that panel, select to locate the scripts panel path in Finder. Create a text file, paste my code into it, save the files with the ending .jsx and, in that folder that opened up in Finder. Now the scripts panel will show the name of the script in Indesign.

 

Open a document with CMYK swatches in it, and double click the script in the Scripts panel (in InDesign).

 

As I wrote before, you would have had to change my path to one that was valid on your computer.

But now I made an update to the script above, so that the script saves the file to the folder of the current InDesign document instead. Just make sure that the document is saved, so that it has a path.

app.activeDocument.filePath.parent + '/' + 'out.txt'

 

I repeat: Javascript is platform independent, meaning that you can use javascript as well as applescript for Indesign scripting on Mac.

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
Enthusiast ,
Feb 07, 2023 Feb 07, 2023

Copy link to clipboard

Copied

Hi Andreas,

 

Thanks for the script. I need to tell you that, in v18.1 x64 on Windows, I had to modify your script by adding the "activeDocument" everywhere otherwise it would result "nothing". Here is the modified script that is working for me :

var result = '';
var Roger = app.activeDocument.swatches.length;

for (var i = 0; i <= app.activeDocument.swatches.length-1; i++){	
	var currentSwatch = app.activeDocument.swatches[i];
	if (currentSwatch.hasOwnProperty('space') && currentSwatch.space == ColorSpace.LAB){
		var val = currentSwatch.colorValue;
		result += i.toString() + ';' + currentSwatch.name + ';' + val[0] + ';' + val[1] + ';' + val[2] + '\r\n';
	}
}
result = 'N:o;Name;Lightness;A;B' + '\r\n' + result;
var outPath = 'C:/temp/test/out.txt';  // Put an existing path here
alert(writeToFile (result, outPath));

function writeToFile(fileContents, destinationFilePath){
	var myFileOut = new File(destinationFilePath);
	myFileOut.open('w');
	// myFileOut.encoding = 'UTF-8';
	myFileOut.write(fileContents);
	myFileOut.close();
	return new File(destinationFilePath).fsName;
}

It took me a while to figure the problem. Had to download and install VScode and Adobe's ExtendScript Plug-in (v2.0.3). Overall , very frustrating beccause there is no documentation around.

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
Enthusiast ,
Mar 14, 2024 Mar 14, 2024

Copy link to clipboard

Copied

Update: March 14 2024

I tried running the script from VScode, using Adobe ExtendScrip Plug-in installed.

The script returned nothing when ran against the current Adobe Illustrator document? Seems the the 

currentSwatch.space

property does not exist in Illustrator?

But the scrupt will run fine against an Adobe InDesign open document since InDesign natively "honors" CIE Lab color model as far as swatch names are concerned.

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 ,
Mar 14, 2024 Mar 14, 2024

Copy link to clipboard

Copied


@Roger Breton wrote:

Update: March 14 2024

I tried running the script from VScode, using Adobe ExtendScrip Plug-in installed.

The script returned nothing when ran against the current Adobe Illustrator document? Seems the the 

currentSwatch.space

property does not exist in Illustrator?

But the scrupt will run fine against an Adobe InDesign open document since InDesign natively "honors" CIE Lab color model as far as swatch names are concerned.


 

activeDocument - doesn't have swatches collecton - only document have - in Illustrator.

 

I'm not JS guy, but this should work:

var result = '';
var Roger = app.activeDocument;

for (var i = 0; i <= Roger.swatches.length-1; i++){	
	var currentSwatch = Roger.swatches[i];
...
▒► ID-Tasker / ID-Tasker Server - work smart not hard ◄▒

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 ,
Mar 14, 2024 Mar 14, 2024

Copy link to clipboard

Copied

But the rest won't...

 

In Illustrator, swatch have those properties - screenshot is from VB:

RobertTkaczyk_0-1710441350043.png

 

then Color can be LabColor:

RobertTkaczyk_1-1710441378657.png

 

So you first need to check if currentSwatch is LabColor type - then refer to it's 3x values:

 

result += i.toString() + ';' + currentSwatch.name + ';' + currentSwatch.color.l + ';' + currentSwatch.color.a + ';' + currentSwatch.color.b + '\r\n';

 

Not sure if in JS it will be l, a, b or L, A, B.

 

▒► ID-Tasker / ID-Tasker Server - work smart not hard ◄▒

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
Enthusiast ,
Mar 14, 2024 Mar 14, 2024

Copy link to clipboard

Copied

Thank you very much, Robert.

In case you're interested, I painted a bunch of Liquitex Acrylic paint onto some canvas and proceeded to measure each one using an X-Rite SP64 sphere spectrophotometer (I could have used an i1pro or some other but I happen to also have an SP64 in good order) into CIE Lab D50/2. You see, once I have all the measurements, my question becomes "Where do I enter these values in my computer?". Ultimately, I want the freedom of using those Lab values anywhere, such as in Excel or, ideally, Matlab, so that I can plot them in 3D for my students to see and compare against the sRGB gamot (or some other), and find the closest PANTONE Coated V4 swatch and Munsell notations. But, as you can see, I am trying to avoid having to retype these 42 triplets: only want to enter them once and use "many". InDesign or Illustrator are good places since then I can give the ASE to my students for them to use in their asignments.

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 ,
Mar 15, 2024 Mar 15, 2024

Copy link to clipboard

Copied

But, as you can see, I am trying to avoid having to retype these 42 triplets: only want to enter them once and use "many"

 

Sounds like you want to create swatches from a list or spreadsheet of Lab values?

 

@Andreas Jansson ’s script is exporting InDesign Swatch values to a text file. My InDesign example script above from Nov 2021 does the opposite—reads a CSV file and creates swatches from the provided values. The CSV named LabColors.csv is on the desktop, and has 4 columns for the color name and its Lab values.

 

Screen Shot 14.png

 

Screen Shot 16.png

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
Enthusiast ,
Mar 15, 2024 Mar 15, 2024

Copy link to clipboard

Copied

Rob, can you share your "Import CSV to InDesign swatches" script?

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 ,
Mar 15, 2024 Mar 15, 2024

Copy link to clipboard

Copied

var path = File(Folder.desktop + "/LabColors.csv");
var cTable = readFile(path);
//split the table into an array of rows
var r = cTable.split("\n");

var doc = app.activeDocument;
app.scriptPreferences.measurementUnit = MeasurementUnits.INCHES
var sArray = []
var c, ns, sr;

for (var i = 1; i < r.length; i++){
    //split the row into an array of cells
    c = r[i].split(",");
    try {
       ns = makeSwatch(doc, c[0]); 
       ns.model = ColorModel.PROCESS;
       ns.space = ColorSpace.LAB;
       ns.colorValue = [Number(c[1]),Number(c[2]),Number(c[3])]
    }catch(e) {}  

    sr = doc.pages[0].rectangles.add({geometricBounds:[0, 0, 2, 2], fillColor:ns.name});
    sArray.push(sr)
};   

//makes a group of rectangles with the new swatch fills
var sGroup = doc.pages[0].groups.add(sArray);
sGroup.name = "LabSwatches"


/**
* Read a text file 
*  the file’s path 
*  the file’s contents 
* 
*/

function readFile(p) {
	var f = new File(p);
	f.open("r");  
	var x = f.read();  
	f.close();
	return x; 
}


/**
* Makes a new swatch 
*  the document to add the swatch to 
*  swatch name 
*  the new or existingswatch 
* 
*/
function makeSwatch(d, n){
    var s;
    try {
        d.colors.add({name:n});
    }catch(e) {
        s = d.colors.itemByName(n);
    } 
    return d.colors.itemByName(n);
}

 

The example .csv is attached

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
Enthusiast ,
Mar 15, 2024 Mar 15, 2024

Copy link to clipboard

Copied

Works perfect 🙂 
THANK YOU!

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 ,
Mar 14, 2024 Mar 14, 2024

Copy link to clipboard

Copied

Overall , very frustrating beccause there is no documentation around.

 

Hi @Roger Breton , Illustrator and InDesign do not share the same scripting API, so the script above would not work with Illustrator.

 

When running from VS Code you have to set a launch.json file for the script’s parent folderto specify which application you are targeting when you run the script from VSCode. The documentation for setting up a launch.json file for a folder of scripts can be found her:

 

https://blog.developer.adobe.com/extendscript-debugger-for-visual-studio-code-public-release-a2ff616...

 

The complete object API documentation for InDesign can be found here:

 

https://www.indesignjs.de/extendscriptAPI/indesign-latest/#about.html

 

Illustrator‘s is here:

https://www.indesignjs.de/extendscriptAPI/illustrator-latest/#Application.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
Enthusiast ,
Mar 14, 2024 Mar 14, 2024

Copy link to clipboard

Copied

Thanks Rob for your relevant suggestion. I don't have enough script developement, these days, to set the launch.json file. When I hit the "Run & Debug" icon, VScode prompts me accordingly everytime. It's annoying but it works 🙂
Any reason, in your opinion, why the online document should reside on a German page?

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 ,
Mar 14, 2024 Mar 14, 2024

Copy link to clipboard

Copied

All 3 links are loading in english for me.

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