よろよろ帳

InDesign JavaScript 勉強中

既存スタイルの名前変更

段落スタイルの名前まとめて変えようと繰り返しを0から始めるとエラー。"スタイル名にかぎ括弧は使用できません"。lengthを見るとパネルの表示数より1つ多いので2から始めるようにしました。0からtryを挟んでも動きましたがなるべく短くしたいです。

  • 文字スタイル[0][なし]
  • セルスタイル[0][なし]
  • 表スタイル[0][表スタイルなし],[1][基本表]
  • オブジェクトスタイル[0][なし],[1][基本グラフィックフレーム],[2][基本テキストフレーム],[3][基本グリッド]

……やっぱりtryの方がいいかも。

//段落スタイル
app.doScript (main, ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT);
function main (){
var P=app.activeDocument.paragraphStyles;
//alert (app.activeDocument.paragraphStyles.length)
//alert (app.activeDocument.paragraphStyles[0].name)
//[0]は[段落スタイルなし],[1]は[基本段落]
for(var i=2; i<P.length; i++){
    P[i].name=P[i].name.replace(/段落スタイル/,"みだし")
    }
}
//オブジェクトスタイル
var O=app.activeDocument.objectStyles;
for(var i=0; i<O.length; i++){
    try{O[i].name=O[i].name.replace(/オブジェクトスタイル/,"かざり")
        }catch(e){}
    }

文字のアウトライン

記号フォントをあしらいに使う時などに。一覧ストックからフレーム選んでアウトラインかけると全部グループ化されて、解除しても1行まるっと複合パスになってしまいます。1文字ずつバラしたい。

Big Cheese | Adobe Fonts

↑ 2つ目のスクリプトでアウトライン
app.doScript (main, ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT);
function main (){
var Doc=app.activeDocument
var sel=Doc.selection[0];//テキストフレーム選択
for(var i=0; i<sel.characters.length; i++){
    var Ot=sel.characters[i].createOutlines(false);//trueだとインラインになる/falseは元が残る
    Doc.selection=Ot;
    Doc.selection[0].overprintFill=false//元が黒だとオーバープリントにチェック入るの回避
    }
sel.remove()//元消去
}

上記だと改行やスペース混じりだとうまくいかないので検索でやってみました。

app.doScript (main, ScriptLanguage.JAVASCRIPT, [], UndoModes.ENTIRE_SCRIPT);
function main (){
var Doc=app.activeDocument
var sel=Doc.selection[0];//テキストフレーム選択
app.findGrepPreferences.findWhat = ".";//改行以外
var Res=sel.findGrep();
//alert (Res.length)
for(var i=0; i<Res.length; i++){
    try{var Ot=Res[i].createOutlines(false);
        Doc.selection=Ot;
        Doc.selection[0].overprintFill=false;
        }catch(e){}//tryはタブとかスペースあったらエラー出たので
        }
    sel.remove();
    }

コマンドZで戻れるから何にでも
app.doScript (main, ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT);
function main (){命令}
を付け足してましたがこれは繰り返しの部分が効かなくなる…。

↓参考(FAST_をとる)
UndoModes.FAST_ENTIRE_SCRIPTとisValidのバグ(InDesignスクリプト)|InDesign|ぼんぷろぐ

選択にオブジェクト追加

選択したものの左上に共通のオブジェクトを追加します。追加するものは要グループ化。

クリップボードから(コピーかカットしてから実行)

var Doc=app.activeDocument;
var tempRuler = Doc.viewPreferences.rulerOrigin;
Doc.viewPreferences.rulerOrigin = RulerOrigin.SPREAD_ORIGIN;
app.doScript (main, ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT);
function main (){
var sel=Doc.selection;
Doc.selection = null;
//レイヤー指定したいなら
//Doc.activeLayer= Doc.layers[0];//一番上
//Doc.activeLayer=Doc.layers.itemByName ("new");//名前指定
for(var i=0; i<sel.length; i++){
    var VB=sel[i].visibleBounds;
    app.paste();
    Doc.selection[0].move([VB[1],VB[0]])
    }
}
Doc.viewPreferences.rulerOrigin = tempRuler;

★ライブラリから

var Doc=app.activeDocument;
var tempRuler = Doc.viewPreferences.rulerOrigin;
Doc.viewPreferences.rulerOrigin = RulerOrigin.SPREAD_ORIGIN;
app.doScript (main, ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT);
function main (){
var sel=Doc.selection;
Doc.selection = null;
for(var i=0; i<sel.length; i++){
    var VB=sel[i].visibleBounds;
    var lib = app.libraries.itemByName("test.indl");//ライブラリ指定
    var La=lib.assets.item("new").placeAsset(Doc);//アセット名指定
    Doc.selection =La;//選ばないとだめみたい
    Doc.selection[0].move([VB[1],VB[0]])
    }
}
Doc.viewPreferences.rulerOrigin = tempRuler;

右下用

var VB2=Doc.selection[0].visibleBounds;
Doc.selection[0].move([VB[3]-(VB2[3]-VB2[1]),VB[2]-(VB2[2]-VB2[0])])

中央用

var VB2=Doc.selection[0].visibleBounds;
var W=VB2[3]-VB2[1];
var H=VB2[2]-VB2[0];
Doc.selection[0].move([VB[1]+((VB[3]-VB[1]-W)/2),VB[0]+((VB[2]-VB[0]-H)/2)])

BoundsはY軸始まりでmoveがX軸始まり…嫌だ!
↓参考
1if-1for(4):複数のオブジェクトをあるオブジェクトに置き換えたい - DTPab

レイヤー操作

未使用と非表示を削除、全てのレイヤーをロック解除。

var Doc=app.activeDocument;
app.menuActions.item('$ID/Delete Unused Layers').invoke();//未使用レイヤーを削除
var Ly=Doc.layers;
for(var i=Ly.length-1; i>=0; i--){//削除は後ろから
    Ly[i].locked=false;//ロック解除
    if(Ly[i].visible==false)Ly[i].remove();//非表示削除
    }

背景オブジェクトのレイヤーはロックしたい。

var Doc=app.activeDocument;
var K=Doc.allPageItems
for(var i=0; i<K.length; i++){
    var VB=K[i].visibleBounds;
    if(Math.round(VB[0])==-3&&Math.round(VB[1])==-3)//左上座標-3
        K[i].itemLayer.locked=true;
        }

一番上に新規レイヤー追加。同じ名前があると無視。

var Doc=app.activeDocument;
Doc.activeLayer=Doc.layers[0];
try{Doc.layers.add({name: "レイヤー名"})
    }catch (e) {}
//名前不要ならDoc.layers.add();

白レイヤーやめてほしい。

var Ly=app.activeDocument.layers
for (var i=0; i<Ly.length; i++){
    if(Ly[i].layerColor==UIColors.WHITE)
    Ly[i].layerColor=UIColors.LIGHT_GRAY;
    }

↓参考
https://www.indesignjs.de/extendscriptAPI/indesign-latest/#UIColors.html#d1e87585

ついでにあやしい色名日本語と照合。

layerColorName

フレームサイズを丸める

選択したものを左上基準で端数を丸めます。2.5の倍数は横組み10Qベタ打ちキャプションがつく画像フレーム用に調べました。

var sel = app.activeDocument.selection;
for (i=0; i<sel.length; i++){
    var selG=sel[i].geometricBounds;
    var W=Math.round((selG[3] -selG[1])/2.5)*2.5;//2.5の倍数
    var H=Math.round((selG[2] -selG[0])*4)/4;//0.25刻み
    sel[i].geometricBounds = [selG[0],selG[1],selG[0]+H,selG[1]+W];
    }

次のオブジェクト

角丸の囲み文字の変更などに。フレーム1つにしたくてQ数半分、垂直水平比率200%を試すもオーバーフローはしないけど中央に揃わない。

app.doScript (main, ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT);
function main (){
var Doc = app.activeDocument;
app.findGrepPreferences.findWhat = "^生地アップ$";
app.changeGrepPreferences.fillColor="Paper";
var Res = Doc.findGrep();
for(var i=0; i<Res.length; i++){
    if(Res[i].parentTextFrames[0].parent.constructor.name=="Group"){
        Res[i].changeGrep();
        Res[i].parentTextFrames[0].select();
        app.menuActions.item('$ID/Select Next Item').invoke();
        Doc.selection[0].fillColor="Black";
        }
    }
}


↓参考
menuActionTitleToString
for indesign select next item in group object · GitHub