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

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

【入門者向け⑤】配列変数について

身近なスクリプト入門者で、配列変数の理解に苦戦している方がいらっしゃるので書いてみました。
かくいう自分も最初は配列変数の意味がよく分からず、使わなくて済むなら使いたくないくらいでした。
配列が使えるようになると、出来ることが結構増えます。後述するように、長いプログラム文を短くしたりもできます。

配列変数でつまづく理由を挙げると、個人的には次のような理由が思い当たります。

・宣言の仕方が色々あってややこしい
・配列に要素を入れる方法も色々あってややこしい
・そもそも配列の意味や存在価値が分からない

まず…配列変数とは何かというと、複数の変数を入れる「箱」のようなものです。たとえば曜日を変数宣言する場合、

[例1]

var Mon = "月曜"
var Tue = "火曜"
var Wed = "水曜"
 ・
 ・
 ・

なんて打っていくのは超面倒だし、使い勝手も悪いです。配列変数を使うと、次のような書き方ができます。

[例2]

var week = ["月曜","火曜","水曜","木曜","金曜","土曜","日曜"];

水曜を指定したい時は

[例3]

alert (week[2]);

で事足ります(実行するとアラートで「水曜」と出ます。配列の中身も「0」から「1、2…」と数えます)。

[例2]のように箱と中身を同時に宣言することもできますが、とりあえず箱だけ用意しておくことも可能です。

[例4]

var week = [];

と宣言すると、空っぽの箱(=配列変数)が作成できます。
空っぽの箱に中身を入れるには、pushという命令文を使います。押し込むわけですね。
このweekという箱の中に「月曜」を"押し込んで"みましょう。

[例5]

week.push("月曜");

これでweek配列に「月曜」が入りました。確認してみます。

[例6]

alert(week[0]);

「月曜」というアラートが表示されましたね。
ちなみに

[例7]

week.push("月曜","火曜","水曜");

と宣言すると、一気に3つの要素が箱の中に入ります。[例8]を実行すると、箱の中身が次々にアラートされます。

[例8]

var array = [];
array.push ("月","火","水");

for (var i=0; i<array.length; i++) {
    alert (array[i]);
}

このスクリプト、過去のコラムに書いたテキストフレームをfor文に掛ける方法そっくりですね。
これも過去のコラムでも記しましたが、InDesignはテキストフレーム要素は配列として管理しているのです。テキストフレームだけでなく、ページからレイヤーからあらゆるものをInDesignは配列で管理しています。
InDesignはフレームやレイヤー、ページなどをコレクションとして扱っていますが、このコレクションと配列は似たような性質を持っているようです。
そして、コレクションや配列の中身の数は「length」で数えることができます。
一度[例8]のような書き方をしておけば、配列の中身が増えても減ってもうまい具合に処理をしてくれます。

配列変数にはpush以外にも要素を突っ込む命令文(削る命令文も)があるのですが、とりあえずpushを覚えておけば大体のことは間に合います。そしてpushを使える人がほかの命令文を使うのは簡単なので、まずは色々pushしまくって、配列変数に慣れると良いでしょう。

配列変数はとても便利です。私が過去の記事に載せた、アラートメモのスクリプトも、テキストファイルの中身をループ処理でどんどん配列変数にpushして、それをつなげたものをアラート表示しているだけの代物です。そんな使い方もできます。

まるで四次元ポケットのようにこの配列には色々なものが入ります。ループ処理で次々に要素をpushしてもInDesignは少しも嫌がりません(たぶん)。