InDesign スクリプト 段落スタイルを適用（構造内の選択された要素のページアイテムに）

構造内の選択された要素のページアイテムに段落スタイルを適用するスクリプトは、これで良いのかな・・・？

~~~JavaScript
/*
構造内の選択された要素のページアイテムに段落スタイルを適用する
更新 2021/06/04
*/

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

// スクリプト名
var scriptName = "段落スタイルを適用（構造内の選択された要素のページアイテムに）";

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

    /* ダイアログ処理開始 */
    // ダイアログX座標
    var dialogWidthXCoordinates = 0;

    // ダイアログY座標 
    var dialogWidthYCoordinates = 0;

    // ダイアログ幅
    var dialogWidth = 400;

    // ダイアログ高さ
    var dialogHeight = 110;

    // 段落スタイル選択用ダイアログ作成
    var paragraphStyleSelectWindow = new Window("dialog", scriptName, [dialogWidthXCoordinates, dialogWidthYCoordinates, dialogWidthXCoordinates + dialogWidth, dialogWidthYCoordinates + dialogHeight]);

    // 段落スタイルの名前一覧
    var paragraphStylesNameList = [];

    // 段落スタイルの数だけ繰り返す（[段落スタイルなし]は飛ばす）
    for (i = 0; i < app.activeDocument.paragraphStyles.length - 1; i++) {

        // 段落スタイルを収集
        paragraphStylesNameList.push(app.activeDocument.paragraphStyles[i + 1].name);
    }

    // 段落スタイル選択用ドロップダウンリスト作成
    var paragraphStylesDropdownlist = paragraphStyleSelectWindow.add("dropdownlist", [10, 10, 390, 32], paragraphStylesNameList);

    // 段落スタイル選択用ドロップダウンリストの初期選択
    paragraphStylesDropdownlist.selection = 0;

    // 適用の選択肢
    var applicationChoice = ["を適用", "を適用、オーバーライドを消去", "を適用、文字スタイルを消去", "を適用、すべてを消去", "を適用して次のスタイルへ", "を適用して次のスタイルへ、オーバーライドを消去", "を適用して次のスタイルへ、文字スタイルを消去", "を適用して次のスタイルへ、すべてを消去"];

    // 選択肢用ドロップダウンリスト作成
    var choiceDropdownlist = paragraphStyleSelectWindow.add("dropdownlist", [10, 42, 390, 62], applicationChoice);

    // 選択肢用ドロップダウンリストの初期選択
    choiceDropdownlist.selection = 0;

    // ボタンの幅
    var buttonWidth = 80;

    // ボタンの高さ
    var buttonHeight = 25;

    // ボタンをウィンドウ下部中央に配置
    paragraphStyleSelectWindow.add("button", [(dialogWidth / 2) - 10 - buttonWidth, dialogHeight - 10 - buttonHeight, (dialogWidth / 2) - 10, dialogHeight - 10], "適用", {
        name: "ok"
    });
    paragraphStyleSelectWindow.add("button", [(dialogWidth / 2) + 10, dialogHeight - 10 - buttonHeight, (dialogWidth / 2) + 10 + buttonWidth, dialogHeight - 10], "キャンセル", {
        name: "cancel"
    });

    // ダイアログを画面のセンターに
    paragraphStyleSelectWindow.center();

    // ダイアログを表示
    paragraphStyleSelectWindowShow = paragraphStyleSelectWindow.show();

    // キャンセルの場合
    if (paragraphStyleSelectWindowShow == 2) {

        // スクリプトを終了
        exit();
    }
    /* ダイアログ処理完了 */

    // 適用数
    var applyNumber = 0;

    // 選択の数だけ繰り返す
    for (var i = 0; i < app.activeDocument.selection.length; i++) {

        // 選択が要素の場合
        if (app.activeDocument.selection[i].constructor.name == "XMLElement") {
            
            // ストーリーのコンストラクタ名を取得する関数を使い戻値がストーリーの（Ｘｍｌストーリーの場合はページアイテムがない）場合
            if(getStoryConstructorName(app.activeDocument.selection[i]) == "Story"){

                // 要素の参照にparagraphsプロパティが存在する場合
                if(app.activeDocument.selection[i].xmlContent.hasOwnProperty("paragraphs") == true){

                    /* 段落スタイル適用処理開始 */
                    // 選択段落スタイル
                    var selectParagraphStyle = app.activeDocument.paragraphStyles.item(paragraphStylesDropdownlist.selection.text);

                    // オーバーライドフラグ
                    var overrideFlag = false;

                    // 選択肢用ドロップダウンリストで「オーバーライド」、または、「すべてを消去」が選択されている場合
                    if (choiceDropdownlist.selection.text == applicationChoice[1] || choiceDropdownlist.selection.text == applicationChoice[3] || choiceDropdownlist.selection.text == applicationChoice[5] || choiceDropdownlist.selection.text == applicationChoice[7]) {

                        // オーバーライドフラグ    
                        overrideFlag = true;
                    }

                    // 選択肢用ドロップダウンリストで「を適用」の類語が選択されている場合
                    if (choiceDropdownlist.selection.text == applicationChoice[0] || choiceDropdownlist.selection.text == applicationChoice[1] || choiceDropdownlist.selection.text == applicationChoice[2] || choiceDropdownlist.selection.text == applicationChoice[3]) {

                        // プロパティのappliedParagraphStyleで段落スタイルを設定するとオーバーライドが保持出来ない様なのでメソッドのapplyParagraphStyleで段落スタイルを当てる（everyItem()で全てに）
                        app.activeDocument.selection[i].xmlContent.paragraphs.everyItem().applyParagraphStyle(selectParagraphStyle, overrideFlag);

                    // 上記以外（選択肢用ドロップダウンリストで「を適用して次のスタイルへ」の類語が選択）が選択されている場合
                    } else {

                        // 段落の数だけ繰り返す
                        for (var ii = 0; ii < app.activeDocument.selection[i].xmlContent.paragraphs.length; ii++) {

                            // 次のスタイルが同一スタイルでは無い場合
                            if (selectParagraphStyle != selectParagraphStyle.nextStyle) {

                                // 段落に段落スタイルを適用
                                app.activeDocument.selection[i].xmlContent.paragraphs[ii].applyParagraphStyle(selectParagraphStyle, overrideFlag);

                                // 次のスタイルを設定
                                selectParagraphStyle = selectParagraphStyle.nextStyle;

                            // 次のスタイルが同一スタイルの場合
                            } else {

                                // 現在の段落から最後の段落までの範囲に段落スタイルを適用
                                app.activeDocument.selection[i].xmlContent.paragraphs.itemByRange(ii, -1).applyParagraphStyle(selectParagraphStyle, overrideFlag);

                                // ループを抜ける
                                break;
                            }
                        }
                    }
                    /* 段落スタイル適用処理完了 */

                    /* 文字スタイル消去処理開始 */
                    // 文字スタイル[なし]を適用（プロパティのappliedCharacterStyleやメソッドのapplyCharacterStyleではスタイルとのリンクを切断になるようなのでスタイルの置換を行う）
                    // 選択肢用ドロップダウンリストで「文字スタイルを消去」または「すべてを消去」が選択されている場合
                    if (choiceDropdownlist.selection.text == applicationChoice[2] || choiceDropdownlist.selection.text == applicationChoice[3] || choiceDropdownlist.selection.text == applicationChoice[6] || choiceDropdownlist.selection.text == applicationChoice[7]) {

                        // テキスト検索の初期化
                        app.findTextPreferences = NothingEnum.nothing;

                        // テキスト置換の初期化
                        app.changeTextPreferences = NothingEnum.nothing;

                        // テキスト置換スタイル設定（[なし]）
                        app.changeTextPreferences.appliedCharacterStyle = app.activeDocument.characterStyles[0];

                        // 文字スタイルの数だけ繰り返す（文字スタイル[なし]も含む）
                        for (var ii = 0; ii < app.activeDocument.characterStyles.length; ii++) {

                            // テキスト検索スタイル設定
                            app.findTextPreferences.appliedCharacterStyle = app.activeDocument.characterStyles[ii];

                            // 置換
                            app.activeDocument.selection[i].xmlContent.changeText();
                        }
                    }
                    /* 文字スタイル消去処理完了 */

                    // 適用数追加
                    applyNumber++;
                }
            }
        }
    }

    // テキスト検索の初期化
    app.findTextPreferences = NothingEnum.nothing;

    // テキスト置換の初期化
    app.changeTextPreferences = NothingEnum.nothing;

    // 結果表示
    alert("適用数 " + applyNumber, scriptName);

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

/* ストーリーのコンストラクタ名を取得する関数、引数（オブジェクト）の宣言 */
function getStoryConstructorName(anyObject) {

    // parentStoryプロパティが存在する場合
    if (anyObject.hasOwnProperty("parentStory") == true) {

        // parentStoryがある場合
        if (anyObject.parentStory) {

            // ストーリーのコンストラクタ名を戻す
            return anyObject.parentStory.constructor.name;
        }

    // スプレッドの場合
    } else if (anyObject.constructor.name == "Spread") {

        // 抜ける
        return;
    }

    // オブジェクトの階層を一つ上げて再帰関数
    return getStoryConstructorName(anyObject.parent);
}
/* ストーリーのコンストラクタ名を取得する関数の宣言終了 */
~~~