【JSX】Photoshopのレイヤーにマスクがかかっているか自動検出

実行メソッドは参考記事の必要な箇所だけ抜粋して使用してます。

#### 環境
- macOS High Sierra（バージョン 10.13.3）
- Adobe Photoshop CC
- Adobe Extendscript Toolkit CC

#### レイヤーを抽出する
```javascript:レイヤー抽出
var _layerList = [],
main = function(){
        var document  = activeDocument;
        var layerList = document.layers;

        getLayer(layerList);

        for(var i = 0, num = _layerList.length; i < num; i++){
                //layer変数から参照可能
                var layer = _layerList[i];
                alert("ここにレイヤーマスク判定メソッドなどを追加");
        }
        alert("処理が完了しました。");
},
getLayer = function(layerList){
        for(var i = 0, num = layerList.length; i < num; i++){
                var layer = layerList[i];
                if(layer.typename == "LayerSet") getLayer(layer.layers);
                _layerList.push(layer);
        }
};
main();
```

#### レイヤーマスクの判定
```javascript:レイヤーマスク判定
var _layerList = [],
main = function(){
        var document  = activeDocument;
        var layerList = document.layers;

        getLayer(layerList);

        for(var i = 0, num = _layerList.length; i < num; i++){
                var layer = _layerList[i];
                document.activeLayer = layer;
                //hasMask変数よりレイヤーマスクがかかっているか判定可能（true/false）
                hasMask = hasLayerMask();
                alert("hasMask変数を使ったラベルカラー指定メソッドなどを追加");
        }
        alert("処理が完了しました。");
},
hasLayerMask = function(){
        //レイヤーマスクの有無を判定
        var m_Ref01 = new ActionReference();
        m_Ref01.putEnumerated( sTID( "layer" ), cTID( "Ordn" ), cTID( "Trgt" ));
        var m_Dsc01= executeActionGet( m_Ref01 );
        return m_Dsc01.hasKey(cTID('Usrs'));
},
cTID = function(s) {return app.charIDToTypeID(s);},
sTID = function(s) {return app.stringIDToTypeID(s);},
getLayer = function(layerList){
        for(var i = 0, num = layerList.length; i < num; i++){
                var layer = layerList[i];
                if(layer.typename == "LayerSet") getLayer(layer.layers);
                _layerList.push(layer);
        }
};
main();
```

#### レイヤーにラベルカラーを指定
```javascript:ラベルカラー指定
var _layerList = [],
main = function(){
        var document  = activeDocument;
        var layerList = document.layers;

        getLayer(layerList);

        for(var i = 0, num = _layerList.length; i < num; i++){
                var layer = _layerList[i];
                document.activeLayer = layer;
                hasMask = hasLayerMask();
                //レイヤーマスク判定（マスクがかかってない場合）
                if(!hasMask){
                        //マスクがかかっていないレイヤーのラベルカラーを赤に設定
                        var util = new PSLayerUtil();
                        util.setLayerColor(PSLayerUtil.LayerColors.Red);
                }
        }
        alert("処理が完了しました。");
},
hasLayerMask = function(){
        //レイヤーマスクの有無を判定
        var m_Ref01 = new ActionReference();
        m_Ref01.putEnumerated( sTID( "layer" ), cTID( "Ordn" ), cTID( "Trgt" ));
        var m_Dsc01= executeActionGet( m_Ref01 );
        return m_Dsc01.hasKey(cTID('Usrs'));
},
cTID = function(s) {return app.charIDToTypeID(s);},
sTID = function(s) {return app.stringIDToTypeID(s);},
getLayer = function(layerList){
        for(var i = 0, num = layerList.length; i < num; i++){
                var layer = layerList[i];
                if(layer.typename == "LayerSet") getLayer(layer.layers);
                _layerList.push(layer);
        }
};
var PSLayerUtil = function() {
        this._colorRef = new ActionReference();
        this._colorRef.putEnumerated(charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt'));
}
PSLayerUtil.LayerColors = {
        Red:    'Rd  ',
        Orange: 'Orng',
        Yellow: 'Ylw ',
        Green:  'Grn ',
        Blue:   'Bl  ',
        Violet: 'Vlt ',
        Gray:   'Gry ',
        None:   'None',
};
PSLayerUtil.prototype = {
        _colorRef: null,
        setLayerColor: function(layerColor) {
                var colorDescriptor = new ActionDescriptor();
                colorDescriptor.putEnumerated(charIDToTypeID('Clr '), charIDToTypeID('Clr '), charIDToTypeID(layerColor));
                var desc = new ActionDescriptor();
                desc.putReference(charIDToTypeID('null'), this._colorRef);
                desc.putObject(charIDToTypeID('T   '), charIDToTypeID('Lyr '), colorDescriptor);
                executeAction(charIDToTypeID('setd'), desc, DialogModes.NO);
                return this.layerColor();
        },
        layerColor: function() {
                var desc = executeActionGet(this._colorRef);
                var charID = typeIDToCharID(desc.getEnumerationValue(charIDToTypeID('Clr ')));
                for(var key in PSLayerUtil.LayerColors) {
                        var value = PSLayerUtil.LayerColors[key];
                        if(value === charID) return key;
                }
                return 'None';
        },
}
main();
```

#### まとめ
特定のレイヤーに対して実行をかけたい場合など、レイヤー名（`layer.name`）を正規表現による判定を加えたりやりようによってはいろいろ条件が付与できると思います。

#### 参考
[【Photoshop JS】全てのレイヤーセットを閉じる](https://qiita.com/IDs011da/items/e1bd9d40cd953392696e)
[Adobe JSXでPhotoshopのレイヤーにカラーラベルをつける](https://qiita.com/mazgi/items/3f9ffbd4a7d2b1b74612)