InDesign スクリプト 位置と大きさ（構造の選択された要素のページアイテムの）

構造の選択された要素のページアイテムの位置と大きさのスクリプトは、これで良いのかな・・・？

~~~JavaScript
/*
構造の選択された要素のページアイテムの位置と大きさ
更新 2021/06/09
*/

// アプリ指定
#target "indesign";

// スクリプト名
var scriptName = "位置と大きさ（構造の選択された要素のページアイテムの）";

//スクリプト動作指定（一つのアンドゥ履歴にする及びアンドゥ名の指定）
app.doScript(function () {

    // ダイアログ
    var dialogueFlg = confirm("　構造の選択された要素のページアイテムの位置と大きさをページの左上を原点に最後に選択された要素のページアイテムを基準に指定します。" + "\r\r" + "　テキストフレームにのみ対応。", "", scriptName);

    // Ｎｏの場合
    if (dialogueFlg == false) {

        // スクリプトを終了
        exit();
    }

    // 選択されているオブジェクト
    selectObjects = app.activeDocument.selection;

    // すべての選択を解除
    app.activeDocument.selection = null;

    // 指定数
    var assignedNumber = 0;

    // 選択が0より多い場合
    if(selectObjects.length > 0){

        // 基準のオブジェクトの位置と大きさ
        var baselineObjectGeometricBounds;

        // 基準のオブジェクトのページの位置と大きさ
        var baselineObjectPageBounds;

        // 基準のオブジェクトのフラグにfalseを入れる
        var baselineObjectFlg = false;

        // 最後の選択がXMLElementの場合
        if(selectObjects[selectObjects.length - 1].constructor.name == "XMLElement"){

            // （最後の選択の）XML要素の参照がStoryの場合
            if(selectObjects[selectObjects.length - 1].xmlContent.constructor.name == "Story"){

                // 基準のオブジェクトの位置と大きさに（最後の選択の）XML要素の参照の持つ最初のテキストフレームの位置と大きさを入れる
                baselineObjectGeometricBounds = selectObjects[selectObjects.length - 1].xmlContent.textContainers[0].geometricBounds;

                // （最後の選択のXML要素の参照の）parentPageに値がある場合
                if (selectObjects[selectObjects.length - 1].xmlContent.textContainers[0].parentPage){

                    // 元のオブジェクトのページの位置と大きさに（最後の選択の）XML要素の参照の持つ最初のテキストフレームのあるページの位置と大きさを入れる
                    baselineObjectPageBounds = selectObjects[selectObjects.length - 1].xmlContent.textContainers[0].parentPage.bounds;

                    // 選択に追加
                    selectObjects[selectObjects.length - 1].select(SelectionOptions.addTo);

                    // 基準のオブジェクトのフラグにtrueを入れる
                    baselineObjectFlg = true;
                }

            // 以外の場合
            }else{
                // 画像の場合とか作成予定
            }
        }

        // 基準のオブジェクトのフラグがfalseの場合
        if(baselineObjectFlg == false){

            // 選択状態を元に戻す
            app.activeDocument.selection = selectObjects;

            // 結果表示
            alert("最後に選択された要素のページ（ページアイテム）を取得出来ませんでした。",scriptName);

            // スクリプトを終了
            exit();
        }

        // 選択の数引く１だけ繰り返す
        for(var i = 0; i < selectObjects.length - 1; i++){

            // 選択がXMLElementの場合
            if(selectObjects[i].constructor.name == "XMLElement"){

                // （選択の）XML要素の参照がStoryの場合
                if(selectObjects[i].xmlContent.constructor.name == "Story"){

                    // テキストフレームの数だけ繰り返す
                    for(var ii = 0; ii < selectObjects[i].xmlContent.textContainers.length; ii++){

                        // （選択のXML要素の参照の）parentPageに値がある場合
                        if (selectObjects[i].xmlContent.textContainers[ii].parentPage){

                            // （選択のXML要素の参照の持つ）テキストフレームがロックされていない場合
                            if(selectObjects[i].xmlContent.textContainers[ii].locked == false){

                                // （選択のXML要素の参照の持つ）テキストフレームの位置と大きさに位置と大きさを指定する関数の結果を入れる（配列全体で入れるないとうまくいかない）
                                selectObjects[i].xmlContent.textContainers[ii].geometricBounds = assignBounds(baselineObjectGeometricBounds,baselineObjectPageBounds,selectObjects[i].xmlContent.textContainers[ii].parentPage.bounds)

                                // 指定数追加
                                assignedNumber++;

                                // 選択に追加
                                selectObjects[i].select(SelectionOptions.addTo);
                            }
                        }
                    }

                // 以外の場合
                }else{

                }
            }
        }

        // 結果表示
        alert("指定の元の要素と指定された要素を選択しました。" + "\r" + "指定数 " + assignedNumber,scriptName);
    }

//スクリプト動作指定（一つのアンドゥ履歴にする及びアンドゥ名の指定）の続き
}, ScriptLanguage.JAVASCRIPT, [scriptName], UndoModes.ENTIRE_SCRIPT, scriptName);

/* 位置と大きさを指定する関数、引数（元のオブジェクトの位置と大きさ、元のオブジェクトのページの位置と大きさ、選択オブジェクトのページの位置と大きさ）の宣言*/
function assignBounds(baselineObjectGeometricBounds,baselineObjectPageBounds,selectObjectPageBounds){

    // 指定するオブジェクトの位置と大きさ
    var assignObjectBounds = [0,0,0,0];

    // 指定するオブジェクトの位置と大きさの左上のYに基準のオブジェクトの位置と大きさの左上のY引く基準のオブジェクトのページの位置と大きさの左上のY足す選択オブジェクトのページの位置と大きさの左上のYを入れる
    assignObjectBounds[0] = baselineObjectGeometricBounds[0] - baselineObjectPageBounds[0] + selectObjectPageBounds[0];

    // 指定するオブジェクトの位置と大きさの左上のXに基準のオブジェクトの位置と大きさの左上のX引く基準のオブジェクトのページの位置と大きさの左上のX足す選択オブジェクトのページの位置と大きさの左上のXを入れる
    assignObjectBounds[1] = baselineObjectGeometricBounds[1] - baselineObjectPageBounds[1] + selectObjectPageBounds[1];

    // 指定するオブジェクトの位置と大きさの左上のYに基準のオブジェクトの位置と大きさの左上のY引く基準のオブジェクトのページの位置と大きさの左上のY足す選択オブジェクトのページの位置と大きさの左上のYを入れる
    assignObjectBounds[2] = baselineObjectGeometricBounds[2] - baselineObjectPageBounds[0] + selectObjectPageBounds[0];

    // 指定するオブジェクトの位置と大きさの左上のXに基準のオブジェクトの位置と大きさの左上のX引く基準のオブジェクトのページの位置と大きさの左上のX足す選択オブジェクトのページの位置と大きさの左上のXを入れる
    assignObjectBounds[3] = baselineObjectGeometricBounds[3] - baselineObjectPageBounds[1] + selectObjectPageBounds[1];

    // 指定するオブジェクトの位置と大きさを返す
    return assignObjectBounds;
}
/* 位置と大きさを指定する関数の宣言終了*/
~~~