セル内のオーバーフローを解消するスクリプト

[1784]セル内のオーバーフローを解消するスクリプト | 投稿者:あか | 投稿日:2008/09/22(Mon) 20:40:07
いつも拝見させていただいています。

MacOSX(10.4)InDesignCS3でjavaScriptを勉強中なのですが、つまづいてしまったので、ご教授願います。

選択したセルがあふれていた場合、長体をかけてセル内に収める(複数段落があれば最後の段落のみに長体)というスクリプトを考えています。
以下のようにしてみたのですが、

sel = app.activeDocument.selection[0];
for (var i = 0; i < sel.cells.length; i++) {
 var txtObj = sel.cells[i];
 var danraku = txtObj.paragraphs.length-1;
 for (var w=100; w >= 10; w--){
  if (!txtObj.overflows) break;
   txtObj.paragraphs[danraku].horizontalScale = w;
 }
}

これだと、オーバーフローが解消しても10%まで長体かけられます。何が悪いのか、さっぱり分かりません。
どなたかご指摘をよろしくお願いします。
» 1
これ、たとえば一番最後の行に
eval ("app.activeDocument.selection[0].cells[0].overflows;");
などと強制的に再評価してもtrueが返ります。内部的に再描画されていない感じ。
一般的なtextFrameに関しては、問題ないようです。

ほぼ同じことをAppleScriptでやらせると
tell application "Adobe InDesign CS3"
   tell document 1
       repeat with i in every cell of selection
           set w to horizontal scale of paragraph -1 of i
           repeat while overflows of i
               set w to w - 1
               if w < 10 then exit repeat
               set horizontal scale of paragraph -1 of i to w
           end repeat
       end repeat
   end tell
end tell

これは正しく動くようです。
したがって、JavaScriptのバグっぽいと思うんですがいかがでしょうか?

ちなみに、AppleScriptではfourさんの「OverFlowsCanceller(テキストのオーバーフローを解消)」があります。
http://psychocat.net/scriptNote/files/article.php?id=1
» 2
あ、overflowsを評価する前に
txtObj.recompose();
を挿入するとうまくいきました。

var sel = app.activeDocument.selection[0];
for (var i = 0; i < sel.cells.length; i++) {
   var txtObj = sel.cells[i];
   var danraku = txtObj.paragraphs[-1];
   for (var w=danraku.horizontalScale; w >= 10; w--){
       txtObj.recompose();
       if (txtObj.overflows == false) {break}
       danraku.horizontalScale = w;
   }    
}
» 3
[1787]Re: セル内のオーバーフローを解消するスクリプト | 投稿者:あか | 投稿日:2008/09/23(Tue) 14:34:24
せうぞーさんありがとうございます。
何でtrue繰り返すのかなって思ってましたが、バグっぽいんですね…早速試してみます。
fourさんの「OverFlowsCanceller」は使ってみたんですが、今自分がしたいことにはしっくりこなかったので、自分で作ることにしたんですよ。AppleScript今のところよくわからないですし…
今後いろいろ勉強していきます。またつまづいた時には、ご教授お願いします。
» 4
Windowsでも同様ですね。
同様のことをVBScriptでやると

Set sel = app.ActiveDocument.selection(1)
For i = 1 To sel.cells.Count
 Set txtObj = sel.cells(i)
 danraku = txtObj.paragraphs.Count
 For w = 100 To 10 Step -1
  If txtObj.overflows = False Then Exit For
  txtObj.paragraphs(danraku).horizontalScale = w
 Next
Next

オーバーフローを返してくれますが、JavaScriptでは正しく返してくれませんね。

#この間たまたまセルのオーバーフローを調べるルーチンを含んだスクリプトを書いてたんですが、VBScriptでした。
JavaScriptだったら私が質問してました。ありがとうございました。
この記事の書き込み元へのリンク (コメントや質問などはこちらへどうぞ)

このページをシェア