InDesign: オーバーフローした表セルに長体をかけるJavaScript

DITAでは食べていけず、仕事ではInDesignを使っています。「両極端だなぁ」と、自分でも思っています。
プリプレスの世界も作業の効率化は避けて通れない課題です。幸いにも、InDesignにはJavaScriptによる自動化の機能が備わっています。退屈なDTP作業の合間に、使えそうなJavaScriptを書いて楽しんでおります。

ここから本題。
Excelで入力した名簿などのデータをInDesignに配置することがしばしばあります。この作業で面倒なのが、表セルに収まりきらずにオーバーセットになるテキストが出ること。これを解決する手段は2つあります(これ以外にもあるかも!?)。
(1)InDesign CS4以降なら、正規表現スタイルを利用する
   参考:市川せうぞーさんの記事 文字数によって自動的に長体をかける
(2)JavaScriptを使ってオーバーセットのテキストに長体をかける

CS4以降が使えるのなら(1)の方法がお奨めですが、使えない場合はスクリプトに頼るしかありません。

というわけで、オーバーフローした表セルに長体をかけるJavaScriptを書いてみました。

【 動作確認 】Windows7 x64, InDesign CS4/CS3

// オーバーフローした表セル内のテキストが、セル内に収まるように長体をかけるスクリプト
//
// 2010.12.8 Rev01
//
// [使い方]
// 1) 処理対象の表全体、列、行、あるいはセルを選択する
// 2) 本スクリプトを実行する
// 3) 長体の限度(%)を入力するダイアログボックスが表示されるので、整数値を入力する(例: 60)
//
// [補足]
// 指定した限度まで長体をかけてもテキストがセル内に収まらなかった場合は、テキストが赤字になる
//

// グローバル変数の宣言
var limitPercent; // 長体率の限度
var ColorRed;     // 赤色

//
// 選択されているオブジェクトを確認する
//
if (app.documents.length == 0) {
  alert("文書が開かれていません");
  exit();
} else if (app.activeDocument.selection.length == 0) {
  alert("何も選択されていません");
  exit();
} else {
  var selObj = app.activeDocument.selection[0];
  // alert(selObj.constructor.name);
  if ((selObj.constructor.name == "Table") || (selObj.constructor.name == "Cell")) {
    adjustCellTextScale(selObj.cells);    // 表またはセルが選択されている場合
  } else {
    alert("表以外のオブジェクトが選択されています");
    exit();
  }
}

//
// すべての選択セルについて、オーバーセットが解消されか、長体率の限度に達するまで長体をかける関数
//
function adjustCellTextScale(cells) {
  defineVariables();  // 長体率の限度と色の設定を行う
  var parentTableObj = cells[0].parent;
  for (var i_cell = 0; i_cell < cells.length; i_cell++) {
    var cellObj = cells[i_cell];
    while (cellObj.overflows == true) {
      if (cellObj.writingDirection==HorizontalOrVertical.HORIZONTAL) {
        // セル内のテキストが横組みの場合
        cellObj.texts[0].horizontalScale--;    // 文字の横幅を1%縮める
        parentTableObj.recompose();            // 表を再構成する
        if (cellObj.texts[0].horizontalScale < limitPercent) {
          // 長体率の限度を超えたら、文字を赤にして、ループを抜ける
          for (var i_char=0; i_char < cellObj.characters.length; i_char++) {
            cellObj.characters[i_char].fillColor = ColorRed;
          }
          break;
        }
      } else if (cellObj.writingDirection == HorizontalOrVertical.VERTICAL) {
        // セル内のテキストが縦組みの場合
        cellObj.texts[0].verticalScale--;      // 文字の高さを1%縮める
        parentTableObj.recompose();            // 表を再構成する
        if (cellObj.texts[0].verticalScale < limitPercent) {
          // 長体率の限度を超えたら、文字を赤にして、ループを抜ける
          for (var i_char=0; i_char < cellObj.characters.length; i_char++) {
            cellObj.characters[i_char].fillColor = ColorRed;
          }
          break;
        }
      } else {
        alert("セル内テキストの組み方向が判別できません");
        return;
      }
    }
  }
}

//
// 長体率の限度の入力と色の定義を行う関数
//
function defineVariables() {
  limitPercent = parseInt(prompt("長体をかける限度(%)", 60));

  // 赤色の定義
  ColorRed = app.activeDocument.colors.item("C=15 M=100 Y=100 K=0");
  if (ColorRed == null) {
    var C = 15;    // シアン
    var M = 100;   // マゼンタ
    var Y = 100;   // イエロー
    var K = 0;     // ブラック
    var colorOption = {colorValue:[C,M,Y,K],model:ColorModel.process,space:ColorSpace.cmyk,name:"C=15 M=100 Y=100 K=0"}
    ColorRed = app.activeDocument.colors.add(colorOption);
  }
}

【 参考にしたページ 】
InDesign_オーバーフロー解除スクリプトたちを修正
InDesign JavaScript(ExtendScript)

【 免 責 】
上記スクリプトの使用により発生する、データの破損などのあらゆる不具合・不利益については、一切の責任を負いかねますのでご了解ください。