コモノExtendScript100本ノック

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

003.【ID】選択したクエリ一括起動

書いたコード

#targetengine "doQueries"
var myDoc = app.activeDocument;
var myAllQuery = [];
var myAllQueryNames = [];
var myAllQueryMode = [];
var myQueryFolder = new Folder(Folder.userData + "/Adobe/InDesign/Version " + getVersion() + "-J/ja_JP/Find-Change Queries");
var myQueryFolderTst = new Folder("C:/Users/prepress.JPC/AppData/Roaming/Adobe/InDesign/Version 8.0-J/ja_JP/Find-Change Queries");
var myFolderList = myQueryFolder.getFiles();
var myFolderListLen = myFolderList.length;
for (var i = 0; i < myFolderListLen; i++) {
  createQueryList(myFolderList[i]);
}
var myDlg = new Window("palette", "クエリ一括起動");
var myAllQueryLen = myAllQueryNames.length;
//~ var findRanges = ["ドキュメント","ストーリー"] 
var searchModes = ["Text", "Grep"]
for (var k = 0; k < myAllQueryLen; k++) {
  var main = myDlg.add("group {alignChildren: 'left', orientation: 'row'}");
  var listBox1 = main.add("dropdownlist", undefined, myAllQueryNames);
  var listBox2 = main.add("dropdownlist", undefined, searchModes);
  //~ var listBox3 = main.add ("dropdownlist", undefined, findRanges); 
}
var start = myDlg.add("button", undefined, "実行");
start.onClick = function () {
  myDlg.close();
  for (var m = 0; m < myAllQueryLen; m++) {
    if (myDlg.children[m].children[0].selection == null) {
      return;
    } else {
      var slctQ = myDlg.children[m].children[0].selection.text;
      //~                     var indx = myAllQueryNames.indexOf(slctQ); // ExtendScriptではindexOfが使えない…
      //~                     var slctQMode = myAllQueryMode[indx]
      var slctQMode = myDlg.children[m].children[1].selection.text;
      $.writeln(slctQMode.toUpperCase())
      eval("app.loadFindChangeQuery('" + slctQ + "',SearchModes." + slctQMode.toUpperCase() + "_SEARCH)");
      eval("myDoc.change" + slctQMode + "();")
    }
  }
    app.findGrepPreferences=NothingEnum.NOTHING
    app.changeGrepPreferences=NothingEnum.NOTHING
    app.findGrepPreferences.findWhat=""
    app.changeGrepPreferences.changeTo=""
    app.findTextPreferences=NothingEnum.NOTHING
    app.changeTextPreferences=NothingEnum.NOTHING
    app.findTextPreferences.findWhat=""
    app.changeTextPreferences.changeTo=""
}
myDlg.show();

function getVersion() {
  var version = parseFloat(app.version).toFixed(1);
  if (version !== 7.5) {
    var version = Math.floor(version) + ".0"
  }
  return version;
}

function createQueryList(tgtFolder) {
  var myFileList = tgtFolder.getFiles();
  var myFileListLen = myFileList.length;
  if (myFileListLen > 0) {
    for (var j = 0; j < myFileListLen; j++) {
      getQueryInfo(myFileList[j]);
    }
  }
}

function getQueryInfo(tgtFile) {
  var queryName = File.decode(tgtFile.name)
  var myQuery = {
    name: queryName.replace(/\.xml/, ""),
    mode: tgtFile.parent.name
  };
  myAllQueryNames.push(myQuery.name);
  myAllQueryMode.push(myQuery.mode);
}

メモ

クエリxmlに保存されている内容

  • 検索文字列
  • 置換文字列
  • 検索形式
  • 置換形式
  • ロックされたレイヤーを含める
  • ロックされたストーリーを含める
  • 非表示のレイヤーを含める
  • マスターページを含める
  • 脚注を含める
  • カナを区別
  • 全半角を区別

検索範囲は含まれない。

用語

モーダルダイアログ:ダイアログを閉じるまで該当アプリケーションを操作できない。 モーダレスダイアログ:ダイアログが表示されていても該当アプリケーションを操作できる。

ひっかかったところ

  • ListBoxはwin10で機能しない
  • 配列操作のメソッドの多くはExtendScriptで使えない 悲しみ

積み残し

  • 検索範囲の指定
  • 検索オプションの指定
  • 大分まだるっこしい手順をとってしまった気がする

参考