コモノExtendScript100本ノック

超初心者のDTPオペレーターが週にひとつスクリプトを書くブログ

013.【ID】別名同値の段落スタイルがあったらアラート

※未完成

書いたコード

var doc = app.activeDocument;
var temp = doc.allParagraphStyles
var pStyles = doc.allParagraphStyles.splice(2, temp.length - 2, ); // 基本段落と段落スタイルなしを除外
var combinations = [];
var propertiesOfStyle1 = [];
var propertiesOfStyle2 = [];
var alertTxt = "";

// 全段落スタイルから2つ抜き出す組み合わせ配列を作成
var pCombinations = makeCombination(pStyles, 2);

// 各段落スタイルのプロパティ(name以外)を比較
var pCombiLen = pCombinations.length;
for (var i = 0; i < pCombiLen; i++) {
  var result = hasSameProps(pCombinations[i][0], pCombinations[i][1]);
  if (result === true) {
    alertTxt = alertTxt + pCombinations[i][0].name + "と" + pCombinations[i][1].name + "は同一です\n"
  }
}

// 結果表示
if (alertTxt != "") {
  alert(alertTxt)
}

// 2つの対象のプロパティを比較
function hasSameProps(obj1, obj2) {
  // name以外のプロパティを二次元配列として取得
  var obj1Props = getProps(obj1, "name")
  var obj2Props = getProps(obj2, "name")
  var resultCompareProps = isSameArray(obj1Props, obj2Props)
  if (!resultCompareProps) {
    return false;
  } else {
    return true;
  }
}

// 2つの配列の中身を比較
function isSameArray(arr1, arr2) {
  if (Object.prototype.toString.call(arr1) !== "[object Array]") { //ExtendScriptではisArrayが使えない
    return false;
  }
  if (Object.prototype.toString.call(arr2) !== "[object Array]") {
    return false;
  }
  if (arr1.length !== arr2.length) {
    return false;
  }
  for (var i = 0; i < arr1.length; i++) {
    if (Object.prototype.toString.call(arr1[i]) == "[object Array]") {
      var flag = isSameArray(arr1[i], arr2[i]);
    } else {
      if (arr1[i] === arr2[i]) {
        var flag = true;
      } else {
        var flag = false;
        break;
      }
    }
    if (!flag) {
      return false;
      break;
    }
  }
  return true;
}

// プロパティを取得 第二引数で除外するプロパティを指定
// 多分ここがうまくいっていない? 全てのプロパティを取得できていない気がする
function getProps(tgt, unnecessary) {
  var tgtProps = tgt.properties;
  var tgtPropsArr = [];
  for (var i in tgtProps) {
    tgtPropsArr.push([i, tgt[i]]) //ExtendScriptではkeysが使えない
  }
  // 不要な要素を削除
  if (getProps.arguments.length == 2) {
    var tgtPropsArrLen = tgtPropsArr.length; // 256 なのにtgtPropsArrをデータブラウザで見ると19要素しかない
    for (var j = 0; j < tgtPropsArrLen; j++) {
      if (tgtPropsArr[j][0] === unnecessary) {
        delete tgtPropsArr[j]
        break;
      }
    }
    tgtPropsArr = deleteArrElement(tgtPropsArr, undefined);
    return tgtPropsArr;
  }
}

// 配列の要素の組み合わせ全パターンを作成
function makeCombination(tgt, num) { // tgt:取り出し元の配列 num:取り出す数
  var arrs = [];
  var total = tgt.length;
  if (total < num) { // 対象となる配列の要素数より取り出す数が多かったら止める
    return;
  } else if (num === 1) {
    for (var i = 0; i < total; i++) {
      arrs[i] = [tgt[i]]; // 組み合わせ配列の各要素に配列として追加
    }
  } else {
    for (var i = 0; i < total - num + 1; i++) {
      combinations = makeCombination(tgt.slice(i + 1), num - 1); // 残りの要素に対して繰り返す
      for (var j = 0; j < combinations.length; j++) {
        arrs.push([tgt[i]].concat(combinations[j]));
      }
    }
  }
  return arrs;
}

// 配列から指定した要素を削除
function deleteArrElement(arr, element) {
  var arrLen = arr.length;
  for (var i = 0; i < arrLen; i++) {
    if (arr[i] === element) {
      arr.splice(i, 1)
      break;
    }
  }
  return arr;
}

メモ

知ったこと

  • 順列と組み合わせ
    • 順列:異なるn個からr個選んで一列に並べる。順番を考慮する。
    • 組み合わせ:異なるn個からr個選ぶ。順番を考慮しない。
  • ブラケット
    • Obj[a] でオブジェクトのプロパティを定義
    • [a] で配列を定義
  • splice
    配列から要素を削除する(対象の配列をを直接操作する)。
    戻り値は「取り除かれた」要素。
  • 配列
    ExtendScriptで使えるメソッドは
    • Array.prototype.toString ( )
    • Array.prototype.toLocaleString ( )
    • Array.prototype.concat ( [ item1 [ , item2 [ , … ] ] ] )
    • Array.prototype.join (separator)
    • Array.prototype.pop ( )
    • Array.prototype.push ( [ item1 [ , item2 [ , … ] ] ] )
    • Array.prototype.reverse ( )
    • Array.prototype.shift ( )
    • Array.prototype.slice (start, end)
    • Array.prototype.sort (comparefn)
    • Array.prototype.splice (start, deleteCount [ , item1 [ , item2 [ , … ] ] ] )
    • Array.prototype.unshift ( [ item1 [ , item2 [ , … ] ] ] )
  • delete
    delete arr[i] とした場合、arr[i]はトルツメじゃなくトルママ。欠番になる。undefined。

積み残し

未完成。
おそらくgetProps関数がうまくいっていない。
データブラウザ上で確認すると、tgtPropsArrの中身が[19]までしかない。
i=filltint 以降(tgtPropsArr[20]以降)が配列に入ってきていない?
でもtgtPropsArrLenは256となっている。

参考