Skip to main content
johnjoeparrot
Known Participant
February 27, 2025
Answered

JSX - Find All - Active Layers

  • February 27, 2025
  • 2 replies
  • 363 views

Hello,

 

Is there a way to find all active layers with JSX?  The 'doc.activeLayer' function seems to target only the first activeLayer in the layer panel


Thanks


Correct answer sttk3

This is the code to get the information (JavaScript Object) of selected layers in Layer panel. id and index are there, so you may be able to refer to the ExtendScript Layer from it.

/**
  * @3653945.0.0
  * @7111211 sttk3.com
*/

/**
  * Get the ActionDescriptor of the selected layer of activeDocument
  * @Return {Array<any>} [
  *   {name: string, index: number, id: number, desc: ActionDescriptor}...
  * ]
*/
function getSelectedLayerDesc() {
  var res = [] ;

  var ref1 = new ActionReference() ;
  var idTargetLayers = stringIDToTypeID('targetLayers') ;
  ref1.putProperty(stringIDToTypeID('property'), idTargetLayers) ;
  ref1.putEnumerated(stringIDToTypeID('document'), stringIDToTypeID('ordinal'), stringIDToTypeID('targetEnum')) ;
  var targetLayers = executeActionGet(ref1).getList(idTargetLayers) ;

  // if there is a background layer, add 1 to index
  var backgroundFactor = 0 ;
  try {
    activeDocument.backgroundLayer ;
  } catch(e) {
    backgroundFactor = 1 ;
  }

  var ref2, tempIndex, desc, layerItem ;
  for(var i = 0, len = targetLayers.count ; i < len ; i++) {
    ref2 = new ActionReference() ;
    tempIndex = targetLayers.getReference(i).getIndex() + backgroundFactor ;
    ref2.putIndex(stringIDToTypeID('layer'), tempIndex) ;
    desc = executeActionGet(ref2) ;

    layerItem = {
      name: desc.getString(stringIDToTypeID('name')), 
      index: tempIndex, 
      id: desc.getInteger(stringIDToTypeID('layerID')), 
      desc: desc
    } ;
    res.push(layerItem) ;
  }

  return res ;
}

2 replies

Stephen Marsh
Community Expert
Community Expert
February 27, 2025
sttk3Correct answer
Legend
February 27, 2025

This is the code to get the information (JavaScript Object) of selected layers in Layer panel. id and index are there, so you may be able to refer to the ExtendScript Layer from it.

/**
  * @3653945.0.0
  * @7111211 sttk3.com
*/

/**
  * Get the ActionDescriptor of the selected layer of activeDocument
  * @Return {Array<any>} [
  *   {name: string, index: number, id: number, desc: ActionDescriptor}...
  * ]
*/
function getSelectedLayerDesc() {
  var res = [] ;

  var ref1 = new ActionReference() ;
  var idTargetLayers = stringIDToTypeID('targetLayers') ;
  ref1.putProperty(stringIDToTypeID('property'), idTargetLayers) ;
  ref1.putEnumerated(stringIDToTypeID('document'), stringIDToTypeID('ordinal'), stringIDToTypeID('targetEnum')) ;
  var targetLayers = executeActionGet(ref1).getList(idTargetLayers) ;

  // if there is a background layer, add 1 to index
  var backgroundFactor = 0 ;
  try {
    activeDocument.backgroundLayer ;
  } catch(e) {
    backgroundFactor = 1 ;
  }

  var ref2, tempIndex, desc, layerItem ;
  for(var i = 0, len = targetLayers.count ; i < len ; i++) {
    ref2 = new ActionReference() ;
    tempIndex = targetLayers.getReference(i).getIndex() + backgroundFactor ;
    ref2.putIndex(stringIDToTypeID('layer'), tempIndex) ;
    desc = executeActionGet(ref2) ;

    layerItem = {
      name: desc.getString(stringIDToTypeID('name')), 
      index: tempIndex, 
      id: desc.getInteger(stringIDToTypeID('layerID')), 
      desc: desc
    } ;
    res.push(layerItem) ;
  }

  return res ;
}
johnjoeparrot
Known Participant
February 27, 2025

This is perfect, thanks for your time!