コモノExtendScript100本ノック

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

030.【ID】フォルダ内の全inddのプリフライト結果を書き出す

書いたコード

var folderObj = Folder.selectDialog("フォルダを選択してください");
var myFiles = folderObj.getFiles("*.indd");
var myResultsTxt = "";
var errTxt = "";
var errCnt = 0;
var errPath = folderObj.fsName + "/プリフライトエラー.txt";

for (var i = 0; i < myFiles.length; i++) {
  app.open(myFiles[i]);
  var myDoc = app.activeDocument;
  var preflightName = myDoc.preflightOptions.preflightWorkingProfile;
  var myProfile = myDoc.preflightProfiles.item(preflightName);
  if (preflightName === "[基本]") {
    var myProfile = app.preflightProfiles.firstItem(); 
  }

  var myProcess = app.preflightProcesses.add(myDoc, myProfile);
  myProcess.waitForProcess();
  var myResults = myProcess.processResults;
  if (myResults !== "None\r\n") {
    var myResultsArr = myProcess.aggregatedResults;
    for (var j = 0; j < myResultsArr[2].length; j++) {
      if (myResultsArr[2][j][0] === 3) {
        myResultsTxt = myResultsTxt + myResultsArr[2][j][3] + "\n該当箇所: " + myResultsArr[2][j][1] + "\nページ: " + myResultsArr[2][j][2] +"\n\n";
      }
    }
    errCnt = errCnt + 1;
    errTxt = errTxt + "【" + myDoc.name + "】\n" + myResultsTxt + "\n----------------\n\n";
  }
  myProcess.remove();
  myDoc.close();
}

if (errCnt > 0) {
  var errObj = new File(errPath);
  errObj.open("w");
  errObj.write(errTxt);
  errObj.close();
  alert(errCnt + "ファイルでエラーが見つかりました。");
} else {
  alert("大丈夫だ、問題ない。");
}

メモ

こんな感じで出力される。

【00全体06 - コピー.indd】
問題: リンクされたファイルが見つかりません。
修復: リンクパネルで、「再リンク」ボタンを使用してリンクされたファイルを検索します。
該当箇所: ほにゃほにゃ.psd
ページ: 4

問題: フォントに元のファイルで指定された字形がありません。
修復: 字形を含むフォントを適用するか、または書式/字形を選択して適用されたフォントで同様の字形を検索します。
該当箇所: <unassigned-1F338> (UID : 1f338)
ページ: 5

躓いたところ

  • [基本]プロファイルは名前参照できない?
  • プリフライトチェックOKのときのprocessResultsの値は"None"ではなく"None\r\n"

積み残し

  • リンク切れがあった際のアラートを無視する(下記参考記事)
  • 読みづらいコードだとは思うんだが、どこをどうするべきなのか今一つピンときていない気がする。
    (どこを関数化するべきなのか、何を変数に格納するべきなのか、どんな変数名にするべきなのか、どう分岐させるのが望ましいか等々)→リーダブルコード読み直す?

参考