Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
get array of selected layers in photoshop via extendscript
var docRef = app.activeDocument;
cTID = function(s) { return app.charIDToTypeID(s); };
sTID = function(s) { return app.stringIDToTypeID(s); };
function newGroupFromLayers(doc) {
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putClass( sTID('layerSection') );
desc.putReference( cTID('null'), ref );
var lref = new ActionReference();
lref.putEnumerated( cTID('Lyr '), cTID('Ordn'), cTID('Trgt') );
desc.putReference( cTID('From'), lref);
executeAction( cTID('Mk '), desc, DialogModes.NO );
};
function undo() {
executeAction(cTID("undo", undefined, DialogModes.NO));
};
function getSelectedLayers(doc) {
var selLayers = [];
newGroupFromLayers();
var group = doc.activeLayer;
var layers = group.layers;
for (var i = 0; i < layers.length; i++) {
selLayers.push(layers[i]);
}
undo();
return selLayers;
};
var selectedLayers = getSelectedLayers(app.activeDocument);
for( i = 0; i < selectedLayers.length; i++) {
selectedLayers[i].selected = true;
docRef.activeLayer = selectedLayers[i];
alert(docRef.activeLayer.name)
}
@mattbruv

This comment has been minimized.

Copy link

@mattbruv mattbruv commented Aug 29, 2018

Thanks for this. It's pretty ridiculous that Adobe didn't provide a simple function that would do this considering how important this kind of thing is for scripting

@Kailang

This comment has been minimized.

Copy link

@Kailang Kailang commented Sep 1, 2019

Thanks! I wrote an exporter based on your script!
https://gist.github.com/Kailang/cef096bea6f63646569fd81c2d1b2fe8

@samavan

This comment has been minimized.

Copy link

@samavan samavan commented Dec 11, 2019

Also Ridiculous that is the only decent solution to get selected groups name.
Indeed browsed photoshop PDFs and found nothing for it.
1000 thanks for it! :)

@catsmu

This comment has been minimized.

Copy link

@catsmu catsmu commented Mar 6, 2020

Thanks very much for the solution - worked perfectly!

Regarding the comments about this not being supported via the API - at a purely practical level I agree, and it's annoying that you have to resort to a mixture of grouping trickery and Script Listener output to make this work. One should be able to perform this sort of operation without modifying the state of the underlying document (even temporarily) - it's just a query.

Speculatively: it's implemented this way because the PS API reflects how Photoshop internally thinks about the document. You can't edit more than one active ArtLayer at the same time, so the concept of "selected layers" doesn't really make sense to the underlying system - which the API ostensibly exposes.

Not sure if Adobe provides a script interface to the PS UI, which (if my guess above is correct-ish) would be the place to find / implement this kind of functionality.

@schroef

This comment has been minimized.

Copy link

@schroef schroef commented Mar 24, 2020

Why grouping the layers and then regrouping, doesn't that slow down the script?

@schroef

This comment has been minimized.

Copy link

@schroef schroef commented Mar 24, 2020

One thing, the script's name isnt correct I believe. SInce this groups layers, why not name accordingly.
PS why is that undo() in that loop?

@peterceluch

This comment has been minimized.

Copy link

@peterceluch peterceluch commented Jul 24, 2020

Thank you for sharing this with us!

I'm always intrigued by these mysterious charID / actionDescriptor / executeAction snippets. They always look so machine-generated to me. How do you come up with these seemingly random method parameters? Is there a way to somehow export this from Photoshop/actions?

Thanks,
Peter

@Picazsoo

This comment has been minimized.

Copy link

@Picazsoo Picazsoo commented Jan 7, 2021

Hi @peterceluch- I guess you already found this by now, but anyway - get xtools scripts here (http://ps-scripts.sourceforge.net/xtools.html).

These allow you to convert recorded actions into javascript. From there you can modify the code into useful functions with custom parameters and reuse at will.

Regards,
Jachym

@peterceluch

This comment has been minimized.

Copy link

@peterceluch peterceluch commented Jan 22, 2021

Thank you very much, @Picazsoo - I did not know about that!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment