top

結合セルのある表組の扱い。

by buruge ~ 5月 15th, 2008. Filed under: InDesignCS3+javascript.

今までスクリプトで表組を扱う際、結合セルに悩まされておりました。
bodyRowCountとcolumnCountで、最初に表の行と列の数を求め、その値を終了条件にしてfor文を書いてからセル総当たりのオーバーフローチェックを行わせたり等をしていたのです。
その時に問題になるのが結合セルで、結合することで単純にその行なり列なりのセルの数が減るんですね。
そうなると当然終了条件に行き着く前に、列が終了してしまうので、そこでエラーが頻発するわけです。

半年前の自分はそこで「わけわかんねー!ちゃんと取得してるんだからいーじゃんかあーもおーーーーー!」とかなんとか嘆いてほったらかしにしていたのですが、今日ちょっと以前書いたスクリプトをいろいろ整理する機会があったんで試しに触ってみました。

alertで列番号とか内容とかを表示させまくる荒い調べ方をしてようやく分かったんですが(もっと速い方法があるような気がする…)1行1行の列数に関しては、結合したら列数を減らし、分割したら増やしてきちんと数を把握していてくれているということです。まあ当然か。

だから、ループの終了条件を最初に取得する全体から求めた行と列の数ではなくて、1行ならその1行ごとの列数をループの度に取得してそれを終了条件にしてあげればいいだけの話でした。

なので、表全体の行を左から右へ片っ端から参照していく場合

sel = app.activeDocument.selection;
for(i=0;i<sel[0].tables[0].bodyRowCount;i++){//行は全体の数を取得するとしても
for (j=0; j<sel[0].tables[0].rows[i].cells.length; j++){//列はその都度取得する
alert(sel[0].tables[0].rows[i].cells[j].contents);
}
}

こういう風に書いてやればよかったわけです。
分かってみれば、わりと簡単なことだなぁ…。

せっかくなので、今後の自分用にどういう風にセルが認識されているのかちょっとまとめてみました。
rowsで指定する場合のセルの値。

rows.jpg

columnsで指定する場合のセルの値。

columns.jpg

えらい分かりづらいですよね…。
まとめながらだんだんこんがらがって来たんですが、これで合ってると思います。
rowsで指定した場合、rows[i].cells[j]のiに上の表(rows、columns)の数値が入り、jに下の表(cells)の数値が入るということです。
rows、columnsのいずれの値も結合するとえらく場所が飛ぶのに対して、cellsの方は当然と言えば当然ですが、わりと素直にセルの順番をなぞってくれています。

この値を元にして以下の表から「M」「P」「R」を指定する場合。

cells.jpg

こんな書き方をすればいいんだな、と。
行を取得するときに必ずrowを使わないといけないとかじゃなくて、表によってはcolumnsのcellsで取得する方が正確に場所を把握できる時もある。
分かった上で、他所のみなさんの表組の扱いとかの書き込みとかを見てると「ああ、そういうことだったのかー」って納得してしまった。
これじゃあ順番が逆だよなあ…。

Leave a Reply