Practice makes Perfect !

Practice makes Perfect !

ExtendedScript素人です。同じ境遇の方、一緒に脱素人を目指しましょう!

ChatGPTとどう付き合っていくか

前回の記事でどうしてもわからないところでChatGPTを使ってしまって悔しいみたいなことを書いたけど、その後ChatGPTとどう付き合っていったらいいのかよく分からない。

さんざん調べて、悩んで、それでも分からないからChatGPTに聞いてみるとすぐに答えを出してくれる…

わたしは別にスクリプトを書きまくってるわけではないけど、自分で調べて出来上がったスクリプトがちゃんと動いた時はいつもうれしい。

それは苦労して出来上がったものだからだ。

それがChatGPTを使うことによって瞬時にスクリプトが出来上がってしまうと今までの苦労は何だったのだろうと虚しくなってしまう。

たとえばこの記事。

p-makes-p.hatenablog.com

InDesignで未使用(オブジェクトがなにもない)レイヤーを削除するスクリプトを書きたかったのだが、マスターオブジェクトが存在するレイヤーまで削除されてしまうという課題を残したままだった。

これをChatGPTに一から作成を依頼したら、未使用レイヤーを削除する(ただしマスターオブジェクトが存在するレイヤーは対象外とする)スクリプトがすぐに出来上がってしまった。

// 未使用レイヤーを削除するスクリプト(Undo対応、マスターページのアイテムがあるレイヤーは削除対象外)
(function () {
    // 未使用レイヤーを削除するメイン関数
    function removeUnusedLayers() {
        // アクティブなドキュメントを取得
        var doc = app.activeDocument;

        // ドキュメント内のすべてのレイヤーを取得
        var layers = doc.layers;

        // レイヤーを逆順でループ(削除時に問題が発生しないように)
        for (var i = layers.length - 1; i >= 0; i--) {
            var layer = layers[i];

            // レイヤーが空かどうかを判定(マスターページと通常ページのオブジェクトを確認)
            var isEmptyLayer = true;

            // 通常ページのオブジェクトがあるか確認
            if (layer.allPageItems.length > 0) {
                isEmptyLayer = false;
            }

            // マスターページのオブジェクトがあるか確認
            for (var j = 0; j < doc.masterSpreads.length; j++) {
                var masterSpread = doc.masterSpreads[j];

                // マスターページ内のすべてのアイテムをチェック
                for (var k = 0; k < masterSpread.pageItems.length; k++) {
                    var item = masterSpread.pageItems[k];
                    if (item.itemLayer === layer) {
                        isEmptyLayer = false;
                        break;
                    }
                }

                // マスターページ内で該当レイヤーにアイテムがあれば終了
                if (!isEmptyLayer) break;
            }

            // レイヤーが空の場合のみ削除
            if (isEmptyLayer) {
                layer.remove();
            }
        }

        alert("未使用レイヤーを削除しました");
    }

    // アクションとしてスクリプトを実行(Undoに対応)
    app.doScript(removeUnusedLayers, ScriptLanguage.JAVASCRIPT, undefined, UndoModes.ENTIRE_SCRIPT, "未使用レイヤー削除");
})();


わたしのスキルではChatGPTが出してきたものを見て「なるほど」と思うことが多く、勉強になってしまうことだらけなのだが、スクリプトを得意とされる方たちはChatGPTとどのように付き合っているのだろうか。

ChatGPTとの付き合い方がよく分からないけど、そのうちChatGPTで作ったスクリプトを「こんなのできました!」っていって配布してそうな自分がいそう…(おい)

実験011-3_2024.11-3

ScriptUI Dialog BuilderとChatGPTを使ってみました

前回と前々回で作業中のページサイズの長方形フレームをつくるスクリプトの作成はとりあえず終わりました。
p-makes-p.hatenablog.com

さあこれでnoteの方に記事をまとめるかと思ったのですが、どうせ公開するなら見開き全体にわたる長方形フレームを作成するところまで作ろうじゃないか、と思いました。
note.com

こういうのって「ここまで!」って決めて作らないと後からああしたい、こうしたいっていろいろ欲が出てくるものなのですね…orz

じゃあ見開き全体ってどうやればいいんだ?とあれこれ考えました。

①ダイアログを作成

まずはダイアログを表示してページサイズで作るか、見開きサイズで作るかを選択する。同時に裁ち落としサイズも入力する。

ダイアログについてはこちらで作りました。以前から気になっていて、使ってみたいと思っていました。
scriptui.joonas.me
github.com

なんとデスクトップ版もあるということなので早速ダウンロードして使ってみました。www.dropbox.com

こんな感じで作ったのですが、とにかく簡単で便利でした。

コードはこんな感じになりました。

// DIALOG
// ======
var dialog = new Window("dialog"); 
    dialog.text = "グラフィックフレームを作成"; 
    dialog.preferredSize.width = 187; 
    dialog.orientation = "column"; 
    dialog.alignChildren = ["center","top"]; 
    dialog.spacing = 10; 
    dialog.margins = 16; 

// GROUP1
// ======
var group1 = dialog.add("group", undefined, {name: "group1"}); 
    group1.orientation = "row"; 
    group1.alignChildren = ["left","center"]; 
    group1.spacing = 10; 
    group1.margins = 0; 

var radiobutton1 = group1.add("radiobutton", undefined, undefined, {name: "radiobutton1"}); 
    radiobutton1.text = "ページサイズ"; 
    radiobutton1.value = true; 

var radiobutton2 = group1.add("radiobutton", undefined, undefined, {name: "radiobutton2"}); 
    radiobutton2.text = "見開きサイズ"; 

// GROUP2
// ======
var group2 = dialog.add("group", undefined, {name: "group2"}); 
    group2.orientation = "row"; 
    group2.alignChildren = ["left","center"]; 
    group2.spacing = 10; 
    group2.margins = 0; 

var statictext1 = group2.add("statictext", undefined, undefined, {name: "statictext1"}); 
    statictext1.text = "裁ち落とし(mm): "; 

var edittext1 = group2.add('edittext {properties: {name: "edittext1"}}'); 
    edittext1.text = "0"; 
    edittext1.preferredSize.width = 45; 

// DIALOG
// ======
var ok = dialog.add("button", undefined, undefined, {name: "ok"}); 
    ok.text = "OK"; 
    ok.preferredSize.width = 66; 

②ページサイズで作る方法はわかったけど見開きサイズでつくるにはどうすればよい?

見開きサイズでつくるには右端の座標を2倍すればいいのではと思ってグラフィックフレームの右端の座標に*2としてみたものの、(左開きのドキュメントで)左ページで実行した場合は特に問題はなかったが、右ページで実行すると当然ながら図のような結果に。

そりゃそうですよね…しかも幅が630mm…そりゃそうですよね…

いくら考えても分からなかったところでふと、最近はChatGPTを使ってスクリプトを書く方たちがいることを思い出す。

ChatGPTを使うことは今までゆるく・浅く(ときには深く)・コツコツと勉強してきた身としては、なんとなく自分に負ける気がして嫌だったのですが、みんな使い始めているのならいいのでは?と言ってくる自分もいて…

今更ですが、早速アカウントを作ってChatGPTに作ってもらいました。

(以下のコードは上記の続きです)

// ダイアログを表示
var dialogResult = dialog.show();

// ダイアログがキャンセルで閉じられた場合は処理を中断
if (dialogResult !== 1) {
    exit();  // スクリプトを中断
}

// OKが押された場合の処理
var result = Number(edittext1.text);  // 裁ち落としの入力値
if (isNaN(result) || result < 0 || result > 100) {
    alert("裁ち落とし幅は0?100mmの範囲で入力してください");
} else {
    // ページまたは見開きの選択肢
    var myPage = app.activeWindow.activePage;
    var num = result;  // 裁ち落とし幅
    var useSpread = radiobutton2.value;  // 見開きサイズかページサイズか

    // グラフィックフレームの作成
    MakeFrame(myPage, num, useSpread);
}

// メイン処理
function MakeFrame(myPage, num, useSpread) {
    var matrix;

    if (useSpread) {
        // 見開きサイズの場合
        var spread = myPage.parent;  // myPageが属するSpreadを取得

        // Spread内のページのバウンディングボックスを計算
        var spreadBounds = getSpreadBounds(spread);

        // 見開きのバウンディングボックスを考慮してグラフィックフレームの位置を決定
        matrix = [
            spreadBounds[0] - num,  // 上端
            spreadBounds[1] - num,  // 左端
            spreadBounds[2] + num,  // 下端
            spreadBounds[3] + num   // 右端
        ];
    } else {
        // ページサイズの場合
        matrix = [
            myPage.bounds[0] - num,  // 上端
            myPage.bounds[1] - num,  // 左端
            myPage.bounds[2] + num,  // 下端
            myPage.bounds[3] + num   // 右端
        ];
    }

    // グラフィックフレームの作成
    var rct = myPage.rectangles.add({
        geometricBounds: matrix,
        contentType: ContentType.graphicType
    });

    rct.select();
}

// 見開きのバウンディングボックスを取得する関数
function getSpreadBounds(spread) {
    var minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;

    // Spread内の各ページのバウンディングボックスを取得して最小・最大座標を計算
    for (var i = 0; i < spread.pages.length; i++) {
        var page = spread.pages[i];
        var pageBounds = page.bounds;  // ページのバウンディングボックス

        minX = Math.min(minX, pageBounds[1]);  // 左端
        minY = Math.min(minY, pageBounds[0]);  // 上端
        maxX = Math.max(maxX, pageBounds[3]);  // 右端
        maxY = Math.max(maxY, pageBounds[2]);  // 下端
    }

    // 見開きの左上・右下の座標を返す
    return [minY, minX, maxY, maxX];
}


何度か修正指示を出したものの、作りたかったものが出来上がってビックリ。

特に自分では絶対に分からなかったのはここ↓

// 見開きのバウンディングボックスを取得する関数
function getSpreadBounds(spread) {
    var minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;

    // Spread内の各ページのバウンディングボックスを取得して最小・最大座標を計算
    for (var i = 0; i < spread.pages.length; i++) {
        var page = spread.pages[i];
        var pageBounds = page.bounds;  // ページのバウンディングボックス

        minX = Math.min(minX, pageBounds[1]);  // 左端
        minY = Math.min(minY, pageBounds[0]);  // 上端
        maxX = Math.max(maxX, pageBounds[3]);  // 右端
        maxY = Math.max(maxY, pageBounds[2]);  // 下端
    }

    // 見開きの左上・右下の座標を返す
    return [minY, minX, maxY, maxX];
}


例えば仕上がりサイズA4の巻き三つ折りなんてドキュメントに見開きで作る場合はページを3つ並べるし、観音開きなら4ページにわたる見開きということも考えられますよね。さすがに自分ではここまで考えられませんでした。


ChatGPTを使うことはなんとなく自分に負ける気がして嫌だったのですが、みんな使い始めているのならいいのでは?と言ってくる自分もいて…

ChatGPTを使うことはなんとなく自分に負ける気がして嫌だったのですが…

ChatGPTを使うことは…


今後わからないことは調べる時間を削ってすぐにChatGPTを使ってそうで嫌だなと思います。。。

実験011-2_2024.11-2

基本ができていないと後が大変…

先日の「ページサイズのグラフィックフレームを作るだけのスクリプト」という記事で、わからないことがあったまま記事を上げてしまったのですが、Uske_S (id:uske_S) さんからコメントをいただき解決しました。
p-makes-p.hatenablog.com


いただいたコメントを参照していただければわかるのですが、見返してみると何をやっているんだろうという感じです。
boundsに関しては理解しているつもりでしたし、過去にも座標に関する記事は書いていました。
p-makes-p.hatenablog.com


そもそもメイン処理で座標の変数を宣言するつもりが、なぜ幅や高さを求めるような計算を入れているのだろう…orz

	w = myPage.bounds[3]-myPage.bounds[1];
	h = myPage.bounds[2]-myPage.bounds[0];

いただいた解決策の他にもここをちゃんと座標に設定しておけば解決しました。(wとhの順番もなんだかおかしいので修正)

	h = myPage.bounds[2];
	w = myPage.bounds[3];


またUske_Sさんが書かれた記事を拝見すると、コードがすごくスッキリしていてわかりやすいです。
uske-s.hatenablog.com


というわけで、Uske_Sさんの記事を参考にしたうえでコードを書き換えて無事に動くようになりました。(ほぼ丸パクリですが、さすがに丸パクリはできないので少しだけ変えさせていただいております)

//裁ち落とし幅の入力画面

var result = prompt("裁ち落としは何mmに設定しますか?", "0");

//処理の実行
if(isNaN(result)){
  alert("数値を入力してください");
  }else{
  if(result>100){
    alert("100以上は入力できません");
  }else{
    MakeFrame();
  }
}

//メイン処理
function MakeFrame(){
  var myPage = app.activeWindow.activePage;
  var Num = Number(result);//入力された数値
  var matrix = [
    myPage.bounds[0]-Num,
    myPage.bounds[1]-Num,
    myPage.bounds[2]+Num,
    myPage.bounds[3]+Num,
  ];
  var rct = myPage.rectangles.add(
    {
      geometricBounds: matrix,
      contentType: ContentType.graphicType
    }
  );
  rct.select();
}


1年以上ブログを更新していなかったけど、久々にスクリプトのことをまとめたらとんでもないところで躓いてしまいました。
仕事に空き時間ができたら、ときどきはスクリプトに関して勉強していきたいと思いました。

実験011_2024.11-1

ページサイズのグラフィックフレームを作るだけのスクリプト

noteでDTP関連のことをまとめていたらこちらのブログを全く書かなくなりましたね…。
note.com
noteでスクリプトのことをちょっと書き始めたので、自分が過去に作ったスクリプトでnoteにあげられるものないかなって探してました。
そしたらページサイズのグラフィックフレームをつくるスクリプトってのがあったので、これをnoteにまとめてみよう!…と思ったらちょっと動きがおかしいことに気づきました。

//裁ち落とし幅の入力画面

var result = prompt("裁ち落としは何mmに設定しますか?", "0");

//処理の実行
if(isNaN(result)){
	alert("数値を入力してください");
}else{
	if(result>100){
	alert("100以上は入力できません");
}else{
	MakeFrame();
}
}

//メイン処理
function MakeFrame(){
	var myPage = app.activeWindow.activePage;
	var rct = myPage.rectangles.add();
	var Num = Number(result);//入力された数値
	rct.contentType = ContentType.graphicType;
	y = myPage.bounds[0];
	x = myPage.bounds[1];
	w = myPage.bounds[3]-myPage.bounds[1];
	h = myPage.bounds[2]-myPage.bounds[0];
	yB=y-Num;
	xB=x-Num;
	hB=h+Num;
	wB=w+Num;
	rct.geometricBounds = [yB,xB,hB,wB];
rct.select();
}

これを実行すると、裁ち落としは何ミリに設定するかと聞かれて…

3と入力すればページサイズに四辺各3ミリ足したグラフィックフレームを作ってくれる。

ペラ物でInDesignIllustratorデータを貼るだけの作業にはとても便利。
簡単なスクリプトなので、noteでスクリプト関連の記事を書くための取っ掛かりにしてはこれがいいかなって思ってたんですけど、これ、見開きで使ってみると思い通りにならないんです。

たとえば左開きのドキュメントの左ページでこれを実行するとページサイズできちんと動いてくれます。

だけど左開きのドキュメントの右ページこれを実行すると…

こうなってしまう( ノД`)シクシク…

さらに裁ち落としの数値を0で指定すると「境界線ボックスを設定できなません」とエラー。

こりゃダメだと思って

app.activeWindow.activePage;

これを

app.activeWindow.activeSpread;

にしてみる。

すると

y = myPage.bounds[0];

で引っかかる。


うぅ…

なんだろう、座標の基準位置とかかなと思って、app.activeWindow.activeSpread; を app.activeWindow.activePage; に戻してからこうしてみる。

app.activeDocument.viewPreferences.rulerOrigin = RulerOrigin.PAGE_ORIGIN; 

するとこうなる。

うーん…困った。。。

データ結合で発生するコロン(:)みたいな制御文字を消したい

毎日暑いですね。ブログって書かなくなると面倒になるものですね。立ち上げ当初はブログで稼いでやるぜみたいなことちょっとだけ思ったりしてましたけど笑。このまま何も書かなくなりそうと危惧したので2ヶ月前のTwitter(X)でのやり取りを載せておきたいと思います。

データ結合で発生する制御文字(:)を消したい!!

こんなことをPostしてみたら、ありがたいことにリプをいただいて解決することが出来ました。ご回答いただいた皆様、その節は大変お世話になりました。

データ結合はよく使うけど、制御文字を表示すると出てくるコロンみたいなマークが邪魔で仕方なかったのです。

この邪魔なマークを削除する手順を載せておきます。

①テキスト検索で検索文字列に図のように入力
正規表現では拾えません
置換文字列は空に

②残念ながら①だけでは消えませんでした。それで構造から削除できるというコメントをいただいたので試してみると消せました。
※図のようなアラートがでるので「解除」をクリック

これだけで解決しました。

実はTwitter(X)で投げかけるのはドキドキだったのですが思い切ってPostしてみてよかったです。
ちなみに選択したテキストフレームからのみ、削除したいという場合はタグのフレームから解除をクリックすると消えます。

上記①・②の作業もスクリプトを使えば一発でした。
やっぱりスクリプトって素晴らしい!

app.activeDocument.xmlElements[0].xmlElements.everyItem().untag();

こうやってまとめてみてはいますが、はっきり言って構造とかタグ要素とかXMLとかちゃんと理解してないです
奥が深いなInDesign…( ;∀;)

実験010_2023.4-1

見開きPDFをInDesignを使って単ページにバラすスクリプト

ページ物が見開き(PDF)で入稿された場合の対応

ページもののデータが見開きのPDFで入稿されることがたまにあります。しかし見開きで入稿されてしまうと、中綴じにしろ無線綴じにしろ、面付けできません。勤務先では面付作業は面付ソフトを使いますが、その際は単ページのPDFを使って面付していきます。

面付について簡単に説明すると、例えばA4, 8ページ, 中綴じ, 左開きという仕様で、左右返しで印刷する場合であれば図のような面付になります。

菊判半裁というサイズにはA4が4ページ(両面で8ページ)面付できます。
8ページ・中綴じの面付なのでおもて面は、見開きPDFが使えるのではと思われるかもしれませんが、ページ数が変われば面付も当然変わってきます。うら面の図がわかりやすいと思いますが、見開きのPDFデータとは全然違う面付になります。

なので見開きのPDFで入稿されてしまった場合は「単ページのPDFで再入稿してください」とお願いしているのですが、不思議なことにまれに「単ページで書き出せませんので、なんとか対応できませんか」とか、「それは御社の仕事でしょう」となんとも高飛車なお返事をいただくことがあります。

見積の料金的にそれってどうなんですか、って営業に言っても、作業が進まないから対応してあげて、なんていわれることも多く、仕方なくため息をつきながら対応してます。

では実際どうバラしていくのか。

大まかにいうと、①見開きPDFをInDesignスクリプトで貼っていき、②ドキュメントサイズを仕上がりサイズに変更、③単ページでPDFを書き出すといった流れになります。
※今回のスクリプトは貼り込んだPDF以外のオブジェクトが存在することは想定していません。

1)見開きPDFをInDesignスクリプトで自動貼込

自動でPDFを貼り込んでいくスクリプトは色々あると思うのですが、わたしは「MultiPageImporter」が使い慣れてしまいました。
creativepro.com

仕上がりサイズがA4のものなら見開きのサイズはA3になるので、A3のドキュメントに自動で貼り込みます。


2)各ページの後に空白ページを挿入

後でドキュメントの幅のサイズを半分(見開き)にすることを考慮して各ページの後に空白ページを挿入します。見開きのものを分割するのでページ数は倍にならなければいけません。そのために空白ページを挿入しておくということです。

var doc = app.activeDocument;
var pgObj= doc.pages;
var pgNum1 = pgObj.length;

//1ページ毎に空白ページを挿入
for (var i = 0; i<pgNum1*2; i++){
	var addPage = pgObj[i];
	pgObj.add(LocationOptions.AFTER, addPage);
	i = i+1;
	}

この処理でInDesignのページは図のようになります。

3)ドキュメントの幅を半分に設定
with (doc.documentPreferences){
pageWidth = pageWidth/2;
facingPages = true; //見開き
pageBinding = PageBindingOptions.LEFT_TO_RIGHT; //左開き対応
allowPageShuffle = true; //ドキュメントページの移動を許可
}


4)貼り込んだPDFを正しい位置に移動

ドキュメントの幅が半分に、さらに見開きになって、貼り込んだPDFの位置がちょうどページ幅の半分の位置にくるので、これらを正しい位置に移動させます。

var w = doc.documentPreferences.pageWidth;
var pgNum2 = pgObj.length; //先の処理でドキュメントのページ数が変わったのでpgNum2とする

for (var j = 0; j<pgNum2-1; j++){
	var obj = pgObj[j].pageItems[0];
	obj.move(undefined, [w/-2, 0]); //ページ幅の半分移動
	j = j+1;
	}
5)先頭ページに配置されているPDFを最終ページに複製

先頭ページに配置されている見開きPDFの最終ページにあたる部分(説明が下手ですみません)をコピーしてInDesignドキュメントの最終ページの元の位置にペーストする。

//貼り込んだPDFの最終ページをInDesignドキュメントの最終ページに複製
var win = app.activeWindow;
pgObj[0].pageItems[0].select();
app.copy();
var act = app.menuActions.itemByName("元の位置にペースト");
win.activePage = pgObj[-1];
act.invoke();


6)あとはInDesignから単ページでPDFを書き出して終了です。

ちなみにA3の2つ折り(A4×4ページ)でしたら見開きのまま入稿していただいても問題ありません。というか、そのまま入稿していただいた方がA3を2面というかたちで面付できるので作業が楽になります。

今回のスクリプトは次のようになります。
app.doScript (main, ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT);

function main(){
var doc = app.activeDocument;
var pgObj= doc.pages;
var pgNum1 = pgObj.length;

//1ページ毎に空白ページを挿入
for (var i = 0; i<pgNum1*2; i++){
	var addPage = pgObj[i];
	pgObj.add(LocationOptions.AFTER, addPage);
	i = i+1;
	}

//ドキュメントを半分のサイズの見開きに設定
with (doc.documentPreferences){
pageWidth = pageWidth/2;
facingPages = true; //見開き
pageBinding = PageBindingOptions.LEFT_TO_RIGHT; //左開き対応
allowPageShuffle = true; //ドキュメントページの移動を許可
}

//貼りこんだPDFを正しい位置に移動
var w = doc.documentPreferences.pageWidth;
var pgNum2 = pgObj.length; //先の処理でドキュメントのページ数が変わったのでpgNum2とする

for (var j = 0; j<pgNum2-1; j++){
	var obj = pgObj[j].pageItems[0];
	obj.move(undefined, [w/-2, 0]); 
	j = j+1;
	}

//貼り込んだPDFの最終ページをInDesignドキュメントの最終ページに複製
var win = app.activeWindow;
pgObj[0].pageItems[0].select();
app.copy();
var act = app.menuActions.itemByName("元の位置にペースト");
win.activePage = pgObj[-1];
act.invoke();

}


【課題】
pages と spreadsを間違えると動きが変わってしまい、ちゃんと把握できていないと実感(涙)

実験009_2022.10-1-2

1行に収まっていない段落があるテキストフレームを探し出し、該当する段落を1行に収める

前回は該当するテキストフレームを探し出して黄色で塗りつぶすというところまでまとめました。
今回はその該当テキストフレームの中を覗いていくスクリプトです。

前回のスクリプトはこちら。

var doc = app.activeDocument;
var PG = doc.pages;
for(var i=0; i<PG.length; i++){ //ドキュメント全体で処理
	var TF = PG[i].textFrames;
	for(var j=0; j<TF.length; j++){ //全てのテキストフレームを対象に
		if(TF[j].paragraphs.length !=TF[j].lines.length){
		//対象のテキストフレームの段落数が行数と一致しない時
		// =1行で収まっていない という考え
		TF[j].fillColor="Yellow";
		}
	}
}

上記の

TF[j].fillColor="Yellow";

の部分を変えていきます。
該当するテキストフレームの中で「1段落の長さが1行でないときその段落を選択する」というスクリプトは次の通り。

var HIT = TF[j]; //該当するテキストフレームをHITという変数に代入
var HIT_P = HIT.paragraphs;
for(var k= 0; k<HIT_P.length; k++){
	if(HIT_P[k].lines.length !=1){
	//HIT(テキストフレーム)の中で1段落の長さが1行でないとき
	//その段落を選択する
		HIT_P[k].select();
	}
}


そうすると図のように、該当する段落が選択された状態になります。

あとはこれを長体をかけてくれて1行に収めてくれるスクリプトを書けば、ドキュメント全体で自動で処理してくれます。

まとめのスクリプトはこんな感じです。

var doc = app.activeDocument;
var PG = doc.pages;
for(var i=0; i<PG.length; i++){ //ドキュメント全体で処理
var TF = PG[i].textFrames;
	for(var j=0; j<TF.length; j++){ //全てのテキストフレームを対象に
	if(TF[j].paragraphs.length !=TF[j].lines.length){
		//対象のテキストフレームの段落数が行数と一致しない時
		// =1行で収まっていない という考え
	var HIT = TF[j]; //該当するテキストフレームをHITという変数に代入
	var HIT_P = HIT.paragraphs;
		for(var k= 0; k<HIT_P.length; k++){
		if(HIT_P[k].lines.length !=1){
		//HIT(テキストフレーム)の中で1段落の長さが1行でないとき
		//その段落を選択する
		HIT_P[k].select();
				
		//ここに「選択テキストに長体をかけて1行で収めるスクリプト」を
		//書きます
						
		}
		}
	}
	}
}

「選択テキストに長体をかけて1行で収めるスクリプト」については前回リンク貼っておきましたがここにも貼っておきます。
seuzo.net
sysys.blog.shinobi.jp
せうぞー (id:seuzo) さん、kawamoto_α(あるふぁ(仮)) さん、ありがとうございます。

ちなみに今回紹介したわたしの書いたスクリプト、オーバーセットテキストには非対応でした(´;ω;`)

あとこちらに自分でもまとめてました。
p-makes-p.hatenablog.com