Skip to main content
Known Participant
February 1, 2023
Question

PS Script – creating groups and subgroups based on layer names

  • February 1, 2023
  • 6 replies
  • 2717 views

Hey, I have a script that creates groups and subgroups based on layer names and moves them to the appropriate places. Below is a description of how it works:

 

1. Creates groups based on layer names. The group name is to consist of the layer name up to the first character "_".

2. Creates subgroups in these groups based on the layer names up to the second "_" character

3. Moves all the layers corresponding to the subgroup name to this subgroup

4. Creates an exception for layers with a string in the name "Texture”, “mask” or “Shadow”. Create a group named like this string and move these layers to it.

 

Everything works fine, but I don't know why the script skips a large part of the layers, even though they meet the criteria. I marked the problem on the screen. Could someone suggest how to fix it?

 

 

#target photoshop;

var doc = app.activeDocument;
var layers = doc.layers;
var groups = {};

for (var i = 0; i < layers.length; i++) {
  var layer = layers[i];
  var layerName = layer.name;

  if (layerName.indexOf("Texture") !== -1) {
    if (!groups["Texture"]) {
      groups["Texture"] = doc.layerSets.add();
      groups["Texture"].name = "Texture";
    }
    layer.move(groups["Texture"], ElementPlacement.INSIDE);
    continue;
  } else if (layerName.indexOf("mask") !== -1) {
    if (!groups["mask"]) {
      groups["mask"] = doc.layerSets.add();
      groups["mask"].name = "mask";
    }
    layer.move(groups["mask"], ElementPlacement.INSIDE);
    continue;
  } else if (layerName.indexOf("Shadow") !== -1) {
    if (!groups["Shadow"]) {
      groups["Shadow"] = doc.layerSets.add();
      groups["Shadow"].name = "Shadow";
    }
    layer.move(groups["Shadow"], ElementPlacement.INSIDE);
    continue;
  }

  var firstUnderscoreIndex = layerName.indexOf("_");
  var groupName = layerName.substring(0, firstUnderscoreIndex);
  var secondUnderscoreIndex = layerName.indexOf("_", firstUnderscoreIndex + 1);
  var subgroupName;
  
  if (secondUnderscoreIndex === -1) {
    subgroupName = groupName;
  } else {
    subgroupName = layerName.substring(0, secondUnderscoreIndex);
  }

  if (!groups[groupName]) {
    groups[groupName] = doc.layerSets.add();
    groups[groupName].name = groupName;
  }

  if (!groups[subgroupName]) {
    groups[subgroupName] = groups[groupName].layerSets.add();
    groups[subgroupName].name = subgroupName;
  }

  layer.move(groups[subgroupName], ElementPlacement.INSIDE);
}

 

 

This topic has been closed for replies.

6 replies

New Participant
August 17, 2023

lets see.

New Participant
August 17, 2023

This is a scripting related topic, not general use.


yes you are right.

Stephen Marsh
Community Expert
August 12, 2023

@outdoorfurniture 

 

This is a scripting related topic.

Stephen Marsh
Community Expert
August 12, 2023

This is a scripting related topic, not general use.

brian_p_dts
Community Expert
August 4, 2023

You should iterate backward through the layers (var i = doc.layers.length ... while(i--) ...) because when you create layersets you are creating new layers in the doc and thus your iterator is getting all messed up. That's why sections are skipped. 

KHKHAuthor
Known Participant
August 10, 2023

 

 

for (var i = doc.layers.length; i--)

 

 I changed this piece of code but I don't think it was because it doesn't work Could you tell me how to change this code exactly, because I probably misunderstood 😞

brian_p_dts
Community Expert
August 10, 2023

Just realized how old this post is, but glad you still need help. Think this should work, but you could $.writeln the current layer name to make sure you're hitting everything 

#target photoshop;

var doc = app.activeDocument;
var layers = doc.layers;
var i = layers.length;
var groups = {};

for (i; i >= 0; i--) {
  var layer = layers[i];
  var layerName = layer.name;

  if (layerName.indexOf("Texture") !== -1) {
    if (!groups["Texture"]) {
      groups["Texture"] = doc.layerSets.add();
      groups["Texture"].name = "Texture";
    }
    layer.move(groups["Texture"], ElementPlacement.INSIDE);
    continue;
  } else if (layerName.indexOf("mask") !== -1) {
    if (!groups["mask"]) {
      groups["mask"] = doc.layerSets.add();
      groups["mask"].name = "mask";
    }
    layer.move(groups["mask"], ElementPlacement.INSIDE);
    continue;
  } else if (layerName.indexOf("Shadow") !== -1) {
    if (!groups["Shadow"]) {
      groups["Shadow"] = doc.layerSets.add();
      groups["Shadow"].name = "Shadow";
    }
    layer.move(groups["Shadow"], ElementPlacement.INSIDE);
    continue;
  }

  var firstUnderscoreIndex = layerName.indexOf("_");
  var groupName = layerName.substring(0, firstUnderscoreIndex);
  var secondUnderscoreIndex = layerName.indexOf("_", firstUnderscoreIndex + 1);
  var subgroupName;
  
  if (secondUnderscoreIndex === -1) {
    subgroupName = groupName;
  } else {
    subgroupName = layerName.substring(0, secondUnderscoreIndex);
  }

  if (!groups[groupName]) {
    groups[groupName] = doc.layerSets.add();
    groups[groupName].name = groupName;
  }

  if (!groups[subgroupName]) {
    groups[subgroupName] = groups[groupName].layerSets.add();
    groups[subgroupName].name = subgroupName;
  }

  layer.move(groups[subgroupName], ElementPlacement.INSIDE);
}

 

Stephen Marsh
Community Expert
February 3, 2023

Can you post the file having issues?

 

You could resize it down to 1 pixel – it is all about the layers, not the pixel content.

KHKHAuthor
Known Participant
February 4, 2023

ok i added the psd file

c.pfaffenbichler
Community Expert
February 7, 2023

@KHKH wrote:

ok i added the psd file


There is no psd-file.