クリエイター手抜きプロジェクト[572]InDesign編 便利な機能 コレクションを使う
── 古籏一浩 ──

投稿:  著者:



本連載は自動化に関するネタを提供するはずだったのですが、ここ一年以上はそのネタがほぼ皆無という状態でした。ネタ切れというのもなきにしもあらずですが、昨年に作ったInDesignのスクリプトの数は1200以上あります。

ほとんどは些細なものです。ネタに困ったら細かいスクリプトでも載せておけば、連載は続けられるかなと思ってました。ただ、一回の掲載で10個載せても120回。一年では40回ほど掲載回数があるので3年しか持ちません。

InDesign以外にもAdobeのアプリケーションはたくさんありますし、自動化できるものであれば問わないとすれば、まだまだ連載は続けられそうです。IoT関係だと部品が多く、登場するデバイス/シングルボードコンピューターなどが多いため、当面ネタ切れにはならないんじゃないかと。どうにもネタ切れになったら、ゲームを作ってしまえば、どうにかなりそうな気もします。





前ふりが長くなりましたが、今回は久々の(何年かぶりの)InDesignのJavaScriptネタです。InDesign本を作成している時に大量にコードを書いたため、それなりのノウハウが溜まったからという理由はあります。

ただ、細かいプログラムがほとんどなので、実務で使えるかというと、それは厳しいと思います。やはり、実務で使うなら現場の人がプログラムを書くのが一番だと思います。現場のことをよく知っているからです。

InDesignで自動化する場合に、JavaScriptが使われることが多くありますが、結構便利な機能があります。それはコレクションです。コレクションはスウォッチやページ、テキストフレームなど、特定のオブジェクトの集合体です。

InDesignのコレクションは、WebでのjQueryの$()に近いものがあります。JavaScriptネイティブなら、querySelectorAll()といったところでしょうか。

ただし、InDesignのコレクションに用意されているメソッドは、そこまで高機能ではありません。もし、InDesignのコレクションにquerySelectorAll()のような機能があれば、使い勝手はかなり違っていたかもしれません。

InDesignのコレクションを使うと、プログラムを短く簡潔に書くことができます。ここでは、アクティブになっているドキュメントの3~5ページを削除するスクリプトを作ってみます。ドキュメントには少なくとも5ページ以上のページがあるものとします。

まず、コレクションを使わずに書いた場合どうなるかというと伝統的な、というか定番のforを使います。ページはpagesでアクセスし、削除する場合はremove()を使います。

for(var i=5; i>=3; i--){
app.activeDocument.pages[i-1].remove();
}

このような、forを使った場合のメリットは多くの言語で使われているので、JavaScriptを知らなくても分かると思われます。書かれたプログラムを、他の言語に移植しやすいということもあります。

それでは次に、InDesignのコレクションを使った場合のプログラムですが、以下のようになります。

app.activeDocument.pages.itemByRange(2,4).remove();

forによる繰り返しの記述自体がなくなっています。行数も1行でシンプルになりました。itemByRange()メソッドは、コレクションの範囲を指定します。itemByRange(2,4)ならコレクションの2~4(0が最初のなので3番目から5番目)になります。

pagesはページのコレクションなので、ページ3~5までが対象になります。面白いのは、この後に続くメソッドです。通常、メソッドはひとつのオブジェクトに対して処理されますが、コレクションの場合は複数のオブジェクトに対して処理されます。

メソッドに限らずプロパティに対しても、同様の処理が行われます。今度は、アクティブページにあるテキストフレームの内容を消去するスクリプトを見てみましょう。forを使った繰り返しで書くと、以下のようになります。

var aPage=app.activeWindow.activePage;
for(var i=0; i<aPage.textFrames.length; i++){
aPage.textFrames[i].parentStory.contents="";
}

コレクションを使うと、以下のようになります。everyItem()はすべてのコレクションを対象にするメソッドです。これも、一行で書くことができてしまいます。

app.activeWindow.activePage.textFrames.everyItem().contents="";

ただ、これだと表示されている範囲しか文字が消えません。しかし、contentsの部分をparentStory.contentsとしてしまうと機能しません。こうなると、一般的な繰り返し処理のforを使わないといけません。

また、総数を返すコレクションのcount()メソッドも、対象によっては異なる結果を返すこともあります。ここらへんは、多少のノウハウが必要な部分かもしれません。

コレクションは万能ではありませんが、上手に使えば短く簡潔にスクリプトを書くことができます。最後にコレクションのメソッドを載せておきます。(すべてのコレクションに同じメソッドがあるわけではありません)

anyItem() コレクションのオブジェクトのうちどれか(不特定)
count() コレクションの総数(まれに配列を返すものがある)
everyItem() コレクションのすべてのオブジェクト
firstItem() コレクションの最初のオブジェクト
middleItem() コレクションの総数のうち中央に位置するオブジェクト
lastItem() コレクションの最後のオブジェクト
item(位置) コレクションで指定された位置にあるオブジェクト(位置は0から始まる)位置は数値だけでなく名前でも指定することができる場合もある
itemById(id) コレクション内で指定したIDのオブジェクト
itemByName(名前) コレクションにある指定された名前のオブジェクト
itemByRange(開始、終了) コレクションで指定された範囲にあるオブジェクト
previousItem(object) コレクションの指定されたオブジェクトのひとつ前にあるオブジェクト
nextItem(object) コレクションの指定されたオブジェクトの次にあるオブジェクト


【古籏一浩】openspc@alpha.ocn.ne.jp
http://www.openspc2.org/


ようやくInDesignのJavaScript自動化本が発売になりました。なんですが、元々一冊の本だったものがページ数の関係などで入らず、全体の2/3ほど(章としては半分)を先に出版するという具合になりました。なので、入門っぽいような部分は最初に少しあるだけです。

さらに、ビジュアルリファレンスもあったんですが、量が多く入れることができず、ダウンロードページにてPDFで用意してあります。(ビジュアルリファレンスだけで400ページほど)InDesignの逆引きJavaScript本は世界にこれだけしかないので是非(^^)/

・InDesign自動化サンプルプログラム逆引きリファレンス上/下
https://www.amazon.co.jp/dp/4844396846/

https://www.amazon.co.jp/dp/4844396854/


・創って学ぼうプログラミング
https://news.mynavi.jp/series/makeprogram


・みんなのIchigoLatte入門 JavaScriptで楽しむゲーム作りと電子工作
https://www.amazon.co.jp/dp/4865940936

[正誤表]
http://www.openspc2.org/book/error/ichigoLatte/


・After Effects自動化サンプルプログラム 上巻、下巻
https://www.amazon.co.jp/dp/4844397591

https://www.amazon.co.jp/dp/4844397605


・IchigoLatteでIoT体験
https://www.amazon.co.jp/dp/B06X3X1CHP

http://digiconcart.com/dccartstore/cart/info/2561/218591


・みんなのIchigoJam入門 BASICで楽しむゲーム作りと電子工作
http://www.amazon.co.jp/dp/4865940332/


・Photoshop自動化基本編
http://www.amazon.co.jp/dp/B00W952JQW/


・Illustrator自動化基本編
http://www.amazon.co.jp/dp/B00R5MZ1PA/


・4K/ハイビジョン映像素材集
http://www.openspc2.org/HDTV/


・クリエイター手抜きプロジェクト
http://www.openspc2.org/projectX/