Sat, February 16, 2008
はじめてのInDesign CS3 JavaScript, テーブルの作成(セルのマージテスト)
前回は、
単純にページにぴったりサイズのテーブルをつくっただけですが、
今回は、セル結合に挑戦します。テーブルを扱うには避けて通れない課題。
mergeメソッドを使え
実際にやってみると・・・というか、 InDesignCS3のコンテンツDVD内に、MergeTableCells.jsxという サンプルが提供されているので、それを見ると結合自体は簡単に 設定できることがわかった。
Cellオブジェクトに merge() というメソッドがあるので、これを使う。
考え方は、(HTMLの colspan,rowspanとは違って)
- 結合したい一連のセルを思い浮かべる
- (a)結合したい一連のセルの一番左または一番上のセルを思い浮かべる
- (b)結合したい一連のセルの一番右または一番下のセルを思い浮かべる
あとは、(a)にあたるセルオブジェクトを取得して(myCellとする) このmergeメソッドを呼び出した後、引数として、(b)を指定する。
これでOK。
上の考え方をコードで表現すると、 次のようになる。
var myFirstRow=myTable.rows.item(0);
var targetCell=myFirstRow.cells.item(0);
var myLastRow=myTable.rows.item(-1);
targetCell.merge (myLastRow.cells.item(0));
この例では、もっとも左の列(column)を縦にぶち抜く形でセル結合しています。
コード myMergeTableCells.jsx
結果はこちら(pdf)。 一列目のセルを全部結合し、 残りの一行目のセルも全部結合する例。
// my merge table cells
init();
function init(){
//
var myDoc=app.documents.add();
var myPage=myDoc.pages.item(0);
var myTextFrame=myPage.textFrames.add();
var myBounds = myGetBounds(myDoc,myPage);
myTextFrame.geometricBounds=myBounds;
// create a table(5x5) object in the textframe
var myTable=myTextFrame.tables.add();
myTable.columnCount = 5;
myTable.bodyRowCount = 5;
// calc table cell size
var gap=1;
var w=myBounds[3]-myBounds[1]-gap;
var h=myBounds[2]-myBounds[0]-gap;
var cellW=w/myTable.columnCount;
var cellH=h/myTable.bodyRowCount;
// set up size to cells
for(var i=0; i<myTable.bodyRowCount; i++){
var myRow=myTable.rows.item(i);
for(var j=0; j<myTable.columnCount; j++){
var myCell=myRow.cells.item(j);
myCell.width=cellW;
myCell.height=cellH;
myCell.contents="hoge ("+i+","+j+")";
}
}
// merge test (1)
{
var myFirstRow=myTable.rows.item(0);
var targetCell=myFirstRow.cells.item(0);
var myLastRow=myTable.rows.item(-1);
targetCell.merge (myLastRow.cells.item(0));
}
// merge test(2)
{
var myFirstRow=myTable.rows.item(0);
var targetCell=myFirstRow.cells.item(1);
targetCell.merge( myFirstRow.cells.item(-1) );
}
}
function myGetBounds(myDoc, myPage){
with(myDoc.documentPreferences){
var myPageHeight = pageHeight;
var myPageWidth = pageWidth;
}
with(myPage.marginPreferences){
var myTop = top;
var myLeft = left;
var myRight = right;
var myBottom = bottom;
}
myRight = myPageWidth - myRight;
myBottom = myPageHeight- myBottom;
return [myTop, myLeft, myBottom, myRight];
}
使い方
InDesign CS3をインストールしたフォルダ以下に、配置します。
./Adobe InDesign CS3/Scripts/Scripts Panel/myMergeTableCells.jsx
あとは、InDesignCS3を起動して、 メニューから[ウインドウ→自動化→スクリプト]でスクリプトウインドウが出てきて、 myMergeTableCells.jsxをリストの一覧から選んでダブルクリックで実行。