:note

表全体幅を維持して選択セル幅を足したり引いたり

InDesignの表組みをいじっていて、全体的な表のサイズを変えずに、セル幅のここを引いて、あそこを足して、って調整したい時用の豆スクリプト。 実行条件は

  • 表またはセルを選択している
  • 選択範囲内に結合セルを含まないこと
  • 1行のみ選択していること
たとえば、100幅のセルを40/60幅に分けたい時、セルを縦に分割して50/50となったところに実行して-10/+10とするとか。(手作業でもガイドを引いてシフトドラッグで大まかにできます。) 選択した4つのセルの両端のセルで増減したいとか。

表全体幅を維持して選択セル幅を足したり引いたり /images/2010/09/750-table_adjust_before.jpg
MasterCellの増減値をSlaveCellで同量面倒みます。 フィールド内では、↑↓カーソル、↑↓カーソル+Shiftキーでも数値の増減できます。

表全体幅を維持して選択セル幅を足したり引いたり /images/2010/09/751-table_adjust_after.jpg

せっかくなので、エラー処理とインターフェイスをつけてみたのですが、今回は久々にInDesignの組み込みDialogオブジェクトを使用。レイアウトを制御しづらいけど、数値を制限したいとき等は、いちいち書くことが省けて何かと便利。

/**
表全体幅を維持して、選択セル幅を足したり引いたり
"increase / decrease cell width with keep table width"
使い方:
表選択範囲の中でマスターとスレイブのセルを設定し増減値を決めて実行。
マスターで足した値を、スレイブで引きます。
実行条件:
表またはセルを選択している
選択範囲内に結合セルを含まないこと
1行のみ選択していること
動作確認:OS10.4.11 InDesign CS3
milligramme
www.milligramme.cc
*/
if(app.documents.length == 0 || app.selection.length == 0){exit();}
  var docObj=app.documents[0];
  var selObj=app.selection[0];
  switch(selObj.constructor.name){
    case "Table":
    case "Cell":
      if(selObj.rows.length == 1){
        dlg(selObj);
      }
      else{
        alert("select only one rows");
      exit();
      }
      break;
    default :// TableとCell以外は無視
      alert("select Tables or Cells");
      break;
  }

function dlg(selObj){
  var cellObj=selObj.cells;
  var Dlg=app.dialogs.add({name:"cell width adjuster", canCancel: true});
  with(Dlg){
    with(dialogColumns.add()){
      with(borderPanels.add()){
        staticTexts.add({staticLabel: "incremental / decremental value "});
        var adjustVal=realEditboxes.add({
          editValue: 0, //増減値の初期値
          largeNudge: 0.5, //シフト押しながらの↑↓カーソルキーでの増減
          smallNudge: 0.1 //↑↓カーソルキーでの増減
          });
      }// with borderpanel 1
      with(borderPanels.add()){
        staticTexts.add({staticLabel:"MasterCell"})
        var masterCell=integerEditboxes.add({
          editValue: 1,
          minimumValu: 1,
          maximumValue: cellObj.length,
          smallNudge: 1
          });
        staticTexts.add({staticLabel:"SlaveCell"})
        var slaveCell=integerEditboxes.add({
          editValue: Math.min(2, cellObj.length),
          minimumValu: 1,
          maximumValue: cellObj.length,
          smallNudge: 1
          });
      }// with borderpanel 2
    }// with dialogcolumn
  }// with Dlg

  if(Dlg.show() == true){
    var val=adjustVal.editValue;
    var master=masterCell.editValue;
    var slave=slaveCell.editValue;
    adjustCellWidth(cellObj, val, master, slave);
    Dlg.destroy();
  }
  else{
    Dlg.destroy();
    exit();
  }
}

function adjustCellWidth(cellObj, val, master, slave){
  //セルが結合してないかチェック
  var mergeChecker=new Array();
  for(var i=0; i < cellObj.length; i++){
    mergeChecker.push(1);
  }
  if(cellObj.everyItem().columnSpan == mergeChecker.toString()){
    //小さくなりすぎた時のための予防
    masterBk=cellObj[master-1].width;
    slaveBk=cellObj[slave-1].width;
    try{
      cellObj[master-1].width+=val;
    }
    catch(e){
      cellObj[master-1].width=masterBk;
      alert("master cell width can not be decreased");
      exit();
    }
    try{
      cellObj[slave-1].width-=val;
    }
    catch(e){
      cellObj[master-1].width=masterBk;
      cellObj[slave-1].width=slaveBk;
      alert("slave cell width can not be decreased");
    }
  }
  else{
    alert("select unmerged cells");
  }
}//function
 
comments powered by Disqus
back to top