InDesignでJavaScript その15。
とあるお仕事で表組の流しかえをするために作ったJavaScript。
作成するにあたりバイカモさんのTableReplaceモドキを加筆修正させていただいた。
感謝感謝。
仕様としては
●InDesignCS2でhyoというラベルのついたテキストフレームの中に表組を入れ込んで、台紙を作成
想定するイメージは、テキストフレームのコラムは2。行数は毎度変わって列は23列固定。
見出しは1列と2列を結合、残りはぶち抜きで入り右端の罫はなし。高さは通常セルの約1.25倍
●流し込みたいテキストをタブ区切り形式で準備する(改行コードはLF)。
見出しの行は左端1列のみ文字が入り、あとはタブのみ
●見出しの行は結合セルで作成
●文字が長くて複数行になる場合は勝手に高さを延ばす(行送り指定必須)
●表組がテキストフレームからオーバーフローした場合、収まるまで行の高さを調整
オーバーフロー処理で結構時間をくってしまうけど、ほぼ完成した形になるので、後が楽。
そんな感じ。
/*
★表組ながしちゃおう.jsx★
☆ver.1.0☆
Copyright [偽善者こうちゃん]
[2007.07.13] {
ver.1.0作成
}
とあるお仕事で表組の流しかえをするために作ったJavaScript。
作成するにあたりバイカモさんのTableReplaceモドキを加筆修正させていただいた。
感謝感謝。
自分用に作ったのでサンプルとして使わないほうが…。
なお、このJavaScriptを使用して損害をこうむっても
私は知りませんので、あしからず。
偽善者こうちゃん
http://macneko.blog77.fc2.com/
*/
var filename = File.openDialog("テキストファイルを指定してください");
var CR = String.fromCharCode(13); //改行
var LF = String.fromCharCode(10); //改行
var TAB = String.fromCharCode(9); //タブ
var TBL = String.fromCharCode(0x16); //表組
//テキストを一気に読み込むついでに行数も数えておく
var regObj = new RegExp(LF,"g"); //正規表現で目的の文字を探す
var fileObj = new File(filename);
var flag = fileObj.open("r") ; //ファイルを読み込みモードで開く
if (flag == true) {
var lineAll = fileObj.read() ; //ファイル内容を一度に読み込む
var LFCount = lineAll.match(regObj) ;
//見出しも含めた行の数
var hyoBodyRowCount = LFCount.length + 1; //LFの数を数える(最終行に改行がないため+1する)
}
fileObj.close();
var tableHight = 241; //表組の入っているテキストフレームの高さ
var tableHightMAX = tableHight * 2; //連結している場合は*2とかする
var cellHeight = tableHight / Math.ceil(hyoBodyRowCount / 2) ;
//メイン処理へ
busu() ;
//メイン処理(バイカモさんのtablereplaceモドキをリライト。感謝)
function busu() {
//作業するドキュメントなどを変数に代入
var docObj = app.activeDocument;
var myPage = app.activeDocument.pages[0];
/*
//アイテムのオーバーライド処理
var myObjects = myPage.masterPageItems
for (h = 0 ; h < myObjects.length ; h ++) {
if (myObjects[h].label != "") { //ラベルがついてなかったら
//アイテムをオーバーライドする
myObjects[h].override(myPage);
}
}
*/
//流し込み処理開始
//表組を選択
myPage.pageItems.item("hyo").select() ;
var hyogumiFrame = app.selection[0] ;
hyogumiFrame.tables[0].select() ;
var tblObj = app.selection[0] ;
tblObj.bodyRowCount = hyoBodyRowCount; //表組の行数を決める
var clipAry = new Array();
with (txtfrmObj = docObj.textFrames.add()){
visibleBounds = ["0cm","0cm","30cm","21cm"];
contents = lineAll;
while (characters[-1].contents == LF) characters[-1].remove(); //最後の改行を削除
var clipstr = "" + contents;
}
if (clipstr == TBL){
clipAry = txtfrmObj.tables[0].contents;
} else if (clipstr != ""){
var tmparray = clipstr.split(LF);
for (var i=0; i < tmparray.length; i++) clipAry = clipAry.concat(tmparray[i].split(TAB));
}
txtfrmObj.remove();
if (tblObj.cells.length == clipAry.length){
try {
tblObj.contents = clipAry;
tblObj.height = tableHightMAX ;
}
catch(e) {
alert("表組への貼付けに失敗しました。");
}
}
//見出し処理
myPage.pageItems.item("hyo").select() ;
var hyogumiFrame = app.selection[0] ;
hyogumiFrame.tables[0].select() ;
var tblObj = app.selection[0] ;
for (i = 0 ; i < tblObj.bodyRowCount ; i ++) {
tblObj.rows[i].cells[1].select()
var selCell = app.selection[0] ;
if (selCell.contents == "") {
selCell.merge(tblObj.rows[i].cells[0]) ; //セルを結合
var selCell2 = app.selection[0] ;
selCell2.fillColor = docObj.swatches.item("黒") ; //塗りを黒に
selCell2.insertionPoints[0].appliedParagraphStyle = "04-社名・業種/見出し" //スタイル適用
selCell2.height = selCell2.height * 1.25
}
}
//見出しの横の空白セルの処理
for (i = 0 ; i < tblObj.bodyRowCount ; i ++) {
tblObj.rows[i].cells[1].select()
var selCell = app.selection[0] ;
var t = 0 ; //結合する列のカウント用
if (selCell.contents == "") {
selCell.merge(tblObj.rows[i].cells[21]) ; //セルを結合(複数セルの結合はラストのセルを指定すればよい)
tblObj.rows[i].cells[1].select()
var selCell3 = app.selection[0] ;
selCell3.rightEdgeStrokeWeight = 0 ; //罫をナシに
}
}
//オーバーフロー処理(複数行処理、とも言える)
for (i = 0 ; i < tblObj.cells.length ; i ++) {
var myCell = tblObj.cells[i] ;
if (myCell.overflows) {
var myCellLength = myCell.lines.length ; //行数を数える(linesは単純に行を表す)
myCell.height = myCell.height + (3 * (myCellLength - 1)) ; //行数に応じてセルの高さを増やす
}
}
//見出しやオーバーフロー対策によってあふれた表組の高さを再度設定する
if (hyogumiFrame.overflows) {
var amariHeight = tblObj.height - tableHightMAX ; //溢れている分の高さを算出
var hikuHieght = amariHeight / hyoBodyRowCount ; //1つのセルから引く数値を算出
var hikuHieght = Math.ceil(hikuHieght * 100) ; //Math.ceil()で切り上げるため一旦100をかけて整数化
var hikuHieght = hikuHieght / 100 ; //上記で算出した数値を100で割って元に戻す
for (i = 0 ; i < tblObj.rows.length ; i ++) {
var myRow = tblObj.rows[i] ;
myRow.height = myRow.height - hikuHieght ; //セルの高さを再設定
}
}
//さらに溢れていたら収まるまで0.005引いていく
while (hyogumiFrame.overflows) {
for (i = 0 ; i < tblObj.rows.length ; i ++) {
var myRow = tblObj.rows[i] ;
myRow.height = myRow.height - 0.005 ; //セルの高さを再設定
}
}
}