Skip to main content
_wckdTall_
Inspiring
July 20, 2026
Answered

How do you find layer kind for Grain in scripting?

  • July 20, 2026
  • 4 replies
  • 77 views

app.activeLayer.kind returns an error for Grain adjustment layers, is here anyway to return a value for them? Is it detectable with AM? Currently, just using a try catch to return undefined.

activeDocument.activeLayer
------------------------
1) allLocked=false
2) blendMode=BlendMode.NORMAL
3) bounds=0 px,0 px,13754 px,7760 px
4) boundsNoEffects=0 px,0 px,13754 px,7760 px
5) fillOpacity=100
6) filterMaskDensity=100
7) filterMaskFeather=0
8) grouped=false
9) id=7002
10) isBackgroundLayer=false
11) itemIndex=12
12) kind= Internal error
13) layerMaskDensity=100
14) layerMaskFeather=0
15) linkedLayers=
16) name=Grain 1
17) opacity=100
18) parent=[LayerSet Effects]
19) pixelsLocked=false
20) positionLocked=false
21) textItem= Layer is not a text layer.
22) transparentPixelsLocked=false
23) typename=ArtLayer
24) vectorMaskDensity=100
25) vectorMaskFeather=0
26) visible=true
27) xmpMetadata=[XMP Metadata]

 

Correct answer Stephen Marsh
stringIDToTypeID( "grainAdjustment" );

 

As in:

 

var idMk = charIDToTypeID( "Mk  " );
var desc6296 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref316 = new ActionReference();
var idcontentLayer = stringIDToTypeID( "contentLayer" );
ref316.putClass( idcontentLayer );
desc6296.putReference( idnull, ref316 );
var idUsng = charIDToTypeID( "Usng" );
var desc6297 = new ActionDescriptor();
var idType = charIDToTypeID( "Type" );
var idgrainAdjustment = stringIDToTypeID( "grainAdjustment" );
desc6297.putClass( idType, idgrainAdjustment );
var idcontentLayer = stringIDToTypeID( "contentLayer" );
desc6296.putObject( idUsng, idcontentLayer, desc6297 );
executeAction( idMk, desc6296, DialogModes.NO );

 

Edit: Here's something useful…

 

if (isGrainAdjustmentLayer()) {
alert("True");
} else {
alert("False");
}

function isGrainAdjustmentLayer() {
try {
var s2t = stringIDToTypeID;
var ref = new ActionReference();
ref.putProperty(s2t("property"), s2t("adjustment"));
ref.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
return typeIDToStringID(executeActionGet(ref).getList(s2t("adjustment")).getObjectType(0)) === "grainAdjustment";
} catch (e) {
return false;
}
}


/*
function isGrainAdjustmentLayer() {
try {
var s2t = stringIDToTypeID;
function getLayerProperty(property) {
var ref = new ActionReference();
ref.putProperty(s2t("property"), s2t(property));
ref.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
return executeActionGet(ref);
}
// Must be an adjustment layer
if (getLayerProperty("layerKind").getInteger(s2t("layerKind")) !== 2) {
return false;
}
return typeIDToStringID(getLayerProperty("adjustment").getList(s2t("adjustment")).getObjectType(0)) === "grainAdjustment";
} catch (e) {
return false;
}
}
*/

 

4 replies

Stephen Marsh
Community Expert
Community Expert
August 13, 2026

Some new ones…

 

Check/test for active layer = Clarity and Dehaze adjustment layer

if (isClarityAdjustmentLayer()) {
alert("True");
} else {
alert("False");
}

function isClarityAdjustmentLayer() {
try {
var s2t = stringIDToTypeID;
var ref = new ActionReference();
ref.putProperty(s2t("property"), s2t("adjustment"));
ref.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
return typeIDToStringID(executeActionGet(ref).getList(s2t("adjustment")).getObjectType(0)) === "clarity";
} catch (e) {
return false;
}
}

 

Check/test for active layer = Vibrance (classic/legacy) adjustment layer

if (isVibranceAdjustmentLayer()) {
alert("True");
} else {
alert("False");
}

function isVibranceAdjustmentLayer() {
try {
var s2t = stringIDToTypeID;
var ref = new ActionReference();
ref.putProperty(s2t("property"), s2t("adjustment"));
ref.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
var adjustmentList = executeActionGet(ref).getList(s2t("adjustment"));

if (typeIDToStringID(adjustmentList.getObjectType(0)) !== "vibrance") {
return false;
}

// Plain/legacy Vibrance layers are created from a bare class reference,
// so they never carry a "useLegacy" key. Color and Vibrance layers do
// (regardless of whether Legacy mode is toggled on or off).
var adjustmentDesc = adjustmentList.getObjectValue(0);
return !adjustmentDesc.hasKey(s2t("useLegacy"));
} catch (e) {
return false;
}
}

 

Check/test for active layer = Color and Vibrance adjustment layer

/*
https://community.adobe.com/questions-712/how-do-you-find-layer-kind-for-grain-in-scripting-1632968?postid=7711043#post7711043
*/

if (isColorAndVibranceAdjustmentLayer()) {
alert("True");
} else {
alert("False");
}

function isColorAndVibranceAdjustmentLayer() {
try {
var s2t = stringIDToTypeID;
var ref = new ActionReference();
ref.putProperty(s2t("property"), s2t("adjustment"));
ref.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
var adjustmentList = executeActionGet(ref).getList(s2t("adjustment"));

if (typeIDToStringID(adjustmentList.getObjectType(0)) !== "vibrance") {
return false;
}

// Color and Vibrance layers are created with a "Type" object that
// carries a "useLegacy" key (true or false). Plain/legacy Vibrance
// layers are created from a bare class reference and never have it.
var adjustmentDesc = adjustmentList.getObjectValue(0);
return adjustmentDesc.hasKey(s2t("useLegacy"));
} catch (e) {
return false;
}
}

 

Stephen Marsh
Community Expert
Community Expert
September 17, 2026

New code to check for the new "Light" adjustment layer (which specifically looks for the differences between the old Brightness and Contrast adjustment layer).

/*
Check Test for Light Adjustment Layer.jsx
Stephen Marsh
Based on:
https://community.adobe.com/questions-712/how-do-you-find-layer-kind-for-grain-in-scripting-1632968?postid=7711043#post7711043
*/

if (isLightAdjustmentLayer()) {
alert("True");
} else {
alert("False");
}

function isLightAdjustmentLayer() {
try {
var s2t = stringIDToTypeID;
var ref = new ActionReference();
ref.putProperty(s2t("property"), s2t("adjustment"));
ref.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
var adjustmentList = executeActionGet(ref).getList(s2t("adjustment"));

// "Light" is built on the Brightness/Contrast adjustment class ("BrgC" / "brightnessEvent")
if (typeIDToStringID(adjustmentList.getObjectType(0)) !== "brightnessEvent") {
return false;
}

// Distinguish the new simplified "Light" mode from a classic Brightness/Contrast layer
var adjustmentDesc = adjustmentList.getObjectValue(0);
var idBrightnessMode = s2t("brightnessMode");
if (!adjustmentDesc.hasKey(idBrightnessMode)) {
return false;
}
return typeIDToStringID(adjustmentDesc.getEnumerationValue(idBrightnessMode)) === "brightnessModeLight";
} catch (e) {
return false;
}
}

 

While this code checks for the classic Brightness/Contrast adjustment layer:

 

/*
Check Test for Brightness-Contrast Adjustment Layer.jsx
Stephen Marsh
Based on:
https://community.adobe.com/questions-712/how-do-you-find-layer-kind-for-grain-in-scripting-1632968?postid=7711043#post7711043
*/

if (isBrightnessContrastAdjustmentLayer()) {
alert("True");
} else {
alert("False");
}

function isBrightnessContrastAdjustmentLayer() {
try {
var s2t = stringIDToTypeID;
var ref = new ActionReference();
ref.putProperty(s2t("property"), s2t("adjustment"));
ref.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
var adjustmentList = executeActionGet(ref).getList(s2t("adjustment"));

// Both classic Brightness/Contrast and the new "Light" adjustment
// are built on the same class ("BrgC" / "brightnessEvent")
if (typeIDToStringID(adjustmentList.getObjectType(0)) !== "brightnessEvent") {
return false;
}

// Distinguish classic Brightness/Contrast from the new simplified "Light" mode
var adjustmentDesc = adjustmentList.getObjectValue(0);
var idBrightnessMode = s2t("brightnessMode");

// Classic B/C layers typically don't carry a brightnessMode key at all.
// If the key is missing, treat it as classic Brightness/Contrast.
if (!adjustmentDesc.hasKey(idBrightnessMode)) {
return true;
}

// If the key IS present, it's classic only if it's not set to "brightnessModeLight"
return typeIDToStringID(adjustmentDesc.getEnumerationValue(idBrightnessMode)) !== "brightnessModeLight";
} catch (e) {
return false;
}
}

 

Stephen Marsh
Community Expert
Stephen MarshCommunity ExpertCorrect answer
Community Expert
July 21, 2026
stringIDToTypeID( "grainAdjustment" );

 

As in:

 

var idMk = charIDToTypeID( "Mk  " );
var desc6296 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref316 = new ActionReference();
var idcontentLayer = stringIDToTypeID( "contentLayer" );
ref316.putClass( idcontentLayer );
desc6296.putReference( idnull, ref316 );
var idUsng = charIDToTypeID( "Usng" );
var desc6297 = new ActionDescriptor();
var idType = charIDToTypeID( "Type" );
var idgrainAdjustment = stringIDToTypeID( "grainAdjustment" );
desc6297.putClass( idType, idgrainAdjustment );
var idcontentLayer = stringIDToTypeID( "contentLayer" );
desc6296.putObject( idUsng, idcontentLayer, desc6297 );
executeAction( idMk, desc6296, DialogModes.NO );

 

Edit: Here's something useful…

 

if (isGrainAdjustmentLayer()) {
alert("True");
} else {
alert("False");
}

function isGrainAdjustmentLayer() {
try {
var s2t = stringIDToTypeID;
var ref = new ActionReference();
ref.putProperty(s2t("property"), s2t("adjustment"));
ref.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
return typeIDToStringID(executeActionGet(ref).getList(s2t("adjustment")).getObjectType(0)) === "grainAdjustment";
} catch (e) {
return false;
}
}


/*
function isGrainAdjustmentLayer() {
try {
var s2t = stringIDToTypeID;
function getLayerProperty(property) {
var ref = new ActionReference();
ref.putProperty(s2t("property"), s2t(property));
ref.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
return executeActionGet(ref);
}
// Must be an adjustment layer
if (getLayerProperty("layerKind").getInteger(s2t("layerKind")) !== 2) {
return false;
}
return typeIDToStringID(getLayerProperty("adjustment").getList(s2t("adjustment")).getObjectType(0)) === "grainAdjustment";
} catch (e) {
return false;
}
}
*/

 

Stephen Marsh
Community Expert
Community Expert
July 21, 2026
/*
https://community.adobe.com/t5/photoshop-ecosystem-discussions/how-to-check-layer-kind-using-javascript/m-p/13174707
*/

s2t = stringIDToTypeID;
(r = new ActionReference()).putProperty(s2t('property'), p = s2t('layerKind'));
r.putEnumerated(s2t('layer'), s2t('ordinal'), s2t('targetEnum'));
var layerKind = executeActionGet(r).getInteger(p);

if (layerKind == 0) {
alert("kAnySheet");
}
else if (layerKind == 1) {
alert("kPixelSheet");
}
else if (layerKind == 2) {
s2t = stringIDToTypeID;
(r = new ActionReference()).putProperty(s2t('property'), p = s2t('adjustment'));
r.putEnumerated(s2t('layer'), s2t('ordinal'), s2t('targetEnum'));
alert("kAdjustmentSheet: " + typeIDToStringID(executeActionGet(r).getList(p).getObjectType(0)));
}
else if (layerKind == 3) {
alert("kTextSheet");
}
else if (layerKind == 4) {
alert("kVectorSheet");
}
else if (layerKind == 5) {
alert("kSmartObjectSheet");
}
else if (layerKind == 6) {
alert("kVideoSheet");
}
else if (layerKind == 7) {
alert("kLayerGroupSheet");
}
else if (layerKind == 8) {
alert("k3DSheet");
}
else if (layerKind == 9) {
alert("kGradientSheet");
}
else if (layerKind == 10) {
alert("kPatternSheet");
}
else if (layerKind == 11) {
alert("kSolidColorSheet");
}
else if (layerKind == 12) {
alert("kBackgroundSheet");
}
else if (layerKind == 13) {
alert("kHiddenSectionBounder");
}
else {
alert("Why am I seeing this message?!");
}