Skip to main content
Known Participant
July 22, 2019
Answered

Create a loop to move layers into a specific layer set, depending of the name of the layer

  • July 22, 2019
  • 3 replies
  • 2300 views

Hello all,

I need to sort the layers into a layer set, in order to treat them with a second script.

Here is the main problematic :

Layers got differents names, such as "01", "01 copy", "10", "101535", "Text" ... I only need to move layers named with numbers from 1 to 30, and rename them from "01" to "1" (without the zero).

To resolve it, I did as follow :

  1. I managed to use a LEFT() and RIGHT() function to isolate the two first characters of the layer name (ex : 10 copy -> 10; 01 copy -> 01 then 01 -> 1 ...)
  2. I tried to write a loop with the following conditions : "for every layers of the active document, if the name of the layer is comprised between 1 and 30, move the layer to the layer Set "Puce". "

The loop is only half correct, because it move half of the layers (one in two).

I'm aware the method is a bit brutal, but I couldn't find the best way to write a conditionning rule without the "If" ...I'm a beginner in Javascript for PSD so I probably did a mistake in the loop too

Many thanks in advance to whomever's gonna help !

Here's the script :

  1. var doc = app.activeDocument;
  2. // Set the Left() function
  3. String.prototype.left = function(n) {
  4.     return this.substring(0, n);
  5. }
  6. // Set the Right() function
  7. String.prototype.right = function(n) {
  8.     return this.substring(1, n);
  9. }
  10. // Sort layers into "PUCES"
  11. // Create the Layer set "PUCES"
  12. var newLayerSet = doc.layerSets.add();
  13. newLayerSet.name = 'PUCES';
  14. //move the layers into the layerset "PUCES"         
  15. var j = 0
  16. for (var i =0; i+1<doc.artLayers.length; i++) 
  17. {
  18. //Management of the active Layer Name
  19. var dotLayer = doc.artLayers[1]
  20. var dotLayerName = dotLayer.name
  21. var dotLayerNameShort = dotLayerName.left(2);
  22. //remove the 0 from the prime numbers (right fonction)
  23. if(dotLayerNameShort < 10){
  24. var dotLayerNameShort = dotLayerName.right(2);
  25. }
  26. j++
  27. // Check if the layer is a dot
  28. if(dotLayerNameShort === '1'){
  29. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  30. } else {
  31. if(dotLayerNameShort === '2'){
  32. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  33. } else {
  34. if(dotLayerNameShort === "3"){
  35. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  36. } else {
  37. if(dotLayerNameShort === "4"){
  38. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  39. } else {
  40. if(dotLayerNameShort === "5"){
  41. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  42. } else {
  43. if(dotLayerNameShort === "6"){
  44. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  45. } else {
  46. if(dotLayerNameShort === "7"){
  47. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  48. } else {
  49. if(dotLayerNameShort === "8"){
  50. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  51. } else {
  52. if(dotLayerNameShort === '9'){
  53. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  54. } else {
  55. if(dotLayerNameShort === "10"){
  56. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  57. } else {
  58. if(dotLayerNameShort === "11"){
  59. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  60. } else {
  61. if(dotLayerNameShort === "12"){
  62. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  63. } else {
  64. if(dotLayerNameShort === "13"){
  65. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  66. } else {
  67. if(dotLayerNameShort === "14"){
  68. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  69. } else {
  70. if(dotLayerNameShort === "15"){
  71. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  72. } else {
  73. if(dotLayerNameShort === "16"){
  74. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  75. } else {
  76. if(dotLayerNameShort === "17"){
  77. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  78. } else {
  79. if(dotLayerNameShort === "18"){
  80. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  81. } else {
  82. if(dotLayerNameShort === "19"){
  83. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  84. } else {
  85. if(dotLayerNameShort === "20"){
  86. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  87. } else {
  88. if(dotLayerNameShort === "21"){
  89. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  90. } else {
  91. if(dotLayerNameShort === "22"){
  92. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  93. } else {
  94. if(dotLayerNameShort === "23"){
  95. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  96. } else {
  97. if(dotLayerNameShort === "24"){
  98. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  99. } else {
  100. if(dotLayerNameShort === "25"){
  101. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  102. } else {
  103. if(dotLayerNameShort === "26"){
  104. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  105. } else {
  106. if(dotLayerNameShort === "27"){
  107. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  108. } else {
  109. if(dotLayerNameShort === "28"){
  110. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  111. } else {
  112. if(dotLayerNameShort === "29"){
  113. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  114. } else {
  115. if(dotLayerNameShort === "30"){
  116. dotLayer.move(newLayerSet, ElementPlacement.INSIDE);
  117. }
  118. }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
This topic has been closed for replies.
Correct answer r-bin

Very strange non-optimal script.
Why do you define the variable "j"?

To make it work, change this line.

for (var i =0; i+1<doc.artLayers.length; i++)

on this ones

var artLayers = new Array();

for (var i =0; i<doc.artLayers.length; i++) artLayers.push(doc.artLayers);

for (var i =0; i+1<artLayers.length; i++)

3 replies

Chuck Uebele
Community Expert
Community Expert
July 22, 2019

You can add an if statement to check if the layer is not a text layer:

if(doc.activeLayer.kind != LayerKind.TEXT){//code here

    }

Known Participant
July 23, 2019

Thank you, I struggled to find where to add it but it finaly worked

Chuck Uebele
Community Expert
Community Expert
July 22, 2019

Try this:

#target photoshop

var doc = activeDocument;

var newLayerSet = doc.layerSets.add();

var tempLayer = newLayerSet.artLayers.add();

var layA = new Array()

for (var i=0;i<doc.layers.length;i++){

    var layName = Number(doc.layers.name.replace(/\s/g, ""));

    if( !isNaN (layName) && layName<31){

        layA.push(doc.layers);

        }//end if

    }//end for loop

for(var i=0;i<layA.length;i++){

    layA.move(tempLayer, ElementPlacement.PLACEBEFORE);

    layA.name = Number(layA.name);

    }

tempLayer.remove();

r-binCorrect answer
Legend
July 22, 2019

Very strange non-optimal script.
Why do you define the variable "j"?

To make it work, change this line.

for (var i =0; i+1<doc.artLayers.length; i++)

on this ones

var artLayers = new Array();

for (var i =0; i<doc.artLayers.length; i++) artLayers.push(doc.artLayers);

for (var i =0; i+1<artLayers.length; i++)

Known Participant
July 22, 2019

My mistake ... the variable j was originally used for the line

var dotLayer = doc.artLayers;

And I know the code isn't optimal, I've start learning javascript last monday ... ^^