とあるDTPオペレーターのInDesignスクリプト備忘録

デザイナー上がりですがいまはDTP命。InDesign用スクリプトの解説などを綴っています。読者登録して戴けると励みになります。

InDesignドキュメント上の文字情報と、テキストデータの情報の比較

InDesignドキュメント上の情報と、テキストデータの内容の比較(たとえばチラシ上のすべての商品名が間違っていないかを、元データと比べっこ)して答え合わせをするスクリプトを書いてみました。
チェックする点数が多いほど、スクリプトを使うメリットがあるかも。
スクリプト歴1年の人間の書いたものなので、無駄があるのはご愛嬌。

処理としては、
 1 紙面上のすべての品名を配列に格納
 2 元データ(タブ区切りテキスト)を配列に格納
を用意し、1の中身が2の中にも存在するかをループで調べていく。仮に1の品名に誤字脱字があれば、2に存在しない品名としてアラートが出る。
アラートではなく、ログを吐き出させる処理でもいいかもしれない。

var myDoc = app.activeDocument;
var myFrame = myDoc.allPageItems;//グループ化されている可能性を考慮してall~で処理
var nameArray = [];//紙面上の品名を格納する配列
var ristArray = [];//元データの情報を格納する配列

    app.findGrepPreferences.findWhat = "\\r"; //紙面上の品名に改行があればいったん取ってしまう
    app.findGrepPreferences.appliedParagraphStyle.name == "品名の段落スタイル"
    app.changeGrepPreferences.changeTo = ""
    myDoc.changeGrep ();


for (var i=0; i<myFrame.length; i++) 
    {
        if (myFrame[i].constructor.name === "TextFrame") { //アイテムがTextFrameなら処理する 
            if (myFrame[i].parentStory.appliedParagraphStyle.name == "品名の段落スタイル") { //条件分で品名だけを処理。段落スタイルを条件にしてみた
        {
     nameArray.push (myFrame[i].contents); //格納にプッシュ
    }}}}


/////ここからはテキストデータを配列に入れていく処理
var TAB = String.fromCharCode(9); // タブコード
var fileObj = new File(File.openDialog("原稿(タブ区切りテキスト)を指定してください"));
var flag = fileObj.open("r");//読み専用
     if (flag)
      {
         var pageObj = app.activeDocument;
         count = 0;
         while(!fileObj.eof)
      {
        text = fileObj.readln(); // 1行読み込む
        ristArray = text.split(TAB); // タブコードで分割
     }}

var myList = ristArray.join ("/");//ristArrayの中身を全角スラッシュ区切りで連結

for (var k=0; k<nameArray.length; k++) {
        if (myList.indexOf (nameArray[k]) == -1) {//indexOfでリスト内に品名があるか探していく
               alert ("『" + nameArray[k] +"』 は点検リスト内に見つかりませんでした") // 見つからなければアラートを出す   
        }
}

実際には再帰処理の中に組み込んで、複数のInDesignドキュメントをまとめてチェックしています。
(改行を取る処理をしているので、saveOptionはNOで)
私の仕事では、色々使い途がありそうなスクリプトです。