表のページごとのセルの数

[9350]表のページごとのセルの数 投稿者:JS 投稿日:2017/11/08 14:08:43
はじめまして。
Indesign CS6で、JavaScriptを使ったスクリプトを勉強しています。
連結されたテキストフレームにまたがって作成した表のページごとのセル数などを表示しようと思っています。
画像の場合だと10×10の表なので「全セル数:70」となるようにしたいのですが、

objDoc = app.activeDocument;
objTF = objDoc.textFrames[0];
objTable = objTxt.tables[0];
cellCnt = objTable.cells.length;
columnCnt = objTable.columns.length;
rowCnt = objTable.rows.length;
alert("全セル数:" + cellCnt);

だと「100」になります。
どこをどう直せばいいでしょうか?
お知恵をおかりできれば幸いです。

attached image
[9352]Re: 表のページごとのセルの数 投稿者:お〜まち 投稿日:2017/11/08 16:52:24
(管理者 様:追記部分が別スレッドになってしまっているので、こっちにつなげることってできないですかね)

あるセルが、どのテキストフレームにあるかをスクリプトから調べることは今のところできないはずです。
(CC2017まで。CC2018はまだ調べてない)
もし間違っていたら、ごめんなさい。

ですので、テキストフレーム中のセルの数を調べることは、スクリプトではできないと思います。プラグインかエクステンションだと可能かも知れません。(使えないので分かりません)
[9354]Re: 表のページごとのセルの数 投稿者:YUJI 投稿日:2017/11/08 16:59:00
お〜まちさん、すいません。
繋げることはできません。
[9355]Re: 表のページごとのセルの数 投稿者:Cymk 投稿日:2017/11/08 17:18:39
スクリプトはほとんど出来ないので見当違いになるかも知れませんが…
プリセットの「SplitStory.jsx」の挙動を使えばいけるかもです。
テキストフレームをコピー→全面にペースト→そのフレーム内のセルを数える→増やしたフレームは処分 みたいな
ストーリーを分離した際にセルもテキスト同様分離されるのはCC2015で検証済みです。
[9356]Re: 表のページごとのセルの数 投稿者:お〜まち 投稿日:2017/11/08 18:35:59
あー、それを使えば行けますね。

//最初のテキストフレーム
var txf0 = app.activeDocument.textFrames[-1];
//最初のテキストフレームを複製(表も分割される)
var txf1 = txf0.duplicate();
//複製したテキストフレーム内のセルを数える
var cellCnt = txf1.tables[0].cells.length;
//複製したテキストフレームを削除する
txf1.remove();
alert("全セル数:" + cellCnt);

です。
[9357]Re: 表のページごとのセルの数 投稿者:JS 投稿日:2017/11/08 22:06:25
管理者さま
追記部分を別スレッドにしてしまって申し訳ございません。
Cymkさま&お〜まちさま
さっそくのアドバイスありがとうございます。

お〜まちさんの
>//最初のテキストフレーム
>var txf0 = app.activeDocument.textFrames[-1];

の[-1]で???となりましたが、
var txf0 = app.activeDocument.textFrames[0];
のしても期待した結果が得られました。
ありがとうございました。

目標としては、連結されたテキストフレームにまたがって作成した表があって、
セルにある段落スタイルの適用された文字列をテキストフレームごとに調べて
その文字列のあるページ数を取得したいと思っています。

アドバイスに従って、複製されたテキストフレーム内のセルを検索し、
マッチすればそのテキストフレームのページ名を取得する感じで
進めていこうと思います。

今回は、本当にありがとうございました。
[9358]Re: 表のページごとのセルの数 投稿者:(z-) 投稿日:2017/11/09 12:42:09
解決済みでしょうか。ちょっと書いて試してみました。
単純にセル内の挿入点の座標が対象テキストフレーム内に収まっているか見ています。
書くのはそんな単純でもないですが…

objDoc = app.activeDocument;
objTF = objDoc.selection[0]; //選択したテキストフレーム
objTable = objTF.parentStory.tables.everyItem(); //ストーリー内のすべての表

cellCnt = 0;
objRow = objTable.rows; //表の"行"コレクション
for ( i = 0; i < objRow.length; i++) { //各行のループ
pepsi = objRow[i].cells[0].insertionPoints[0].baseline; //先頭セルの挿入点ベースライン座標 : Y
fanta = objRow[i].cells[0].insertionPoints[0].horizontalOffset; //先頭セルの挿入点座標 : X
gb = objTF.geometricBounds; //テキストフレームの四辺座標
if (pepsi >= gb[0] && pepsi <= gb[2] && fanta >= gb[1] && fanta <= gb[3] ) { //中に収まっているかみる
cellCnt += objRow[i].cells.length; //足す
}
}
alert ("全セル数:" + cellCnt);

-----------
(ついでに)JSさんの書かれた
objTF = objDoc.textFrames[0];
objTable = objTxt.tables[0];
では、表の始まりのテキストフレーム以外ではエラーが出るはずです。
[9359]Re: 表のページごとのセルの数 投稿者:あるふぁ 投稿日:2017/11/09 13:19:16
セルからそのセルがあるページ数を得るなら
cellObj.texts[0].parentTextFrames[0].parentPage.name
でいけると思います

(z-)さんのやつは連結したテキストフレームが次のスプレッドの同じ位置にあったら意味ないような
[9360]Re: 表のページごとのセルの数 投稿者:Uske_S 投稿日:2017/11/09 15:03:14
あるふぁさんの仰る通り、Cell.texts[0]でもいけますし、Cell.insertionPoints[0]でもいけます。

var a = app.activeDocument;
var f = a.textFrames[0];
var c = f.tables[0].cells;
var r = {};
for (var i=0; i<c.length; i++){
var nom = c[i].insertionPoints[0].parentTextFrames[0].parentPage.name;
(!r[nom])? r[nom]=1: r[nom]++;
}

for (key in r) $.writeln(key+"頁:"+r[key]);
[9361]Re: 表のページごとのセルの数 投稿者:お〜まち 投稿日:2017/11/09 15:12:48
あるふぁさん、Uske_Sさん、ありがとうございます。
そうだったんですね。一旦テキストレベルに入るとparentTextFramesが使えるんですね。
今までCellのプロパティばかりみてました。

#やっぱりおじさんそろそろ現役引退ですわ
[9362]Re: 表のページごとのセルの数 投稿者:JS 投稿日:2017/11/09 16:40:53
(z-)さん、あるふぁさん、Uske_S さん、そしてお〜まちさん、
アドバイスありがとうございます。
ですが、ぼくのスキルを越えた話が進んでいて、
追いついていません。。。
参考にできなくて申し訳ございません。

var doc = app.activeDocument;
var pageObj = doc.pages;
for (i=0; i<=pageObj.length; i++)
{
var txF = doc.textFrames[i];
var txF2 = txF.duplicate();
var cellCnt = txF2.tables[0].cells.length;
txF2.remove();
alert((i+1)+"ページのセル数:" + cellCnt);
}

では、スプレッドだと期待するページ配置の順序と異なるので
今から勉強します。。。ここは自力で乗り切りたいと思っています。
[9363]Re: 表のページごとのセルの数 投稿者:(z-) 投稿日:2017/11/09 17:51:53
あるふぁさんご指摘の通りでした失礼しました。
しかしparentPage.nameだけだとセクション違いの同名ページで騙されますよね(屁理屈w)

cellObj.texts[0].parentTextFrames[0].parentPage.appliedSection.indexも参照するべきでしょうか。

うちもいつかはお〜まちさんに感謝される人になってみたいものですw
[9364]Re: 表のページごとのセルの数 投稿者:お〜まち 投稿日:2017/11/09 19:26:05
あとから読まれる方のためにまとめておきます。

一つはテキストフレームを複製して、その中にあるセルの数を数える方法で、No.9356が、その例文です。

もう一つは、セル一つ一つがどのページにあるかを調べる方法です。目的のテキストフレームと同じページだったらカウントします。これを使う目的は、テキストフレームを複製したくない場合。(連結数が多いとか、下手にドキュメントをいじりたくないとか)
ただし、この場合は前提条件があって、「それぞれのテキストフレームが別のページにある場合」に使えます。1ページの中で複数のテキストフレームを連結している場合では使えません。
この場合のコードはNo.9360なんですが、初心者には難しすぎるので、分かりやすく書き直したものが次のコードです。

//セルの数を入れる変数
var cellCnt = 0;
//セル中のテキストのページ番号を入れる変数
var parentPageName;
var objDoc = app.activeDocument;
var objTF = objDoc.textFrames[0];
//テキストフレームがあるページ番号を変数targetPageNameに入れる
var targetPageName = objTF.parentPage.name;
objTable = objTxt.tables[0];
//セルの数だけ繰り返す
for (var i = 0; i <objTable.cells.length; i++){
parentPageName = objTable.cells[i].texts[0].parentTextFrames[0].parentPage.name;
//セル中のテキストから取得したページ番号と、
//テキストフレームのページ番号が同じ場合にカウントを増やす
if (parentPageName == targetPageName){
cellCnt++
}
}
alert("全セル数:" + cellCnt);

他にも手段があるかも知れませんが、とりあえず、この2つの方法が提示されています。参考にしてください。
[9365]Re: 表のページごとのセルの数 投稿者:お〜まち 投稿日:2017/11/09 19:55:13
連投すみません。
先ほどの「セル一つ一つがどのページにあるかを調べる方法」ですが、
× objTable = objTxt.tables[0];
〇 objTable = objTF.tables[0];
です。

が、テキストフレームに目印をつけておくことで、ページ番号を調べずに済むということに気づきました。その場合、「それぞれのテキストフレームが別のページにある場合」という前提条件が不要ですので、こちらの方がより広く使えるかと思います。

//セルの数を入れる変数
var cellCnt = 0;
//テキストフレームに付けるラベル
var myLabel = "このフレーム";
var objDoc = app.activeDocument;
var objTF = objDoc.textFrames[0];
//現在のラベルを退避する
var oldLabel = objTF.label;
//新しいラベルを付ける
objTF.label = myLabel;
objTable = objTF.tables[0];
//セルの数だけ繰り返す
for (var i = 0; i < objTable.cells.length; i++){
  //セル中のテキストの親のテキストフレームのラベルを取得
  var cLabel = objTable.cells[i].texts[0].parentTextFrames[0].label;
  //cLabelと目的のテキストフレームのラベルを比較して
  //同じだったらカウントする
  if (cLabel == myLabel){
    cellCnt++
  }
}
//テキストフレームのラベルを元に戻す
objTF.label = oldLabel;
alert("全セル数:" + cellCnt);

ラベルとはスクリプトラベルのことです。
この記事の書き込み元へのリンク (コメントや質問などはこちらへどうぞ)