コモノExtendScript100本ノック

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

057.【Id】タブ区切りtxtを読み込んで一括検索置換

挙動

  1. あらかじめ以下のようなテキストデータを作成しておく 検索ワード1[タブ]置換ワード1 検索ワード2[タブ]置換ワード2
  2. 起動時に上記テキストを指定する
  3. 正規表現かテキスト検索か、②どこを検索範囲とするか を選択する
  4. 実行ボタンを押すと一括で検索置換する

f:id:haraguai_is_bad:20191122170813p:plain:w500

コード

//@targetengine "findChangeBatch"

/* 
あらかじめ以下のようなテキストデータを作成する。
aaa[タブ] bbb
ccc[タブ] ddd
*/

// 検索置換内容を取得
var findWhatList = [];
var changeToList = [];
var txtObj = File("~/Desktop").openDlg("txtを指定してください", "*.txt");
if (!txtObj) {
    alert("キャンセルしました");
    exit();
} else {
    txtObj.open("r");
    var t = txtObj.read();
    var pairsList = t.split(/\r\n|\r|\n/);
    var pairsListCnt = pairsList.length;
    for (var i = 0; i < pairsListCnt; i++) {
        findWhatList.push(pairsList[i].split(/\t/)[0]);
        changeToList.push(pairsList[i].split(/\t/)[1]);
    }
}

// 検索範囲のリストを生成
var tgtDispName = ["ドキュメント"];
if (app.activeDocument.selection.length > 0) {
    var sel = app.activeDocument.selection;
    for (var i = 0; i < sel.length; i++) {
        if (sel[i].constructor.name === "TextFrame") {
            tgtDispName.push("ストーリー");
            break;
        } else if (sel[i].constructor.name === "Character" ||
            sel[i].constructor.name === "Word" ||
            sel[i].constructor.name === "Line" ||
            sel[i].constructor.name === "TextColumn" ||
            sel[i].constructor.name === "Paragraph" ||
            sel[i].constructor.name === "TextStyleRange") {
            tgtDispName.push("選択範囲");
        }
    }
}

// ウィンドウ生成
var palette = new Window("palette");
palette.text = "一括検索置換";
palette.orientation = "row";
palette.alignChildren = ["left", "top"];

var group1 = palette.add("group");
group1.orientation = "row";
group1.alignChildren = ["left", "top"];

var panel1 = group1.add("panel", undefined);
panel1.text = "検索";
panel1.orientation = "column";
panel1.alignChildren = ["left", "top"];

var statictext1 = panel1.add("statictext", undefined, undefined, {multiline: true});
statictext1.text = findWhatList.join("\n");
statictext1.preferredSize.width = 150;
statictext1.preferredSize.height = 100;

var panel2 = group1.add("panel");
panel2.text = "置換";
panel2.orientation = "column";
panel2.alignChildren = ["left", "top"];

var statictext2 = panel2.add("statictext", undefined, undefined, {multiline: true});
statictext2.text = changeToList.join("\n");
statictext2.preferredSize.width = 150;
statictext2.preferredSize.height = 100;

var group2 = palette.add("group");
group2.orientation = "column";
group2.alignChildren = ["fill", "top"];
group2.spacing = 20;
group2.margins = 0;

var group3 = group2.add("group");
group3.orientation = "column";
group3.alignChildren = ["left", "top"];
group3.margins.top = 10;

var checkbox1 = group3.add("checkbox");
checkbox1.text = "正規表現";
checkbox1.preferredSize.width = 100;
checkbox1.alignment = ["center", "top"];

var dropdown1 = group3.add("dropdownlist", undefined, tgtDispName);
dropdown1.preferredSize.width = 100;

var button1 = group2.add("button");
button1.text = "実行";

button1.onClick = function() {
    // 検索範囲を取得
    if (dropdown1.selection.text === "ドキュメント") {
        var tgt = [app.activeDocument];
        var cnt = 1;
    } else {
        var tgt = sel;
        var cnt = tgt.length;
    }
    for (var i = 0; i < cnt; i++) {
        for (var j = 0; j < pairsListCnt; j++) {
            // 正規表現 or テキスト検索
            if (checkbox1.value) {
                tgt[i].hasOwnProperty ("changeGrep") && myChangeGrep(tgt[i], findWhatList[j], changeToList[j])
                } else {
                    tgt[i].hasOwnProperty ("changeText") && myChangeText(tgt[i], findWhatList[j], changeToList[j])
            }
        }
    }
  alert ("完了しました");
  palette.close();

}
palette.show();

function myChangeText(tgt, findStr, changeStr) {
    app.findTextPreferences = NothingEnum.NOTHING;
    app.changeTextPreferences = NothingEnum.NOTHING;
    app.findTextPreferences.findWhat = findStr;
    app.changeTextPreferences.changeTo = changeStr;
    var result = tgt.changeText();
    app.findTextPreferences = NothingEnum.NOTHING;
    app.changeTextPreferences = NothingEnum.NOTHING;
    return result;
}

function myChangeGrep(tgt, findRgx, changeStr) {
    app.findGrepPreferences = NothingEnum.NOTHING;
    app.changeGrepPreferences = NothingEnum.NOTHING;
    app.findGrepPreferences.findWhat = findRgx;
    app.changeGrepPreferences.changeTo = changeStr;
    var result = tgt.changeGrep();
    app.findGrepPreferences = NothingEnum.NOTHING;
    app.changeGrepPreferences = NothingEnum.NOTHING;
    return result;
}

メモ

分からなかったこと

statictext等のSUIオブジェクトは、生成時にプロパティを指定した場合と生成後に指定した場合で見た目が異なる場合がある?
f:id:haraguai_is_bad:20191122170945p:plain:w500

// 左
var statictext1 = panel1.add("statictext", undefined, undefined, {multiline: true});
// 右
var statictext2 = panel2.add("statictext");
statictext2.multiline = true;

参考