変数の追加と変更をおこなうスクリプトは、これで良いのかな・・・?
/*
更新 2021/06/20
*/
// アプリ指定
#target "indesign";
// スクリプト名
var scriptName = "変数の追加と変更";
//スクリプトの動作指定(一つのアンドゥ履歴にする、及び、アンドゥ名)
app.doScript(function () {
// 分割文字(タブは\t)
var splitCharacter = "\t"
// 分割文字名
var splitCharacterName;
// \tの場合
if(splitCharacter == "\t"){
// タブを入れる
splitCharacterName = "タブ";
// 半角スペースの場合
}else if(splitCharacter == " "){
// 半角スペースを入れる
splitCharacterName = "半角スペース";
// 全角スペースの場合
}else if(splitCharacter == " "){
// 全角スペースを入れる
splitCharacterName = "全角スペース";
// 以外の場合
}else{
// 分割文字を入れる
splitCharacterName = splitCharacter;
}
// ダイアログ
var dialogueFlg = confirm(splitCharacterName + "で区切られた文章でカスタムテキスト変数の追加とテキストが違う場合に変更をおこないます。"
+ "\r\r" + "テキストフレーム等を選択して実行して下さい。"
+ "\r\r" + "変数名" + splitCharacter + "テキスト"
+ "\r" + "の順に記述して下さい。"
+ "\r\r" + "例"
+ "\r" + "1" + splitCharacter + "こはく"
+ "\r" + "2" + splitCharacter + "ぼんた"
+ "\r" + "3" + splitCharacter + "くろい"
,"", scriptName);
// Noの場合
if (dialogueFlg == false) {
// 終了
exit();
}
// 対象のストーリー
var targetStory;
// 対象の段落
var targetParagraphs = []
// テキスト変数の名前
var variablesName;
// テキスト変数の内容
var variablesContents;
// 追加されたテキスト変数
var addedTextVariables;
// 分割されたテキスト
var splitText;
// 追加されたテキスト変数の数
var addedTextVariablesNumber = 0;
// 変更されたテキスト変数の数
var changeTextVariablesNumber = 0;
// 選択がある場合
if(app.activeDocument.selection.length > 0){
// 選択オブジェクトのストーリーを入れる
targetStory = getStory(app.activeDocument.selection[0]);
// ストーリーを段落で分割
targetParagraphs = targetStory.contents.split("\r")
// 段落の数だけ繰り返す
for(var i = 0; i < targetParagraphs.length; i++){
// 段落の内容を特定の文字で分割する
splitText = targetParagraphs[i].split(splitCharacter);
// 配列の数が二つ以上ある場合
if(splitText.length >= 2){
// テキストが無い場合
if(splitText[0] == ""){
// 次の繰り返しへ
continue;
}else{
// 一つ目を入れる
variablesName = splitText[0];
}
// 二つ目を入れる
variablesContents = splitText[1];
// テキスト変数が存在する場合
if(app.activeDocument.textVariables.itemByName(variablesName).isValid == true){
// カスタムテキスト変数の場合
if(app.activeDocument.textVariables.itemByName(variablesName).variableType == VariableTypes.CUSTOM_TEXT_TYPE){
// 内容が違う場合
if(app.activeDocument.textVariables.itemByName(variablesName).variableOptions.contents != variablesContents){
// テキスト変数を追加(特定の文字のチェック対策)
addedTextVariables = app.activeDocument.textVariables.add();
// 変数のタイプの指定
addedTextVariables.variableType = VariableTypes.CUSTOM_TEXT_TYPE;
// 内容
addedTextVariables.variableOptions.contents = variablesContents;
// 内容が違う場合
if(app.activeDocument.textVariables.itemByName(variablesName).variableOptions.contents != addedTextVariables.variableOptions.contents){
// 内容を変更
app.activeDocument.textVariables.itemByName(variablesName).variableOptions.contents = variablesContents;
// 数を増やす
changeTextVariablesNumber++;
}
// 削除
addedTextVariables.remove();
}
}
// 以外の場合
}else{
// テキスト変数を追加
addedTextVariables = app.activeDocument.textVariables.add();
// エラー処理
try{
// 名前
addedTextVariables.name = variablesName;
// エラーの場合
}catch(e){
// 削除
addedTextVariables.remove();
// 次の繰り返しへ
continue;
}
// 変数のタイプの指定
addedTextVariables.variableType = VariableTypes.CUSTOM_TEXT_TYPE;
// 内容
addedTextVariables.variableOptions.contents = variablesContents;
// 数を増やす
addedTextVariablesNumber++;
}
}
}
}
// 結果を表示
alert("変換元の段落数 " + targetParagraphs.length + "\r\r" + "追加数 " + addedTextVariablesNumber + "\r" + "変更数 " + changeTextVariablesNumber, scriptName);
//スクリプトの動作指定の続き
}, ScriptLanguage.JAVASCRIPT, [scriptName], UndoModes.ENTIRE_SCRIPT, scriptName);
/* ストーリーを取得する関数、引数(オブジェクト)の宣言 */
function getStory(anyObject) {
// parentStoryプロパティが存在する場合
if (anyObject.hasOwnProperty("parentStory") == true) {
// エラー処理
try{
// parentStoryの値がある場合
if (anyObject.parentStory) {
// コンストラクタ名を戻す
return anyObject.parentStory;
}
// エラーの場合
}catch(e){
// 抜ける
return;
}
// Applicationの場合
} else if (anyObject.constructor.name == "Application") {
// 抜ける
return;
}
// オブジェクトの階層を一つ上げて再帰関数
return getStoryConstructorName(anyObject.parent);
}
/* ストーリーを取得する関数の宣言終了 */