コモノExtendScript100本ノック

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

064.【Id】未使用のスタイル・レイヤー・スウォッチ一括削除

※未完成です

挙動

以下の順番で削除する。
・未使用のレイヤー
・未使用の文字スタイル・文字スタイルグループ
・未使用の段落スタイル・段落スタイルグループ
・未使用のオブジェクトスタイル・オブジェクトスタイルグループ
・未使用のセルスタイル・セルスタイルグループ
・未使用の表スタイル・表スタイルグループ
・未使用のスウォッチ・カラーグループ

コード

var doc = app.activeDocument;

//レイヤー
app.menus.item("レイヤーパネルメニュー").menuItems.item("未使用レイヤーを削除").associatedMenuAction.invoke();

//文字スタイル
var chrStyles = doc.allCharacterStyles;
var chrStylesLen = chrStyles.length;
for (var i = chrStylesLen - 1; i >= 0; i--) {
    if (!isUsedChrStyle(chrStyles[i])) {
        chrStyles[i].remove();
    }
}
//文字スタイルグループ
arrangeChrStyleGrp(doc);

//段落スタイル
var pStyles = doc.allParagraphStyles;
var pStylesLen = pStyles.length;
for (var i = pStylesLen - 1; i >= 0; i--) {
    if (!isUsedParaStyle(pStyles[i])) {
        pStyles[i].remove();
    }
}
//段落スタイルグループ
arrangeParaStyleGrp(doc);


//オブジェクトスタイル
var objStyles = doc.allObjectStyles;
var objStylesLen = objStyles.length;
for (var i = objStylesLen - 1; i >= 0; i--) {
    if (!isUsedObjStyle(objStyles[i])) {
        objStyles[i].remove();
    }
}
//オブジェクトスタイルグループ
arrangeObjStyleGrp(doc);

//セルスタイル
var cllStyles = doc.allCellStyles;
var cllStylesLen = cllStyles.length;
for (var i = cllStylesLen - 1; i >= 0; i--) {
    if (!isUsedCellStyle(cllStyles[i])) {
        cllStyles[i].remove();
    }
}
//セルスタイルグループ
arrangeCellStyleGrp(doc);

//表スタイル
var tblStyles = doc.allTableStyles;
var tblStylesLen = tblStyles.length;
for (var i = tblStylesLen - 1; i >= 0; i--) {
    if (!isUsedTableStyle(tblStyles[i])) {
        tblStyles[i].remove();
    }
}
//表スタイルグループ
arrangeTableStyleGrp(doc);

//スウォッチ
app.menus.item("スウォッチパネルのコンテキストメニュー").menuItems.item("未使用をすべて選択").associatedMenuAction.invoke();
app.menus.item("スウォッチパネルのコンテキストメニュー").menuItems.item("スウォッチを削除...").associatedMenuAction.invoke();
//カラーグループ
var clrGrp = doc.colorGroups;
var clrGrpLen = clrGrp.count();
for (var i = clrGrpLen - 1; i >= 0; i--) {
    if (clrGrp[i].colorGroupSwatches.count()===0) {
        clrGrp[i].remove();
    }
}



//以下関数
//文字スタイル
function isUsedChrStyle(chrStyle) {
    var chrStyles = doc.allCharacterStyles;
    var chrStylesLen = chrStyles.length;
    var isUsed = false; //不使用かつ基準でない
    app.findTextPreferences = app.changeTextPreferences = NothingEnum.NOTHING;
    app.findTextPreferences.appliedCharacterStyle = chrStyle;
    var result = doc.findText();
    if (result.length > 0) {
        isUsed = true; //使用している
    } else {
        for (var cc = 2; cc < chrStylesLen; cc++) { //[なし][基本段落]はスキップ
            if (chrStyles[cc].basedOn === chrStyle) {
                isUsed = true; //不使用だが基準になっている
                break;
            }
        }
    }
    app.findTextPreferences = app.changeTextPreferences = NothingEnum.NOTHING;
    return isUsed;
}

//文字スタイルグループ
function arrangeChrStyleGrp(tgt/*document*/){
  var chrStylesGrp = tgt.characterStyleGroups;
  for (var i = chrStylesGrp.length - 1; i >= 0; i--) {
    if (chrStylesGrp[i].characterStyleGroups.length > 0){
      arrangeChrStyleGrp(chrStylesGrp[i]);
      } else if (chrStylesGrp[i].characterStyles.length ===0){
        chrStylesGrp[i].remove();
        }
    }
  }

//段落スタイル
function isUsedParaStyle(paraStyle) {
    var pStyles = doc.allParagraphStyles;
    var pStylesLen = pStyles.length;
    var isUsed = false; //不使用かつ基準でない
    app.findTextPreferences = app.changeTextPreferences = NothingEnum.NOTHING;
    app.findTextPreferences.appliedParagraphStyle = paraStyle;
    var result = doc.findText();
    if (result.length > 0) {
        isUsed = true; //使用している
    } else {
        for (var pp = 2; pp < pStylesLen; pp++) { //[なし][基本段落]はスキップ
            if (pStyles[pp].basedOn === paraStyle) {
                isUsed = true; //不使用だが基準になっている
                break;
            }
        }
    }
    app.findTextPreferences = app.changeTextPreferences = NothingEnum.NOTHING;
    return isUsed;
}

//段落スタイルグループ
function arrangeParaStyleGrp(tgt/*document*/){
  var pStylesGrp = tgt.paragraphStyleGroups;
  for (var i = pStylesGrp.length - 1; i >= 0; i--) {
    if (pStylesGrp[i].paragraphStyleGroups.length > 0){
      arrangeParaStyleGrp(pStylesGrp[i]);
      } else if (pStylesGrp[i].paragraphStyles.length ===0){
        pStylesGrp[i].remove();
        }
    }
  }

//オブジェクトスタイル
function isUsedObjStyle(objStyle) {
    var objStyles = doc.allObjectStyles;
    var objStylesLen = objStyles.length;
    var isUsed = false; //不使用かつ基準でない
    app.findObjectPreferences = app.changeObjectPreferences = NothingEnum.NOTHING;
    app.findObjectPreferences.appliedObjectStyles = objStyle;
    var result = doc.findObject();
    if (result.length > 0) {
        isUsed = true; //使用している
    } else {
        for (var oo = 4; oo < objStylesLen; oo++) { //[なし][基本グラフィックフレーム][基本テキストフレーム][基本グリッド]はスキップ
            if (objStyles[oo].basedOn === objStyle) {
                isUsed = true; //不使用だが基準になっている
                break;
            }
        }
    }
    app.findObjectPreferences = app.changeObjectPreferences = NothingEnum.NOTHING;
    return isUsed;
}

//オブジェクトスタイルグループ
function arrangeObjStyleGrp(tgt/*document*/){
  var objStylesGrp = tgt.objectStyleGroups;
  for (var i = objStylesGrp.length - 1; i >= 0; i--) {
    if (objStylesGrp[i].objectStyleGroups.length > 0){
      arrangeObjStyleGrp(objStylesGrp[i]);
      } else if (objStylesGrp[i].objectStyles.length ===0){
        objStylesGrp[i].remove();
        }
    }
  }

//表スタイル
function isUsedTableStyle(tblStyle) {
    var tblStyles = doc.allTableStyles;
    var tblStylesLen = tblStyles.length;
    var isUsed = false; //不使用かつ基準でない
    app.findTextPreferences = app.changeTextPreferences = NothingEnum.NOTHING;
    app.findTextPreferences.findWhat = "<0016>";
    var tblsParent = app.findText();
    for (var tt = 0; tt < tblsParent.length; tt++) {
        if (tblsParent[tt].tables[0].appliedTableStyle === tblStyle) {
            isUsed = true; //使用している
        }
    }
    for (var ttt = 2; ttt < tblStylesLen; ttt++) { //[表スタイルなし][基本表]はスキップ
        if (tblStyles[ttt].basedOn === tblStyle) {
            isUsed = true; //不使用だが基準になっている
        }
    }
    app.findTextPreferences = app.changeTextPreferences = NothingEnum.NOTHING;
    return isUsed;
}

//表スタイルグループ
function arrangeTableStyleGrp(tgt/*document*/){
  var tblStylesGrp = tgt.tableStyleGroups;
  for (var i = tblStylesGrp.length - 1; i >= 0; i--) {
    if (tblStylesGrp[i].tableStyleGroups.length > 0){
      arrangeTableStyleGrp(tblStylesGrp[i]);
      } else if (tblStylesGrp[i].tableStyles.length ===0){
        tblStylesGrp[i].remove();
        }
    }
  }

//セルスタイル
function isUsedCellStyle(cllStyle) {
    var cllStyles = doc.allCellStyles;
    var cllStylesLen = cllStyles.length;
    var isUsed = false; //不使用かつ基準でない
    app.findTextPreferences = app.changeTextPreferences = NothingEnum.NOTHING;
    app.findTextPreferences.findWhat = "<0016>";
    var tblsParent = app.findText();
    for (var tt = 0; tt < tblsParent.length; tt++) {
        for (var cc = 0; cc < tblsParent[tt].tables[0].cells.length; cc++) {
            if (tblsParent[tt].tables[0].cells[cc].appliedCellStyle === cllStyle) {
                isUsed = true; //使用している
            }
        }
    }
    for (var ccc = 1; ccc < cllStylesLen; ccc++) { //[なし]はスキップ
        if (cllStyles[ccc].basedOn === cllStyle) {
            isUsed = true; //不使用だが基準になっている
        }
    }
    app.findTextPreferences = app.changeTextPreferences = NothingEnum.NOTHING;
    return isUsed;
}

//セルスタイルグループ
function arrangeCellStyleGrp(tgt/*document*/){
  var cllStylesGrp = tgt.cellStyleGroups;
  for (var i = cllStylesGrp.length - 1; i >= 0; i--) {
    if (cllStylesGrp[i].cellStyleGroups.length > 0){
      arrangeCellStyleGrp(cllStylesGrp[i]);
      } else if (cllStylesGrp[i].cellStyles.length ===0){
        cllStylesGrp[i].remove();
        }
    }
  }

メモ

積み残し

  • 消す順番によって、使っていないのに残ってしまう可能性がある
    段落スタイル1:不使用だが段落スタイル2の基準。
    段落スタイル2:不使用。
    のような場合に起こる。
    最初に親子関係をすべて取得したうえで末端から処理する?
  • 似たような処理があちこちにあるので統一したい

参考