LoginSignup
8

More than 3 years have passed since last update.

InDesign JavaScript チートシート

Last updated at Posted at 2019-02-11

記事に画像を入れると重たくなるので、ソースコード例をメインに掲載。

ソースコード例中の変数

変数名 説明
doc Document InDesignドキュメント
docList Array InDesignドキュメントのリスト
pageItem PageItem ページ内オブジェクト
exportPDFFilePath String PDFの出力ファイルパス
strText String 何かしらの文字列
fileName String 処理対象のファイルパス

ドキュメント操作

ファイル名を指定してInDesignファイルを開く
var doc = app.open("/Users/efla/Desktop/test.indd");
フォルダをユーザが指定したフォルダ内のすべてのInDesignファイルを開く
var folderObj = Folder.selectDialog("Select Folder");
fileList = folderObj.getFiles("*.indd");

var i = 0;
var docList = new Array();
for (i=0; i<fileList.length; i++ ) {

   docList.push(app.open(fileList[i]));
}
ドキュメントを保存する
doc.save(filePath);
ドキュメントを閉じる

doc.close();
ドキュメントを保存して閉じる
doc.close(SaveOptions.yes);
ドキュメントのファイル名を取得する
var filename;
filename = doc.name;
ドキュメントのファイルパス取得する

エラーチェック・ユーザインタフェース

警告ダイアログを表示する
var message = 'エラーが発生しました。';
alert(message);

ファイル操作

ファイル選択画面を表示してユーザにファイルを選択させる
var fileObj = File.openDialog("Select File");
テキストファイルを新規作成して書き込みを行う

注意:処理系がWindowsの場合、出力先のパスのフォルダ区切り文字は「¥」マークに置き換える必要があります。(CS5で検証)

var fileObj = new File(fileName); //fileNameは処理したいファイルのパス
var flag = fileObj.open("w");

if ( flag ) {

    fileObj.writeln("1行目");
    fileObj.writeln("2行目");

    fileObj.close();
}
else {

    alert("ファイルを作成できませんでした");
}

論理演算

これ言語によって違うからメモ書き。
if文で使った時の動作を記載。

演算子 動作 結果
= 代入 代入した値が入る。booleanの条件判定は「0をfalseとみなす」ので、「0以外の代入は真」とみなされる。
== 等価演算 左辺と右辺の結果が同じ場合に真、そうでない場合は偽とみなされる。
!= 等価演算(否定) 左辺と右辺の結果が同じ場合に真、そうでない場合は偽とみなされる。
&& AND演算 省略
|| OR演算 省略

オブジェクトの種別や構造を取得する

オブジェクトの型の判定
var typeName = pageItem.constructor.name;
if (typeName == "Group") {
   //...
}
オブジェクトモデル 説明
Group
Page
Image
Polygon
Oval
EPS
オブジェクトのコンテンツタイプを判定
if (pageItem.contentType == contentType.TextType) {
   //...
}
コンテンツタイプ クラス 説明
contentType.TextType
contentType.GraphicType

よく使うオブジェクトの構造判定と種別の判定

オブジェクトがTextFrameかどうか判別する
var typeName = pageItem.constructor.name;
if (typeName == "TextFrame") {
   //...
}
オブジェクトの座標を取得する

オブジェクトの可視範囲の取得。例えば、オブジェクトに線が設定されている場合、線の太さも加味した領域。

座標 取得方法
左上のX座標 pageItem.visibleBounds[0]
左上のY座標 pageItem.visibleBounds[1]
右下のX座標 pageItem.visibleBounds[2]
右下のX座標 pageItem.visibleBounds[3]

オブジェクトを加工する

オブジェクトの不透明度を設定する。

代入する値は0-100(%)

pageItem.transparencySettings.blendingSettings.opacity = 50;

スクリプトラベル操作

スクリプトラベルを取得する
var label = pageItem.label;

レイヤー操作

名前を指定してレイヤーを削除する

以前の投稿にコメントでいただいたサンプルです。

var l = app.activeDocument.layers.itemByName("test");
if (l.isValid){
   l.remove();
} 
名前を指定してレイヤーを非表示にする
var l = app.activeDocument.layers.itemByName("test");
if (l.isValid) {
   l.remove();
}

出力

PDFファイルに出力する

注意:処理系がWindowsの場合、出力先のパスのフォルダ区切り文字は「¥」マークに置き換える必要があります。(CS5で検証)

doc.exportFile(ExportFormat.pdfType, exportPDFFilePath);
PDFファイルに出力する

注意:処理系がWindowsの場合、出力先のパスのフォルダ区切り文字は「¥」マークに置き換える必要があります。(CS5で検証)

doc.exportFile(ExportFormat.pdfType, exportPDFFilePath);

文字列操作

文字列の指定した文字数目を取り出す
var strText = "テスト用1文字列";
var strCharAt = strText.charAt(3);
文字列の指定した文字数目の文字コードを取り出す
var strText = var strText = "テスト用1文字列";
var intCharCodeAt = strText.charCodeAt(3);
文字列から改行を取り除く

処理系で¥nや¥rの条件が結構変わるので。
一番安定した方法。

var CRCODE = String.fromCharCode(13);
var LFCODE = String.fromCharCode(10);

strText = strText.split(CRCODE); strText = strText.join("");
strText = strText.split(LFCODE); strText = strText.join("");
ルビ情報を取得する(文字単位)

ルビは1文字に対しての設定。文章にルビが含まれているかどうかは、for文を使って1文字ずつ確認する必要がある。

var flag = pageItem.paragraphs[0].characters[0].rubyFlag;  /* boolean:true/false */
var rubyString = pageItem.paragraphs[0].characters[0].rubyString; /* brank is <![CDATA[]]> */
var rubySize = pageItem.paragraphs[0].characters[0].rubyFontSize; /* integer */
ルビを設定する(文字単位)

ルビは1文字に対して設定する。

pageItem.paragraphs[0].characters[0].rubyFlag = true;
pageItem.paragraphs[0].characters[0].rubyString = "ほげ";
pageItem.paragraphs[0].characters[0].rubyFontSize = 8;
文字列を置換する

正規表現を使わない場合

strText = strText.replace("a","b");

XML操作

検証中:もしかして、JavaScriptのXML操作の全てが実装されてはいないか?素直にjQuery使った方がいいのかもしれない。

XMLオブジェクトのパース

プロパティ経由でアクセスする。

var str_xml = '<root><item att="hoge">1つめ</item><item att="hogehoge">2つめ</item></root>'
var x_data = new XML(str_xml);

var text = x_data.item[0];

$.writeln(t);

XPath経由でアクセスする

var str_xml = '<root><item att="hoge">1つめ</item><item att="hogehoge">2つめ</item></root>'
var x_data = new XML(str_xml);

var text = x_data.xpath("/root/item")[0];

$.writeln(text);

属性値を取り出す

var str_xml = '<root><item att="hoge">1つめ</item><item att="hogehoge">2つめ</item></root>'
    var x_data = new XML(str_xml);

    var text = x_data.item[0].@att;

    $.writeln(text);

列挙体

列挙体を定義して使う

マジックナンバーは使わないようにしたい。

var type = {
    title : "100",
    author : "200",
    content : "300"
 }

function main () {

    var a = "100";

    $.writeln(a==type.title);
}

main();

ユーザインタフェース

処理を止めてウィンドウを表示する
var w = new Window('window', 'ウィンドウ',[100,100,100,100]);
w.show():

処理を止めないでウィンドウを表示する

var w = new Window('palette', 'ウィンドウ',[100,100,100,100]);
w.show():

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8