Help with writing a script to select hidden/not visible layers
Hiya! I'm trying to automate a process that I do everytime I open a new psd with hundreds of layers. I want to select all the hidden layers and then apply a red color label to them.

I know you can do this through modifying the search functions at the top of the layer panel.

I've tried using Script Listener to create a log of my process, but that resulted in just recording a select all layers and then turning everything red. It seems that filtering on Layer Panel can't be recorded?
var idselectAllLayers = stringIDToTypeID( "selectAllLayers" );
var desc397 = new ActionDescriptor();
var idnull = stringIDToTypeID( "null" );
var ref57 = new ActionReference();
var idlayer = stringIDToTypeID( "layer" );
var idordinal = stringIDToTypeID( "ordinal" );
var idtargetEnum = stringIDToTypeID( "targetEnum" );
ref57.putEnumerated( idlayer, idordinal, idtargetEnum );
desc397.putReference( idnull, ref57 );
executeAction( idselectAllLayers, desc397, DialogModes.NO );
var idset = stringIDToTypeID( "set" );
var desc399 = new ActionDescriptor();
var idnull = stringIDToTypeID( "null" );
var ref58 = new ActionReference();
var idlayer = stringIDToTypeID( "layer" );
var idordinal = stringIDToTypeID( "ordinal" );
var idtargetEnum = stringIDToTypeID( "targetEnum" );
ref58.putEnumerated( idlayer, idordinal, idtargetEnum );
desc399.putReference( idnull, ref58 );
var idto = stringIDToTypeID( "to" );
var desc400 = new ActionDescriptor();
var idcolor = stringIDToTypeID( "color" );
var idcolor = stringIDToTypeID( "color" );
var idred = stringIDToTypeID( "red" );
desc400.putEnumerated( idcolor, idcolor, idred );
var idlayer = stringIDToTypeID( "layer" );
desc399.putObject( idto, idlayer, desc400 );
executeAction( idset, desc399, DialogModes.NO );
I've also been trying to modify existing code, but that results in turning all my layers red. I appreciate any guidance or insight anyone has on this 🙂
<javascriptresource>
<name>Remove Unused Layers</name>
<category>Delete</category>
</javascriptresource>
#target photoshop
// Define selectLayerByIndex function
function selectLayerByIndex(index, add) {
add = (add == undefined) ? add = false : add;
var ref = new ActionReference();
ref.putIndex(charIDToTypeID("Lyr "), index);
var desc = new ActionDescriptor();
desc.putReference(charIDToTypeID("null"), ref);
if (add) desc.putEnumerated(stringIDToTypeID("selectionModifier"), stringIDToTypeID("selectionModifierType"), stringIDToTypeID("addToSelection"));
desc.putBoolean(charIDToTypeID("MkVs"), false);
try {
executeAction(charIDToTypeID("slct"), desc, DialogModes.NO);
} catch (e) {}
}
// Define getSelectedLayersIdx function
function getSelectedLayersIdx(){
var selectedLayers = new Array;
var ref = new ActionReference();
ref.putEnumerated( charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
var desc = executeActionGet(ref);
if( desc.hasKey( stringIDToTypeID( 'targetLayers' ) ) ){
desc = desc.getList( stringIDToTypeID( 'targetLayers' ));
var c = desc.count
var selectedLayers = new Array();
for(var i=0;i<c;i++){
try{
activeDocument.backgroundLayer;
selectedLayers.push( desc.getReference( i ).getIndex() );
}catch(e){
selectedLayers.push( desc.getReference( i ).getIndex()+1 );
}
}
}else{
var ref = new ActionReference();
ref.putProperty( charIDToTypeID("Prpr") , charIDToTypeID( "ItmI" ));
ref.putEnumerated( charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
try{
activeDocument.backgroundLayer;
selectedLayers.push( executeActionGet(ref).getInteger(charIDToTypeID( "ItmI" ))-1);
}catch(e){
selectedLayers.push( executeActionGet(ref).getInteger(charIDToTypeID( "ItmI" )));
}
}
return selectedLayers;
}
// Define isClippingLayer function
function isClippingLayer(layerID){
var clipInfo=false;
var ref = new ActionReference();
ref.putIndex(charIDToTypeID("Lyr "), layerID);
try{
var desc = executeActionGet(ref);
} catch(e) {
// Not a valid layer
return clipInfo;
}
var group = desc.getBoolean(stringIDToTypeID('group'));
if(group) clipInfo = 'topClippingLayer';
try{
var ref = new ActionReference();
ref.putIndex(charIDToTypeID('Lyr '), layerID+1);
desc = executeActionGet(ref);
}catch(e){
//alert("Top layer!");
return clipInfo;
}
group = desc.getBoolean(stringIDToTypeID('group'));
if(group && clipInfo == 'topClippingLayer' ) clipInfo = 'middleClippingLayer';
if(group && clipInfo == false ) clipInfo = 'bottomClippingLayer';
return clipInfo;
}
// Define deselectLayers function
function deselectLayers() {
var desc01 = new ActionDescriptor();
var ref01 = new ActionReference();
ref01.putEnumerated( charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt') );
desc01.putReference( charIDToTypeID('null'), ref01 );
executeAction( stringIDToTypeID('selectNoLayers'), desc01, DialogModes.NO );
}
// Define selectAllLayers function
function selectAllLayers() {
var desc29 = new ActionDescriptor();
var ref23 = new ActionReference();
ref23.putEnumerated(charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt'));
desc29.putReference(charIDToTypeID('null'), ref23);
executeAction(stringIDToTypeID('selectAllLayers'), desc29, DialogModes.NO);
}
// Define main function
function main(){
app.displayDialogs = DialogModes.NO;
var layercomps = false;
if(!documents.length) return;
var doc = app.activeDocument;
if(!doc.saved){
if(!confirm("Your document is not saved. \nAre you sure you want to continue?")){
return;
}
}
// Remove all invisible layers
// Collect all layers and save the layer ID and Keep flag
selectAllLayers();
var layersSelected = getSelectedLayersIdx();
var layerIDs = [];
for(var d = 0; d < layersSelected.length; d++){
layerIDs.push([layersSelected[d], "N"]);
}
deselectLayers();
// We need to make sure clipping layers are selected too
var clippingLayerIDs = [];
for(var l in layerIDs) {
if(layerIDs[l][1].toString() == "N") {
var LID = Number(layerIDs[l][0]); // Layer ID
var clipInfo = isClippingLayer( LID );
if(clipInfo == 'bottomClippingLayer'){
LID++; // Move on to the layers in question
while ( isClippingLayer(LID) ) {
clipInfo = isClippingLayer( LID );
// Make sure we are not moving into the next clipping group!
if(clipInfo != 'bottomClippingLayer'){
clippingLayerIDs.push([LID, "N"]);
LID++;
} else {
break; // while loop
}
}
}
}
}
layerIDs = layerIDs.concat(clippingLayerIDs);
// Select all layers to be deleted
deselectLayers();
var layersSelected = false;
for(var l in layerIDs) {
if(layerIDs[l][1].toString() == "N") {
selectLayerByIndex(Number(layerIDs[l][0]), true);
layersSelected = true;
}
}
// Apply red layer color label to selected layers
if(layersSelected) {
setLayerLabelCol("red");
}
alert("Done applying red layer color label to hidden layers!");
}
// Define isLocked function
function isLocked(myLayer){
selectLayerByIndex(myLayer);
if(activeDocument.activeLayer.allLocked || activeDocument.activeLayer.pixelsLocked || activeDocument.activeLayer.positionLocked || activeDocument.activeLayer.transparentPixelsLocked){
return true;
}
return false;
}
// Define setLayerLabelCol function
function setLayerLabelCol(labelCol) {
var c2t = function (s) {
return app.charIDToTypeID(s);
};
var s2t = function (s) {
return app.stringIDToTypeID(s);
};
var descriptor = new ActionDescriptor();
var descriptor2 = new ActionDescriptor();
var reference = new ActionReference();
reference.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
descriptor.putReference(c2t("null"), reference);
descriptor2.putEnumerated(s2t("color"), s2t("color"), s2t(labelCol));
descriptor.putObject(s2t("to"), s2t("layer"), descriptor2);
executeAction(s2t("set"), descriptor, DialogModes.NO);
}
// Add other helper functions here...
try{
main();
} catch(err) {
alert(err);
}
