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:不使用。
のような場合に起こる。
最初に親子関係をすべて取得したうえで末端から処理する? - 似たような処理があちこちにあるので統一したい
参考
- 解決済み: Remove unused paragraph styles while keeping in mind based on styles | Adobe Support Community
- スウォッチについて | 中綴製作所
「未使用のスウォッチはドキュメントのunusedSwatchesプロパティから配列で取得できます。
ただし、スウォッチにはInDesignが内部で使用している無名のもの(カラー)があり、それらも未使用のスウォッチとして取得する場合があります。
よって、unusedSwatchesプロパティで取得したスウォッチは、それらをチェックしながら削除しなければなりません。」 - 再帰関数を学んでワンランク上のJavaScriptエンジニアになろう! | Qiita