Photoshop CS3〜CC編 レイヤーを名前順に並び替える

今回はPhotoshopでレイヤーを名前順に並び替えるスクリプトです。IllustratorとPhotoshopで使われているJavaScriptのオブジェクトやメソッドは非常に似ています。以下のスクリプトも基本的にはIllustratorでレイヤーを名前順に並び替えるものと似ています。ただPhotoshopには背景があり、背景の場合はレイヤーとみなさず並び替えを行わないようにする必要があります。また、Photoshopの場合はレイヤーが不可視状態やロック状態であってもスクリプトでレイヤー順序を入れ替えることができます。エラーで停止してしまうIllustratorよりは寛容です。
以下のスクリプトを使うと最初の階層のレイヤーを並び替えます。レイヤーセット内のレイヤーはソートの対象外です。

// レイヤーをソートする
(function sortLayer(layObj){
var nameList = []; // 名前を入れる配列
var bg = 0;
if(layObj[layObj.length - 1].isBackgroundLayer == true){
bg = 1;
}
for(var i=0; i<layObj.length-bg; i++){
layObj[i].name = "_"+layObj[i].name;
// 名前を保存しておく
nameList[i] = layObj[i].name;
}
// レイヤーを昇順に並べ替え
nameList = nameList.sort();
var flag = confirm("降順にしますか?");
if (flag == true){
// レイヤー名を降順に並べ替える
nameList.reverse();
}
// 挿入基準のレイヤーを一番上に移動する
var baseLayObj = layObj[nameList[0]];
baseLayObj.move(layObj[0], ElementPlacement.PLACEBEFORE);
// レイヤーを並べ替え
for(var i=1; i<nameList.length; i++){
var aLay = layObj[nameList[i]];
aLay.move(baseLayObj, ElementPlacement.PLACEBEFORE);
}
// 最初のレイヤーを移動
baseLayObj.move(layObj[0], ElementPlacement.PLACEBEFORE);
// 名前を元に戻す
for(var i=0; i<layObj.length-bg; i++){
layObj[i].name = layObj[i].name.substr(1, 99999);
}
})(activeDocument.layers);

選択したレイヤーセット内のレイヤーを並べ替えるには以下のスクリプトになります。なお、このスクリプトでもレイヤーセット内にレイヤーセットがある場合、入れ子になったレイヤーセット内のレイヤーは並べ替えの対象になりません。

// 選択されたレイヤーセット内のレイヤーをソートする
function sortLayer(layObj){
var nameList = []; // 名前を入れる配列
for(var i=0; i<layObj.length; i++){
layObj[i].name = "_"+layObj[i].name;
// 名前を保存しておく
nameList[i] = layObj[i].name;
}
// レイヤーを昇順に並べ替え
nameList = nameList.sort();
var flag = confirm("降順にしますか?");
if (flag == true){
// レイヤー名を降順に並べ替える
nameList.reverse();
}
// 挿入基準のレイヤーを一番上に移動する
var baseLayObj = layObj[nameList[0]];
baseLayObj.move(layObj[0], ElementPlacement.PLACEBEFORE);
// レイヤーを並べ替え
for(var i=1; i<nameList.length; i++){
var aLay = layObj[nameList[i]];
aLay.move(baseLayObj, ElementPlacement.PLACEBEFORE);
}
// 最初のレイヤーを移動
baseLayObj.move(layObj[0], ElementPlacement.PLACEBEFORE);
// 名前を元に戻す
for(var i=0; i<layObj.length; i++){
layObj[i].name = layObj[i].name.substr(1, 99999);
}
}
(function (){
if(!activeDocument.activeLayer.layerSets){
alert("レイヤーセットを選択してください");
return;
}
sortLayer(activeDocument.activeLayer.layers);
})();

[サンプルをダウンロード]