検索結果を同名の変数にするスクリプトはこれで良いのかな・・・?
/*
更新 2021/6/22
*/
// アプリ指定
#target "indesign";
// スクリプト名
var scriptName = "検索結果を同名の変数に";
//スクリプト動作指定(一つのアンドゥ履歴にする、及び、アンドゥ名の指定)
app.doScript(function () {
// ダイアログ
var dialogueFlg = confirm("「検索と置換」の正規表現の設定で検索して検索結果とカスタムテキスト変数の名前が一致する場合に変数に置換します。"
+ "\r\r" + "選択がない場合はアクティブドキュメント全体で置換、選択がある場合は選択内で置換します。 ", "", scriptName);
// Noの場合
if (dialogueFlg == false) {
// スクリプトを終了
exit();
}
// 正規表現の検索プロパティのフラグ
var findGrepPreferencesPropertyFlg = false;
// 正規表現の検索のプロパティ名の数だけ変数に入れて繰り返す
for(var findGrepPreferencesProperty in app.findGrepPreferences.properties){
// 正規表現の検索のプロパティ名が「parent」、「bulletChar」、「numberingRestartPolicies」では無い場合
if(findGrepPreferencesProperty != "parent" && findGrepPreferencesProperty != "bulletChar" && findGrepPreferencesProperty != "numberingRestartPolicies"){
// 正規表現の検索のプロパティの内容が「NothingEnum.NOTHING」、「」、「null」ではない場合
if(app.findGrepPreferences[findGrepPreferencesProperty] != NothingEnum.NOTHING && app.findGrepPreferences[findGrepPreferencesProperty] != "" && app.findGrepPreferences[findGrepPreferencesProperty] != null){
// 正規表現の検索プロパティのフラグにtrueを入れる
findGrepPreferencesPropertyFlg = true;
// 繰り返しを抜ける
break;
}
}
}
// 正規表現の検索プロパティのフラグがfalseの場合
if(findGrepPreferencesPropertyFlg == false){
// 警告
alert("「検索と置換」の正規表現の検索に値がありません");
// スクリプトを終了
exit();
}
// 置換数
var replaceNumber = 0;
// 選択がない場合
if(app.activeDocument.selection.length == 0){
// テキスト変数挿入
replaceNumber += insertTextVariableInstanceBySearch(app.activeDocument);
// 以外の場合
}else{
// 選択の数だけ繰り返す
for (var i = 0; i < app.activeDocument.selection.length; i++){
// オブジェクトのメソッドにfindGrepがある場合
if (typeof(app.activeDocument.selection[i].findGrep) == "function"){
// テキスト変数挿入
replaceNumber += insertTextVariableInstanceBySearch(app.activeDocument.selection[i]);
}
}
}
// 結果の文
var resultText;
// 選択がない場合
if(app.activeDocument.selection.length == 0){
// 入れる
resultText = "アクティブドキュメント全体で置換をおこないました。";
// 以外の場合
}else{
// 入れる
resultText = "選択内で置換をおこないました。";
}
// 結果を表示
alert(resultText + "\r\r" + "置換数 " + replaceNumber, scriptName);
//スクリプト動作指定(一つのアンドゥ履歴にする及びアンドゥ名の指定)の続き
}, ScriptLanguage.JAVASCRIPT, [scriptName], UndoModes.ENTIRE_SCRIPT, scriptName);
/* テキスト変数挿入関数、引数(検索対象)の宣言 */
function insertTextVariableInstanceBySearch(searchTarget){
// 検索結果の配列
var searchResultArray = searchTarget.findGrep();
// 検索結果の範囲
var searchResultRange;
// 置換数
var replaceNumber = 0;
// 逆順に検索結果の数だけ繰り返す
for(i = searchResultArray.length - 1; i >= 0; i--){
// 検索結果の名前のテキスト変数が存在する場合
if(app.activeDocument.textVariables.itemByName(searchResultArray[i].contents).isValid == true){
// 検索結果の範囲を入れる
searchResultRange = searchResultArray[i].characters.itemByRange(0,-1);
// テキスト変数を挿入
searchResultArray[i].insertionPoints.lastItem().textVariableInstances.add().associatedTextVariable = app.activeDocument.textVariables.itemByName(searchResultArray[i].contents);
// 検索結果を削除
searchResultRange.remove();
// 数を増やす
replaceNumber++;
}
}
// 置換数を戻す
return replaceNumber;
}