• Global community
• Language:
• Deutsch
• English
• EspaÃ±ol
• FranÃ§ais
• PortuguÃªs
• æ—¥æœ¬èªžã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£
Dedicated community for Japanese speakers
• í•œêµ­ ì»¤ë®¤ë‹ˆí‹°
Dedicated community for Korean speakers
Exit
• Script problem! Help me, please :(

# Script problem! Help me, please :(

New Here ,
Apr 16, 2024 Apr 16, 2024

Copied

The code below is working:

But currently it calculates based on the total area of the document, I need it to calculate only the area of the artboard where the layer is located, as I normally work with multiple artboards in a single document.

can anybody help me?

// Get the active layer
var layer = app.activeDocument.activeLayer;

// Gets the dimensions of the canvas/artboard
var artboardWidth = app.activeDocument.width.value;
var artboardHeight = app.activeDocument.height.value;

// Gets the layer dimensions
var layerWidth = layer.bounds[2].value - layer.bounds[0].value;
var layerHeight = layer.bounds[3].value - layer.bounds[1].value;

// Calculates the total area of the screen/artboard
var artboardArea = artboardWidth * artboardHeight;

// Calculate the layer area
var layerArea = layerWidth * layerHeight;

// Calculate the total percentage of the layer
var totalPercentage = (layerArea / artboardArea) * 100;

// Checks if the layer occupies more than 30% of the screen/artboard
if (totalPercentage >= 30) {
alert("The layer occupies **" + totalPercentage.toFixed(2) + "%** of the screen/artboard. Test passed!");
} else {
alert("The layer occupies **" + totalPercentage.toFixed(2) + "%** of the canvas/artboard. Increase the layer to pass the test!");
}

TOPICS
Actions and scripting , macOS , Windows

Views

176

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more

Community Expert , Apr 16, 2024 Apr 16, 2024

Try this script, as it uses ExtendScript Action Manager code to retrieve the artboard bounds, it may not work on all versions of Photoshop. I have tested in v2021 and v2024:

``````#target photoshop

try {

// Checks that the active layer is a group/artboard/frame
if (app.activeDocument.activeLayer.typename === "LayerSet") {

alert("Select a layer inside the artboard and run the script again...")

} else {

// Set the ruler units to px, don't assume that``````
...

8 Replies 8
Community Expert ,
Apr 16, 2024 Apr 16, 2024

Copied

Perhaps you can make use of the following ExtendScript + Action Manager code:

``````var originalRulerUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;

var theLayer = app.activeDocument.activeLayer;

app.activeDocument.activeLayer = app.activeDocument.activeLayer.parent;

///// Active Artboard Dimensions, by Rune L-H /////
var ref = new ActionReference();
ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
var artBoardRect = executeActionGet(ref).getObjectValue(stringIDToTypeID("artboard")).getObjectValue(stringIDToTypeID("artboardRect"));
var artBoardRectWidth = new UnitValue(artBoardRect.getDouble(stringIDToTypeID("right")) - artBoardRect.getDouble(stringIDToTypeID("left")), "px");
var artBoardRectHeight = new UnitValue(artBoardRect.getDouble(stringIDToTypeID("bottom")) - artBoardRect.getDouble(stringIDToTypeID("top")), "px");
/////

alert(artBoardRectWidth.value + " x " + artBoardRectHeight.value + " px");

app.activeDocument.activeLayer = theLayer;

app.preferences.rulerUnits = originalRulerUnits;``````

You need to have a layer within an artboard selected before running the script.

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
New Here ,
Apr 16, 2024 Apr 16, 2024

Copied

Hi, Stephen! Thanks for the quick response.

I'm a layman and I made this script with the help of Google Gemini...

How exactly do I apply what you said to my code?

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
Community Expert ,
Apr 16, 2024 Apr 16, 2024

Copied

Try this script, as it uses ExtendScript Action Manager code to retrieve the artboard bounds, it may not work on all versions of Photoshop. I have tested in v2021 and v2024:

``````#target photoshop

try {

// Checks that the active layer is a group/artboard/frame
if (app.activeDocument.activeLayer.typename === "LayerSet") {

alert("Select a layer inside the artboard and run the script again...")

} else {

// Set the ruler units to px, don't assume that they are set to px
var originalRulerUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;

// Set the original layer as a variable
var theLayer = app.activeDocument.activeLayer;

// Select the parent of the active layer, which is *assumed* to be an artboard
app.activeDocument.activeLayer = app.activeDocument.activeLayer.parent;

try {
// Active Artboard Dimensions, by Rune L-H
var ref = new ActionReference();
ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
var artBoardRect = executeActionGet(ref).getObjectValue(stringIDToTypeID("artboard")).getObjectValue(stringIDToTypeID("artboardRect"));
var artBoardRectWidth = new UnitValue(artBoardRect.getDouble(stringIDToTypeID("right")) - artBoardRect.getDouble(stringIDToTypeID("left")), "px");
var artBoardRectHeight = new UnitValue(artBoardRect.getDouble(stringIDToTypeID("bottom")) - artBoardRect.getDouble(stringIDToTypeID("top")), "px");
} catch (e) {
alert("The problem could be that the layer is inside of a group..." + "\r" + e + ' ' + e.line);
app.activeDocument.activeLayer = theLayer;
}

// Get the active layer
var layer = app.activeDocument.activeLayer;

// Gets the layer dimensions
var layerWidth = theLayer.bounds[2].value - theLayer.bounds[0].value;
var layerHeight = theLayer.bounds[3].value - theLayer.bounds[1].value;

// Calculates the total area of the screen/artboard
var artboardArea = artBoardRectWidth.value * artBoardRectHeight.value;

// Calculate the layer area
var layerArea = layerWidth * layerHeight;

// Calculate the total percentage of the layer
var totalPercentage = (layerArea / artboardArea) * 100;

// Checks if the layer occupies more than 30% of the screen/artboard
if (totalPercentage >= 30) {
alert("The layer occupies **" + totalPercentage.toFixed(2) + "%** of the screen/artboard. Test passed!");
} else {
alert("The layer occupies **" + totalPercentage.toFixed(2) + "%** of the canvas/artboard. Increase the layer to pass the test!");
}

app.activeDocument.activeLayer = theLayer;

// Return the original ruler units
app.preferences.rulerUnits = originalRulerUnits;
}

} catch (e) {
alert("Error!" + "\r" + e + ' ' + e.line);
}``````

P.S. I'll ask a moderator to change this topic from "bugs" to "discussion", bugs are for Adobe bugs, not for problems with code created by generative AI platforms.

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
New Here ,
Apr 17, 2024 Apr 17, 2024

Copied

```@Stephen_A_Marsh It's working now! Thanks.
There are just two more problems, the script didn't run with that last line of "Catch".
And the other is: When the selected layer is within a group and/or subgroup, the script does not work.
The message is that photoshop understands that it does not have any information within the group```

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
LEGEND ,
Apr 17, 2024 Apr 17, 2024

Copied

The "catch" statement is there to deal with errors. Did you select a layer inside that artboard?

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
Community Expert ,
Apr 17, 2024 Apr 17, 2024

Copied

What version of Photoshop are you using?

The selected layer could be in nested groups and the parent of those groups has to be an artboard.

Your requirements are somewhat challenging. :]

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
Community Expert ,
Apr 17, 2024 Apr 17, 2024

Copied

As the script uses ExtendScript Action Manager code to retrieve the artboard bounds and to check if the layer is an artboard (as opposed to a group), this code may not work in older versions of Photoshop. I have tested in 2021 and 2024:

``````#target photoshop

// Checks that the active layer is an artboard
if (isArtboard() === true) {

alert("Select a layer inside the artboard and run the script again...")

} else {

// Check that the current layer is a standard pixel layer
if (app.activeDocument.activeLayer.typename === "ArtLayer" && app.activeDocument.activeLayer.kind === LayerKind.NORMAL) {

// Set the ruler units to px, don't assume that they are set to px
var originalRulerUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;

// Set the original layer as a variable
var theLayer = app.activeDocument.activeLayer;

// Traverse the layers until the artboard is selected
while (isArtboard() === false) {
app.activeDocument.activeLayer = app.activeDocument.activeLayer.parent;
}

try {
// Active Artboard Dimensions, by Rune L-H
var ref = new ActionReference();
ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
var artBoardRect = executeActionGet(ref).getObjectValue(stringIDToTypeID("artboard")).getObjectValue(stringIDToTypeID("artboardRect"));
var artBoardRectWidth = new UnitValue(artBoardRect.getDouble(stringIDToTypeID("right")) - artBoardRect.getDouble(stringIDToTypeID("left")), "px");
var artBoardRectHeight = new UnitValue(artBoardRect.getDouble(stringIDToTypeID("bottom")) - artBoardRect.getDouble(stringIDToTypeID("top")), "px");
} catch (e) {
alert("The problem could be that the layer is inside of a group..." + "\r" + e + ' ' + e.line);

app.activeDocument.activeLayer = theLayer;
}

// Gets the layer dimensions
var layerWidth = theLayer.bounds[2].value - theLayer.bounds[0].value;
var layerHeight = theLayer.bounds[3].value - theLayer.bounds[1].value;

// Calculates the total area of the screen/artboard
var artboardArea = artBoardRectWidth.value * artBoardRectHeight.value;

// Calculate the layer area
var layerArea = layerWidth * layerHeight;

// Calculate the total percentage of the layer
var totalPercentage = (layerArea / artboardArea) * 100;

// Checks if the layer occupies more than 30% of the screen/artboard
if (totalPercentage >= 30) {
alert("The layer occupies **" + totalPercentage.toFixed(2) + "%** of the screen/artboard. Test passed!");
} else {
alert("The layer occupies **" + totalPercentage.toFixed(2) + "%** of the canvas/artboard. Increase the layer to pass the test!");
}

app.activeDocument.activeLayer = theLayer;

} else {
alert("Ensure that a standard pixel layer is selected...");
}

// Return the original ruler units
app.preferences.rulerUnits = originalRulerUnits;

}

function isArtboard() {
// modified from a script by greless with hints from jazz-y!
// returns true or false
try {
var d = new ActionDescriptor();
var r = new ActionReference();
r.putEnumerated(stringIDToTypeID('layer'), stringIDToTypeID('ordinal'), stringIDToTypeID('targetEnum'));
var options = executeActionGet(r);
return options.hasKey(stringIDToTypeID('artboard')); // test for the required key
} catch (e) {
alert("Error!" + "\r" + e + ' ' + e.line);
}
}``````

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
New Here ,
Apr 19, 2024 Apr 19, 2024

Copied

LATEST

@Stephen_A_Marsh Muito obrigado! Eu resolvi as limitaÃ§Ãµes do script criando uma aÃ§Ã£o para o photoshop.