ごんれのラボ

iOS、Android、Adobe系ソフトの自動化スクリプトのことを書き連ねています。

InDesignでJavaScript その15

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 ; //セルの高さを再設定

}

}

}