【Photoshop】特定のpsdファイルに特定のフォルダのpsdファイルをはりつけて別名で保存するスクリプト

#概要
特定のpsdファイルに特定のフォルダのpsdファイルをはりつけて別名で保存するスクリプト

同人誌の再録作業を行っていて、
別のトンボデータに貼り付け保存するのが間違えるし大変なので作りました
**こういうことができる↓**
![inst03.png](https://qiita-image-store.s3.amazonaws.com/0/119469/b77aab7c-0184-9926-7275-eedcd24f7f6b.png)

#スクリプトのDL
[スクリプトはここからDL](
https://box.yahoo.co.jp/guest/viewer?sid=box-l-dncmpjr534ws6tbacm3dnnx32e-1001&uniqid=3d07a34c-4779-4f50-8cae-23acd410520e&viewtype=detail)

#使い方
とにかく使えればいいという人向けにまずは使い方から説明します
##動作確認済環境
* photoshopCC 2015( photoshop CS2でも動作確認済)
* Windows7 64bit　

##必要なこと
* 貼り付け先のpsdファイル（トンボとか/1つでいいです）
* 完成原稿psdファイルのみがはいったフォルダ

##スクリプトを実行するとおこること
* 完成原稿のはいったフォルダに生成されたファイルが**追加保存**される（上書きはしません）
* 生成されたファイル名の命名規則は　→　【生成されるファイル名 + 連番 +.psd】
* 生成されたファイルの描画モードは貼り付け先の描画モードに依存します
 * トンボデータが2値化のpsdデータならば　生成ファイルモードも2値化
 * トンボデータがグレースケールのpsdデータならば　生成ファイルモードもグレースケール
 * 故にトンボデータはグレースケールにしておくことをおすすめします
* 生成されたファイルのレイヤは1枚に結合されてから保存されます

##起動
1. ファイル>スクリプト>参照
![howto01.png](https://qiita-image-store.s3.amazonaws.com/0/119469/e46e8027-f237-c8a4-0b4a-f00984742c7c.png)

1. DLしたスクリプトを選択して読み込んでください
![howto02.png](https://qiita-image-store.s3.amazonaws.com/0/119469/237e1d28-9d4e-0405-d8c4-42f8eac19d4c.png)

1. スクリプトが起動してダイアログが出ます
![inst04.png](https://qiita-image-store.s3.amazonaws.com/0/119469/df0897a7-8731-8804-2581-58e8e7343e19.png)

1. 貼り付け先のデータを選んで下さい（原稿の場合はトンボデータ）
![howto04.png](https://qiita-image-store.s3.amazonaws.com/0/119469/8d1c429d-2a60-9fa9-44fa-e49d859af5f1.png)

1. スクリプトを適用したいフォルダを選択（完成原稿の入ったフォルダを選択）
![howto05.png](https://qiita-image-store.s3.amazonaws.com/0/119469/34440bad-719f-3ff5-16e8-9dfc6a385697.png)
　↓(フォルダの中身はこうなってます)
![howto06.png](https://qiita-image-store.s3.amazonaws.com/0/119469/15ec41a1-7aec-52a2-1af4-8e63c67fbdd3.png)

1. 選択が完了すると自動でスクリプトが走ります
1. 結果
 Completion001 , 002, 003, ...が自動作成されたファイルです 
今回は生成されるファイル名を[Completion]にしたためこうなりました
![howto07.png](https://qiita-image-store.s3.amazonaws.com/0/119469/cc4d55e2-d079-bb78-7d68-a711ef1e307d.png)

1. 使い方は難しくないと思うので実際使ってみてためしてください
わからなかった、使えなかったという時は連絡下さい

#コードについて
##はじめに
　スクリプト使いたさに初めてjavascriptを触ったので、間違った書き方をしていればご教示下さい
##作成したコード
```js
function main(){

    //画像のトリミングはクロップを使う
    preferences.rulerUnits = Units.PIXELS;  //PIXEL単位を使用 - 多分自分で計算しないといけない
    //用紙サイズ（単位:mm）のピクセル値を求める計算式は、 用紙の一辺の長さ[mm] × 解像度[dpi] ÷ 25.4　です。
    
    //各種設定の読み込み
    var isDone = false;
    
    var uDlg = new Window("dialog","切り抜くサイズを指定して下さい",[200,100,580,260]);
    
    var DlgTextTop = 10;
    var DlgTextHeight = 25;
    uDlg.sText = uDlg.add("statictext",[80, DlgTextTop,100, DlgTextTop+DlgTextHeight], "横");
    uDlg.eWidth = uDlg.add("edittext",[100, DlgTextTop, 275, DlgTextTop+DlgTextHeight], "148");
    uDlg.sText = uDlg.add("statictext",[280, DlgTextTop,300, DlgTextTop+DlgTextHeight], "mm");
    DlgTextTop += 30;
    uDlg.sText = uDlg.add("statictext",[80, DlgTextTop,100, DlgTextTop+DlgTextHeight], "縦");
    uDlg.eHeight = uDlg.add("edittext",[100, DlgTextTop, 275, DlgTextTop+DlgTextHeight], "210");
    uDlg.sText = uDlg.add("statictext",[280, DlgTextTop, 300, DlgTextTop+DlgTextHeight], "mm");
    DlgTextTop += 30;
    uDlg.sText = uDlg.add("statictext",[10, DlgTextTop,120, DlgTextTop+DlgTextHeight], "生成されるファイル名");
    uDlg.eFileName = uDlg.add("edittext",[125, DlgTextTop,275, DlgTextTop+DlgTextHeight], "Completion");

    DlgTextTop += 40;
    uDlg.okBtn = uDlg.add("button",[90, DlgTextTop,160, DlgTextTop+DlgTextHeight], "OK", { name:"ok"});
    uDlg.cancelBtn = uDlg.add("button", [180, DlgTextTop,250, DlgTextTop+DlgTextHeight], "Cancel", {name: "cancel"});
    
    
    //ボタンをおした時の挙動
    uDlg.okBtn.onClick  = function(){
        //数値をチェック問題があれば戻す
        var EditNum = Number (uDlg.eWidth.text);
        if(EditNum <= 0)
        {
            alert("横幅を正しく入力して下さい");
            return false;
        }
        EditNum = Number (uDlg.eHeight.text);
        if(EditNum <= 0)
        {
            alert("縦幅を正しく入力して下さい");
            return false;
        }
        isDone = true;
        uDlg.close();
        }
    uDlg.show();

    if(isDone == false)
    {
        alert("入力されていません、スクリプトを終了します");
        return false;
        }

    //貼り付け先のデフォルトファイル
    var fileSrcPath = File.openDialog ("トンボファイルを指定してください", "*.psd");   //ファイル名が選択されるだけ
    if(fileSrcPath.length == 0){
        alert("選択されていません、スクリプトを終了します");
        return false;
        }
    var docSrc = app.open( fileSrcPath);

    //指定フォルダの選択
    var dirObj = Folder.selectDialog ("操作を行うフォルダの選択");
    if(dirObj.length == 0){
        alert("選択されていません、スクリプトを終了します");
        return false;
        }
    
    var DstFiles = dirObj.getFiles ("*.psd");
    for(var i = 0; i < DstFiles.length; i++)
    {
        FromCopyToSave( i + 1 , DstFiles[i], docSrc, dirObj);
        }
    activeDocument = docSrc;
    activeDocument.close(SaveOptions.DONOTSAVECHANGES);
    
    //コピペから保存まで全部
    function FromCopyToSave( Num, fileDstPath, docSrc, saveFolda){
        activeDocument = docSrc;
        var docCpySrc = docSrc.duplicate(); //  複製  →保存後消す
        
        //貼り付けたい画 を　真ん中から指定サイズで切り抜き
        var docDst = app.open( fileDstPath);
        
        var CropPos ={
            LEFT : 0,
            TOP : 1,
            RIGHT : 2,
            BOTTOM : 3,
            _SIZEOF : 4,
            };
        
        var DstWidth = docDst.width;
        var DstHeight = docDst.height;
        var res = docDst.resolution;  //解像度
        var UserSettingWidth = ( Number(uDlg.eWidth.text)) * res / 25.4;
        var UserSettingHeight = ( Number(uDlg.eHeight.text)) * res / 25.4;
        var CropLeft = (DstWidth - UserSettingWidth)/2;
        var CropTop = (DstHeight - UserSettingHeight)/2;
        var CropRight = CropLeft + UserSettingWidth;
        var CropBottom = CropTop + UserSettingHeight; 

        //var boundPropPos = [ CropLeft, CropTop, CropRight, CropBottom];
        //docDst.crop(boundPropPos);  //切り抜き

        //選択範囲をコピー
        //レイヤが背景の場合コピーできないので　背景ならばレイヤに変更する
        //2値化されていないデータのみすべての可視レイヤを結合してからコピー
        var colMode = activeDocument.mode;  //カラーモードを調べる
        if(activeDocument.activeLayer.isBackgroundLayer == false)
        {
            if(colMode != DocumentMode.BITMAP)
            {
                activeDocument.mergeVisibleLayers();
                }
        }
        var selReg =[ [ CropLeft, CropTop], [ CropRight, CropTop], [ CropRight, CropBottom], [ CropLeft, CropBottom] ];  
        activeDocument = docDst;
        activeDocument.selection.select(selReg);
        activeDocument.selection.copy();

        activeDocument = docCpySrc;
        docCpySrc.paste(); //別に設定しなくても真ん中に貼ってくれるみたい

        //すべてのレイヤを結合して別名で保存
        colMode = activeDocument.mode;  //カラーモードを調べる
        if(colMode != DocumentMode.BITMAP)
        {
            activeDocument.mergeVisibleLayers();
            }
        
        //ファイル名が存在する場合は(連番)をいれていく
        // file名 + 3桁 +.psd
        var DigitNum = Num;
        if(Num > 99)
        {
            DigitNum =  Num; 
            }else if( Num > 9)
        {
            DigitNum = '0' +  Num;
            }else
        {
            DigitNum = '00' + Num;
            }
        
        var SaveFilePath = saveFolda + "\\" + uDlg.eFileName.text + DigitNum + ".psd";
        fileObj = new File(SaveFilePath);
        var SerialNum = 0;
        while( fileObj.exists)
        {
            alert("同名のファイルが存在します。連番をつけて作成します");
            SerialNum++;
            SaveFilePath = saveFolda + "\\" + uDlg.eFileName.text + DigitNum + "(" + SerialNum+ ")" + ".psd";
            fileObj = new File(SaveFilePath);
            }
        psdOpt = new PhotoshopSaveOptions();
        psdOpt.alphaChannels = true;
        psdOpt.annotations = true;
        psdOpt.embedColorProfile = false;
        psdOpt.layers = true;
        psdOpt.spotColors = false;
        activeDocument.saveAs(fileObj, psdOpt, true, Extension.LOWERCASE);
        
        //必要ないファイルはセーブせずに閉じる
        activeDocument.close(SaveOptions.DONOTSAVECHANGES);
        activeDocument = docDst;
        activeDocument.close(SaveOptions.DONOTSAVECHANGES);
        }
    
    return true;
}

main();

```
###感想
* javascriptって var,var言い過ぎじゃない？
* 定義が曖昧すぎてさっき宣言したこれはなんだったかな？となることが多くてつらかった
* 途中まで関数の作り方を知らず上から順にかいていったためとんでもないことになった
* 関数の作り方がわかっても続行して無理矢理かいたため更に複雑な構造になっている
* とはいえjavascript歴初日でとりあえず動くものが作れるんだからすごい言語だな
* 次はもっと綺麗なコードを目指したい
* 使用者がエンジニアでないことを考慮して細かい設定はあえてできないようにしたのですがどうでしょう

##参考サイト
[OpenSpace](http://www.openspc2.org/)
 　他のバージョンやリファレンスへのリンクもありました
[Adobe Photoshop CC自動化作戦](http://www.openspc2.org/book/PhotoshopCC/)
　 上記サイトOpenSpaceさんのコンテンツのひとつ
[Adobe CC バージョンJavaScript リファレンス](http://www.openspc2.org/reibun/AdobeJS/CC/index.html)
 　日本語でありがたい
[Photoshop CS5 JavaScript Reference(PDF)](http://wwwimages.adobe.com/content/dam/Adobe/en/devnet/photoshop/pdfs/photoshop_cs5_javascript_ref.pdf)
 　Adobe公式 英語 最終的にはここから検索するしかなかった 他バージョンは[こちらから](http://www.adobe.com/devnet/photoshop/scripting.html)