2014年11月7日金曜日

InDesignスクリプトで選択セル群を扱う際の注意

今日は、InDesign CS3で選択表列群のすべてのセルのすべての段落がセルに収まりかつセル先頭段落が1行になるよう長体をかける汎用スクリプトとか、列幅を広げる汎用スクリプトとかを作った。
もちろん純粋に趣味で作るプログラムなど意味はない。明日からの案件で使うのだ。それこそが僕の趣味である。
注意すべき点として、InDesign文書で複数のセルを選択している時、app.selection.length = 1となる。セル個数ではない。
そしてそのセルが属する表列がほしい時、oCell.parentColumnを直接取ると、それのindexプロパティとかconstructorを得ようとするとなぜかオブジェクトエラーとなることが多い。選択範囲由来のセルオブジェクトないし表列オブジェクトはちょっと何かが不完全らしい。セルのindexは選択範囲内で何番目という値が返されてくる。
セルIDは正しく取れたので、以下のように、上から目線でこのセルでしょというやり方(該当部分抜粋)でうまくいったが、もっとやりようないんですかねこれ…。

  // 選択されている各セルについて
  var oCells = oSelection.cells;
  var nCell = oCells.length;
  var iColumnBefore = -1;
  for (var iCell = 0; iCell < nCell; iCell++){
    var oCell = oCells.item(iCell);
    var qCell = oCell.id;
    var oTable = oCell.parent.parent;
    var oCellTables = oTable.cells;
    var nCellTable = oCellTables.length;
    for (var iCellTable = 0; iCellTable < nCellTable; iCellTable++){
      var oCellTable = oCellTables.item(iCellTable);
      var qCellTable = oCellTable.id;
      if (qCellTable == qCell){
        var oColumn = oCellTable.parentColumn;
        var iColumn = oColumn.index;
        if (iColumnBefore != iColumn){
          // 表列のすべてのセルのすべての段落がセルに収まり
          // かつセル先頭段落が1行になるよう長体をかける
          shrinkInCellsColumn(oColumn);
          iColumnBefore = iColumn;
        }
        break;
      }
    }
  }