InDesign JavaScript XML 要素を追加

要素を追加するスクリプトは、これで良いのかな・・・？

~~~JavaScript
/*
このスクリプトを利用して起こった不具合の責任は取れません。
ご了承下さい。

更新 2022/06/15
*/

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

// スクリプト名
var scriptName = "要素を追加";

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

    // ダイアログ
    var dialogueFlg = confirm("選択された要素を基準にして要素を追加します。"
    , "", scriptName);

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

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

    // ここから--------------------------------------------------
    // 設定ダイアログ 
    var dialog = new Window("dialog");
    dialog.text = scriptName;
    dialog.orientation = "column";
    dialog.alignChildren = ["left","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;

    group1.add("statictext", undefined, undefined).text = "選択された要素の";
    
    // 要素移動位置指定配列
    var locationOptionsArray = [LocationOptions.BEFORE, LocationOptions.AFTER, LocationOptions.AT_BEGINNING, LocationOptions.AT_END];
    
    var dropdown_position = group1.add("dropdownlist", undefined, undefined, {items: ["前","後","初め","終わり"]});
    dropdown_position.selection = 0;
    
    group1.add("statictext", undefined, undefined).text = "に";


    // タグを取得してドロップダウンリストを追加
    var dropdown_Tag = group1.add("dropdownlist", undefined, undefined, {items: app.activeDocument.xmlTags.everyItem().name});
    dropdown_Tag.selection = 0;
    
    group1.add("statictext", undefined, undefined).text = "要素を追加";
    group1.add("statictext", undefined, undefined, {multiline: true}).text = "（ExtendScriptのメソッドの仕様で、前に追加する場合は前にある要素の直ぐ後ろに、後ろに追加する場合は、選択されている要素の直ぐ後ろに追加されます）";

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

    var checkbox1 = group2.add("checkbox", undefined, undefined);
    checkbox1.text = "制御文字の追加"
    checkbox1.value = true;
    
    group2.add("statictext", undefined, undefined).text = "追加された要素の";

    // 要素に文字追加位置指定配列
    var xmlElementPositionArray = [XMLElementPosition.BEFORE_ELEMENT, XMLElementPosition.AFTER_ELEMENT, XMLElementPosition.ELEMENT_START, XMLElementPosition.ELEMENT_END];
    
    var dropdown_position2 = group2.add("dropdownlist", undefined, undefined, {items: ["前","後","初め","終わり"]});
    dropdown_position2.selection = 0;
    
    group2.add("statictext", undefined, undefined).text = "に";

    var dropdown_specialCharacter = group2.add("dropdownlist", undefined, undefined, {items: ["段落の終わり", "強制改行", "改フレーム", "右インデントタブ"]});
    dropdown_specialCharacter.selection = 0;
    
    group2.add("statictext", undefined, undefined).text = "を追加";
    group2.add("statictext", undefined, undefined, {multiline: true}).text = "（ExtendScriptのメソッドの仕様で、元々制御文字が有る場合は新たに追加されない場合が有ります）";
    
    // GROUP3
    var group3 = dialog.add("group", undefined);
    group3.preferredSize.width = 700;
    group3.orientation = "row";
    group3.alignChildren = ["center","center"];
    group3.spacing = 30;
    group3.margins = 0;

    var button1 = group3.add("button", undefined, undefined);
    button1.text = "OK";

    var button2 = group3.add("button", undefined, undefined);
    button2.text = "Cancel";

    var buttonResult = dialog.show();
    // ここまで--------------------------------------------------
    
    // Cancelの場合
    if(buttonResult == 2){

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

    // 回数
    var numberOfTimes = 0;

    // 対象
    var targetObject;
    
    // 特殊文字指定配列
    var specialCharacterArray = ["\r", SpecialCharacters.FORCED_LINE_BREAK, SpecialCharacters.FRAME_BREAK, SpecialCharacters.RIGHT_INDENT_TAB];

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

        // 選択がXML要素の場合
        if(app.activeDocument.selection[i].constructor.name == "XMLElement"){
 
            // 親がXML要素の場合
            if(app.activeDocument.selection[i].parent.constructor.name == "XMLElement"){
                
                // 要素を追加
                targetObject = app.activeDocument.selection[i].parent.xmlElements.add(app.activeDocument.xmlTags.itemByName(dropdown_Tag.selection.text));

                // 移動（戻値を入れなおす事）
                targetObject = targetObject.move(locationOptionsArray[dropdown_position.selection.index], app.activeDocument.selection[i]);
                
                // チェックボックスのフラグがtrueの場合
                if(checkbox1.value == true){
                    
                    // 改行等を追加
                    targetObject.insertTextAsContent(specialCharacterArray[dropdown_specialCharacter.selection.index], xmlElementPositionArray[dropdown_position2.selection.index]);
                }

                // 回数を増やす
                numberOfTimes++;
            }
        }
    }

    // 結果表示
    alert("追加数 " + numberOfTimes, scriptName);

// スクリプトの動作指定の続き
}, ScriptLanguage.JAVASCRIPT, [scriptName], UndoModes.ENTIRE_SCRIPT, scriptName);
~~~