書いたコード
#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[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するとスプレッド上にペーストされてしまう。右クリックから貼り付けることはできる。
なにかオプションを設定すれば効くようになるんだろうか。
- 例外処理
例外処理が多くて階層が深くなってしまった。他にうまい書き方は無いか。
参考