Skip to main content
_wckdTall_
Inspiring
Jul 20, 2026 6:23 PM UTC
Answered

How do you find layer kind for Grain in scripting?

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]

 

Stephen Marsh
Stephen MarshCorrect answer
Community Expert
Jul 21, 2026 12:56 AM UTC
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
Aug 13, 2026 12:35 PM UTC

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;
}
}

 

Translate
Stephen Marsh
Community Expert
Community Expert
Sep 17, 2026 3:03 AM UTC

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;
}
}

 

Translate
Stephen Marsh
Community Expert
Stephen MarshCommunity ExpertCorrect answer
Community Expert
Jul 21, 2026 12:56 AM UTC
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;
}
}
*/

 

Translate
Stephen Marsh
Community Expert
Community Expert
Jul 21, 2026 12:56 AM UTC
/*
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?!");
}

 

Translate