コモノExtendScript100本ノック

超初心者のDTPオペレーターが週にひとつスクリプトを書くブログ

010.【ID】段落スタイル名をまとめて変更

書いたコード

#targetengine "renamePstyles"
var doc = app.activeDocument;
var allPstyles = doc.allParagraphStyles;
var allPstylesLen = allPstyles.length;
var pstyles = []; // [基本段落]と[段落スタイルなし]以外の段落スタイル
var pstylesNames = []; // [基本段落]と[段落スタイルなし]以外の段落スタイル名

// [基本段落]と[段落スタイルなし]以外の段落スタイルを取得
for (var i = allPstylesLen - 1; i > 1; i--) {
  pstyles.push(allPstyles[i])
}
pstyles.reverse();

// [基本段落]と[段落スタイルなし]以外の段落スタイル名を取得
var pstylesLen = pstyles.length;
for (var i = 0; i <pstylesLen; i++) {
  pstylesNames.push(pstyles[i].name)
}
var pstylesNamesStr = pstylesNames.join("\n");

// ウィンドウ表示
var myDlg = new Window("palette", "段落スタイルをリネーム");
var main = myDlg.add("group {alignChildren: 'left', orientation: 'row'}");
var leftColumn = main.add("panel", undefined, "変更前");
var beforeName = leftColumn.add("edittext", [0, 0, 300, 350], pstylesNamesStr, {multiline: true});
var rightColumn = main.add("panel", undefined, "変更後");
var afterName = rightColumn.add("edittext", [0, 0, 300, 350], "", {multiline: true});
var start = myDlg.add("button", undefined, "実行");
myDlg.show();

// リネーム
start.onClick = function () {
    var beforeNameArr = beforeName.text.split("\n");
    var beforeNameLen = beforeNameArr.length;
    var afterNameArr = afterName.text.split("\n");
    var afterNameLen = afterNameArr.length;    
    if (beforeNameLen!=afterNameLen){
        alert("変更前後の数が異なります")
        } else {
            for (var i =0;i<afterNameLen;i++){
                if (existInArr (pstylesNames, afterNameArr[i])){
                    alert("スタイル名が重複しています")
                    } else {
                        if(!existInArr (pstylesNames, beforeNameArr[i])){
                            alert("該当のスタイルが見つかりません")
                            } else {
                                var pId = getIdInArr(pstylesNames, beforeNameArr[i]) // pstylesの中の何番目か
                                pstyles[pId].name=afterNameArr[i];
                                }
                            }
                }
            }
    myDlg.close();
    alert("完了しました")
    }

function existInArr (arr, tgt){
    existInArr = false; 
    var arrLen=arr.length;
    for (var p=0; p<arrLen;p++){
        if (arr[p]===tgt){
            return true;
        }
    }
}

function getIdInArr (arr, tgt){
    getIdInArr = false;
    var arrLen=arr.length;
    for (var p=0; p<arrLen;p++){
        if (arr[p]===tgt){
            return p;
        }
    }
}

メモ

分からなかったこと

  • edittextのサイズ leftColomnのサイズはなりゆきにしてrightColomnのサイズをそれに合わせたかったのだけど、どのプロパティがサイズを表しているのか分からなかった。 「rightColumn.bounds=leftColumn.bounds;」かなと思ったんだけど、そもそもboundsというプロパティが無かった。
  • edittext内でCtrl+Vが効かない Ctrl+Vするとスプレッド上にペーストされてしまう。右クリックから貼り付けることはできる。 なにかオプションを設定すれば効くようになるんだろうか。
  • 例外処理 例外処理が多くて階層が深くなってしまった。他にうまい書き方は無いか。

参考