とあるDTPオペレーターのInDesignスクリプト備忘録

デザイナー上がりですがいまはDTP命。InDesign用スクリプトの解説などを綴っています。読者登録して戴けると励みになります。

【入門者向け③】スクリプトでInDesignを操作 ~forによるくり返し 後編~

それでは前回に引き続き、for文を使ってくり返し処理を行う方法を説明します。
ドキュメントはまた使いまわします。すべてのフレームの塗りを「なし」に戻してください。

前回の例文にもう一度登場してもらいましょう。

[例1]

for (var i=0; i<3; i++){
app.activeDocument.textFrames[i].fillColor = "Black";
}

この例文を実行すると、ドキュメント上のテキストフレームすべてに黒の塗りが設定されるというところまで前回やりましたね。
しかしこの書き方は実際のスクリプトではまずすることがありません。どこが問題かというと、下の赤文字にした部分です。

for (var i=0; i<3; i++){
app.activeDocument.textFrames[i].fillColor = "Black";
}

続行条件の数を「3」とユーザが打っていますが、ここの数字をユーザが打つことは通常ありません。
「テキストフレームの数が3つ」と分かっているからいいですが、100個くらいあったら数えるのが大変です。
そしてテキストフレームの数が増減するたびに、ここの数字を打ち直さなくてはいけません。
これらの理由からも、

対象の数はスクリプトに数えさせるべき

なのです。数は「続行条件」が数えてくれます。数を数えさせるためには、対象の隣に「length」を打ちます。
このルールに沿って打ち直したのが[例2]です。

[例2]

for (var i=0; i<app.activeDocument.textFrames.length; i++){
app.activeDocument.textFrames[i].fillColor = "Black";
}

ESTK上で[例2]を実行してみてください。すべてのテキストフレームが黒に塗られたと思います。
[例1]と違うのは、テキストフレームの数を減らしても増やしても、勝手にその数に合わせて実行してくれるという点です。1個しかなくても100個あっても、すべてのテキストフレームが黒く塗られるはずです。
この「length」について、もう少し詳しく調べてみましょう。


■lengthとは配列やコレクションの個数を調べるための文

lengthを英和辞書で引くと主に「長さ」を表す単語だと分かります。スクリプトでは長さというよりは「コレクションや配列の中身の数」を調べるためのものです。
「コレクション? 配列? 何それ?」と思うかもしれませんが、配列についての詳しい説明は、のちに別な記事でしようと思います。コレクションについては一旦こう覚えてください。

InDesignに関するもの(=InDesignアイテム)で、複数あるものはコレクションとして管理されている」

…といわれてもわかりづらいと思うので、いくつか例を書きます。つまりこういうもののことです。

■ pages[0] pages[1] pages[2] ⇒ 1ページ、2ページ、3ページ
■ characters[0] characters[1] characters[2] ⇒ 1文字め、2文字め、3文字め
■ paragraphs[0] paragraphs[1] paragraphs[2] ⇒ 1段落め、2段落め、3段落め
■ lines[0] lines[1] lines[2] ⇒ 1行め、2行め、3行め
■ layers[0] layers[1] layers[2] ⇒ 1個めのレイヤー、2個めのレイヤー、3個めのレイヤー
■ textFrames[0] textFrames[1] textFrames[2] ⇒ 1個めのテキストフレーム、2個めのテキストフレーム、3個めのテキストフレーム
■ selection[0] selection[1] selection[2] ⇒ 1個めの選択アイテム 2個めの選択アイテム 3個めの選択アイテム

ページも文字も段落も、「複数ある」可能性のあるものですね。
ちなみにこれらが単数つまり1つしかなかったとしても、添字[0]は省略できません。
文のあとに[0]、[1]、[2]…と添字を付けて対象を切り替えられるものが「コレクションとして扱われているInDesignアイテム」です。
配列として扱われているものは、[数字]の代わりにlengthを付ければ、コレクションの中身の数を得ることができます。
たとえばESTKで新規ページを開き、

alert (app.activeDocument.layers.length);

を入力して実行すると、そのドキュメントの持つレイヤーの個数がアラートとして表示されます。
レイヤーを増やしたり減らしたりしてから実行してみてください。レイヤー数を追従するかたちでアラートの内容が変化すると思います。

この記事を読んでいる方がまったくスクリプトのことを知らない方であれば、「レイヤーの数なんて知ってどうするの?」と思うかもしれませんが、過去記事を読んだ方であれば、こう思うことでしょう。

「こいつを続行条件に使える!」

そう、ここまで読んでくださった方なら、[例1]を[例2]に書き直した意味と、「length」の便利さをおわかりになると思われます。
テキストフレームを増やしたり減らしたりして、いろいろ試してみてください。

今回のお題をまとめるとこんな感じです。

 ① 複数ある可能性のあるアイテムは、InDesignは「配列」として扱っている
 ② 配列として扱われているものは、「length」を付けることでその数を取得できる
 ③ 配列として扱われているものは、[0]、[1]、[2]…と文に添字を付けることで、何番めかを指定できる


forや配列に関してはまだまだ説明すべきことはあるのですが、とりあえず基本的な説明は以上とします。