BLOG

InDesignのスクリプト 表のオーバーフロー解消

皆様お久しぶりです。

ただいまとある案件で、InDesign作業を自動化するスクリプトを作っています。
今回スクリプトを作るまでに調べたことを、自分への備忘録として残しておきたいと思います。
※以下のサイトを参考にさせていただきました。
http://d.hatena.ne.jp/ditahack/20101210/1291986460

今回作ったスクリプトは以下のような感じです。
———————————————————————-
エクセルからinDesignに流し込んだ表で、
テキストが収まりきっていないセルがあった場合に、
文字に長体をかけて収まるようにする。

※その他仕様
・指定パーセントずつ小刻みに長体をかけていく。
・何パーセントまで長体をかけるか、下限の指定が可能。
———————————————————————-

スクリプトの使い方としては、
1. あふれを調整したい表またはセルを選択
 ↓
2. スクリプトを実行!
これだけです。

以下ではスクリプトでやりたいこととそのコードを書いていきます。


▼選択されてる表またはセルを取得する

下記コードで現在選択中のオブジェクトを取得できます。
———————————————————————-
var selectObj = app.activeDocument.selection[0]
———————————————————————-

選択したオブジェクトが表またはセルであれば、下記のようにしてセルを取得できます。
———————————————————————-
var cells = selectObj.cells
———————————————————————-

上記cellsには選択オブジェクト内の全てのセルが入ってます。
1つ1つのセルを取得する場合は、ループで回して配列風にアクセスします。
———————————————————————-
for(var i = 0; i < cells.length; i++){ var cellObj = cells[i]; // セル1個 ... } ---------------------------------------------------------------------- ▼セルが文字あふれしてるかどうかの判定 ---------------------------------------------------------------------- if(cellObj.overflows){ ---------------------------------------------------------------------- overflowsプロパティであふれの状況が取得できます。便利ですね。 あふれがなくなるまで処理を繰り返すといった場合は下記のようにします。 ---------------------------------------------------------------------- while(cellObj.overflows == true){ ... } ---------------------------------------------------------------------- ▼セル内の文字に長体をかける ---------------------------------------------------------------------- cellObj.texts[0].horizontalScale - 1; ---------------------------------------------------------------------- 上記は文字の横幅を1%縮めてます。 ちなみに、セル内の文字はcellObj.texts[0]で取れます。 ※縦組みの場合は文字の高さを縮める必要があります。その際はcellObj.texts[0].verticalScaleとします。 これまでの内容をまとめると以下のような形になります。 ---------------------------------------------------------------------- // きざみ値、下限値の設定 var increPercent = 1; // 何パーセントずつ長体かけてくか var limitPercent = 50; // 長体の下限値 // セルの取得 var selectObj = app.activeDocument.selection[0] var cells = selectObj.cells // セル1つ1つをあふれチェックして長体かけてく for(var i = 0; i < cells.length; i++){ var cellObj = cells[i]; var isLimit = false; // 下限まで行ったかどうか while(cellObj.overflows == true){ // あふれてるかどうかの判定 収まるまで以下の処理を繰り返す if(cellObj.texts[0].horizontalScale - increPercent <= limitPercent){ cellObj.texts[0].horizontalScale = limitPercent; isLimit = true; }else{ cellObj.texts[0].horizontalScale -= increPercent; } parentTableObj.recompose(); // 再構築 これやらないとあふれの評価が有効にならない if(isLimit){ break; } } } ---------------------------------------------------------------------- ※ループの中でrecompose()してますが、これをやらないとあふれが解消されたかどうかの判定が正しくできません。 ※選択したセルを取得する前に以下のチェックが必要かと思います。 ・ユーザーがオブジェクトを選択しているか ・ユーザーが選択しているのは間違いなく表またはセルか

Tweet about this on TwitterShare on FacebookShare on Google+