レイヤーを複製先のドキュメントに複製元のドキュメント名と同じ名前で複製する

レイヤーを複製先のドキュメントに複製元のドキュメント名と同じ名前で複製するスクリプトです。

// https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14235664689


try {
if ( documents.length == 0 ) { //開いているドキュメントがゼロなら
app.beep();
throw new Error( "ドキュメントが開かれていません" );
}
var doc = activeDocument; //ドキュメントを取得
if ( !isSelected( doc ) ) { //選択レイヤーが存在しなければ
app.beep();
throw new Error( "レイヤーが選択されていません" );
}

//選択レイヤーがあるので処理をします!
// アクティブになってるドキュメントの名前を求める
dName = activeDocument.name;
// alert(dName);

// ドキュメントの名称
var docLength = documents.length;

if(docLength >= 3) {
app.beep();
alert('処理対象のドキュメントのみ開いてください');
} else if(docLength == 1) {
app.beep();
alert('複製先のドキュメントがありません');
} else if (docLength == 2){

var i;
i = docLength - 2;
var docName = documents[i].name;

if(docName == dName) {
app.beep();
alert('複製元のドキュメントを表示してください');
} else {

// レイヤーを指定したドキュメントに複製
// https://pulogu.net/blog/020-computer/photoshop/photoshop-javascript-multiple-document-name-get/
var idduplicate = stringIDToTypeID( "duplicate" );
var desc7 = new ActionDescriptor();
var idnull = stringIDToTypeID( "null" );
var ref1 = new ActionReference();
var idlayer = stringIDToTypeID( "layer" );
var idordinal = stringIDToTypeID( "ordinal" );
var idtargetEnum = stringIDToTypeID( "targetEnum" );
ref1.putEnumerated( idlayer, idordinal, idtargetEnum );
desc7.putReference( idnull, ref1 );
var idto = stringIDToTypeID( "to" );
var ref2 = new ActionReference();
var iddocument = stringIDToTypeID( "document" );
ref2.putName( iddocument, docName );
desc7.putReference( idto, ref2 );
var idname = stringIDToTypeID( "name" );
desc7.putString( idname, ""+dName+"" );
var idversion = stringIDToTypeID( "version" );
desc7.putInteger( idversion, 5 );
executeAction( idduplicate, desc7, DialogModes.NO );

//app.activeDocument = app.documents[0];
}
}
} catch ( e ) { //例外
alert( e.message ); //例外メッセージ出力
}



//選択レイヤーが存在するか確認する関数
function isSelected( doc ) {
//すべてのレイヤーとレイヤーセットの数を数える
allLsLen = -1; //初期化
allLyLen = 0;
getAllLyLen( doc ); //数える
var beforeLsLen = allLsLen;
var beforeLyLen = allLyLen;

//存在確認としての複製
var desc0 = new ActionDescriptor();
var ref0_1 = new ActionReference();
ref0_1.putEnumerated( charIDToTypeID( "Lyr " ), charIDToTypeID( "Ordn" ), charIDToTypeID( "Trgt" ) );
desc0.putReference( charIDToTypeID( "null" ), ref0_1 );
desc0.putString( charIDToTypeID( "Nm " ), "tmp" );
desc0.putInteger( charIDToTypeID( "Vrsn" ), 5 );
var list0_2 = new ActionList();
list0_2.putInteger( 179 );
desc0.putList( charIDToTypeID( "Idnt" ), list0_2 );
executeAction( charIDToTypeID( "Dplc" ), desc0, DialogModes.NO );

//再度すべてのレイヤーとレイヤーセットの数を数える
allLsLen = -1; //初期化
allLyLen = 0;
getAllLyLen( doc ); //数える
var afterLsLen = allLsLen;
var afterLyLen = allLyLen;

//判定
if ( beforeLsLen == afterLsLen && beforeLyLen == afterLyLen ){ //数が同じなら
return false; //存在しない
}else{
executeAction( charIDToTypeID('undo'), undefined, DialogModes.NO ); //複製をアンドゥ
return true; //存在する
}
}

//すべてのレイヤーとレイヤーセットの数を数える関数
function getAllLyLen(layObj){
var n = layObj.artLayers.length;
for ( var i = 0; i < n; i++ ) {
allLyLen++;
}
var ns = layObj.layerSets.length;
allLsLen++;
for ( var i = 0; i < ns; i++ ) {
getAllLyLen(layObj.layerSets[i]); //再帰処理
}
}

更新履歴

inserted by FC2 system