終了

連結テキストフレーム中の表組のページごとの最終行を取得

参加者 ,
Apr 23, 2025 Apr 23, 2025

スクリプトを使用して連結テキストフレーム中の表組の

ページごとの最終行を取得したいのですが、可能でしょうか?

キーワード
スクリプティング
380
翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines

correct answers 1 件の正解

Community Expert , Apr 23, 2025 Apr 23, 2025

>表組のページごとの最終行

 

これは、表がページをまたぐ場合がある、ということですよね。

横組み限定、テキストフレームのド派手な回転は不可、というフツウの状況であれば

・var ary = []; // 結果入れる用の配列
・対象ストーリーを変数に(a)
・a.insertionPoints[0].parentTextFrames[0].documentOffset を変数に(b)
・var c = -100; // 比較用Y座標の初期値
・a.tablesでループ(i)
 ・tables[i].rowsでループ(j)
  ・a.tables[i].rows[j].cells[0].insertionPoints[0] を変数に(d)
  ・d.parentTextFrames[0].parentPage.documentOffset を変数に(e)
  ・if(e != b {
        b = e; // ページ番号を更新
        c = -100; // Y座標比較用変数をリセット
     } else {
       if(d.baseline > c) {
...
翻訳
Community Expert ,
Apr 23, 2025 Apr 23, 2025

>表組のページごとの最終行

 

これは、表がページをまたぐ場合がある、ということですよね。

横組み限定、テキストフレームのド派手な回転は不可、というフツウの状況であれば

・var ary = []; // 結果入れる用の配列
・対象ストーリーを変数に(a)
・a.insertionPoints[0].parentTextFrames[0].documentOffset を変数に(b)
・var c = -100; // 比較用Y座標の初期値
・a.tablesでループ(i)
 ・tables[i].rowsでループ(j)
  ・a.tables[i].rows[j].cells[0].insertionPoints[0] を変数に(d)
  ・d.parentTextFrames[0].parentPage.documentOffset を変数に(e)
  ・if(e != b {
        b = e; // ページ番号を更新
        c = -100; // Y座標比較用変数をリセット
     } else {
       if(d.baseline > c) {
             ary[e] = a.tables[i].rows[j]; // 配列の e 番目として行を格納
             c = d.baseline; // Y座標比較用変数を更新
        }
  } // j
} // i

…みたいな感じでどうでしょう。

(回答を、書ける人向けにしておきました)

各行の先頭セルの先頭挿入点のベースラインでY座標を比較していく、という内容です。

意地悪なベースラインシフトでも仕込まれてない限りはいけると思うのですが。

 

コードが完成したらぜひシェアしてくださいっ

翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
参加者 ,
Apr 23, 2025 Apr 23, 2025

ありがとうございます。

とりあえず↓の様な形で目的は果たせました。

 

var doc = app.activeDocument;
var sel=doc.selection[0];

setLine(sel);

function setLine(obj){
var tbl = obj.tables[0];
var rLen = tbl.rows.length;
var cLen = tbl.columnCount;

for (var r=0; r<rLen; r++){
var row =tbl.rows[r];
var tx = row.cells[0].texts[0];
var tf = tx.parent.parent.parent;
var pp = tf.parentPage.documentOffset;
var bl = tx.baseline;
if (r+1<rLen){
var row2 =tbl.rows[r+1];
var tx2 = row2.cells[0].texts[0];
var tf2 = tx2.parent.parent.parent;
var pp2 = tf2.parentPage.documentOffset;
var bl2 = tx2.baseline;
if (dist(bl,bl2)>200){
var theRow = row;
row.bottomEdgeStrokeWeight = 1;
}else{
row.bottomEdgeStrokeWeight = 0.5;
}
}else{
row.bottomEdgeStrokeWeight = 1;
}
}
}

function dist(a,b){
return Math.abs(a-b);
}
翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
メンター ,
Apr 23, 2025 Apr 23, 2025

可能です。言語の指定がないのでコードを提示せず、言葉だけで説明します。

 

まず、対象の表のセル中のテキストを取得します。連結されたセルがなければ、行単位でループしていけばいいのですが、連結されたセルがあるとちょっと厄介ですね。

テキストを取得出来たら、そのテキストから親のテキストフレームを取得することができます。また、テキストの座標位置も取得できます。

親のテキストフレームを取得したら、その親のページを取得することができます。

仮に行単位でループしていた場合は親のページが変わったところが切れ目になります。

今回はページの最終行ということなので、表の最後から逆順に回してページを取得していき、ページが変わった行があればそれがそのページの最終行と判断できます。

翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Apr 23, 2025 Apr 23, 2025

あああそうだ、ループ中に親ページ取得だけで済むんでした(おれはばかだ)。

翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
参加者 ,
Apr 23, 2025 Apr 23, 2025

親ページの方法を最初試していたのですが、うまくできずに質問しました。

上記スクリプトのpp、pp2がずっと最初のページしか示さないです。

何か間違っているのでしょうか?

INDD2024です。

翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Apr 23, 2025 Apr 23, 2025

横から失礼して…

Text.parent.parent.parent が原因ですね。

Text → Cell → Table → TextFrame となるのですが、この場合は連結された先頭のテキストフレームが返るんです。

Text.parentTextFrames[0] とすれば、そのセル内テキストが入っているテキストフレームを取得できます。

翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
参加者 ,
Apr 23, 2025 Apr 23, 2025
最新

parentTextFramesの戻り値は違うんですね。ありがとうございます。

以下に修正しました。

 

var doc = app.activeDocument;
var sel=doc.selection[0];

setLine(sel);

function setLine(obj){
var tbl = obj.tables[0];
var rLen = tbl.rows.length;
var cLen = tbl.columnCount;

for (var r=0; r<rLen; r++){
var row =tbl.rows[r];
var tx = row.cells[0].texts[0];
var tf = tx.parentTextFrames[0];
var pp = tf.parentPage.documentOffset;
if (r+1<rLen){
var row2 =tbl.rows[r+1];
var tx2 = row2.cells[0].texts[0];
var tf2 = tx2.parentTextFrames[0];
var pp2 = tf2.parentPage.documentOffset;
if (pp!=pp2){
row.bottomEdgeStrokeWeight = 1;
}else{
row.bottomEdgeStrokeWeight = 0.5;
}
}else{
row.bottomEdgeStrokeWeight = 1;
}
}
}

function dist(a,b){
return Math.abs(a-b);
}
翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines