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

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

【入門者向け⑧】if文 その3 ~true/false/else~

実際に入門者として読んでくださってる方は、タイトルを見て

「うほっ、来た来た……いかにもプログラムっぽい単語が……」

とゾワゾワしているかもしれませんね。でもここまでif文について読まれた方であれば、さほど難しいことはありません…
場合によっては「if文って便利だなー」という感想を抱くのではないでしょうか。if文は本当に便利です。

1. trueとfalse(真と偽)

「真と偽ってなんだよ!」という方もいれば、「なんかExcelで見たことある!」という方もいるのでは。ExcelのIF関数でもお馴染みですね。
日常会話でいうところの「正解・不正解」「一致・不一致」「オン・オフ」「◯・✕」的な言葉です。プログラムのセカイではこれらを「真(true)か偽(false)」で表すのですね。つまりはこんな感じです。

 サザエさんの作者は長谷川町子である = true(真)
 ワカメはカツオの妹である = true(妹なので真)
 カツオはタラオの兄である = false(おじなので偽)
 波平の身長は178cm = true(178cmなので真。意外とデカイですね…)
 ノリスケは早大卒である = false(東大卒なので偽)

…なんだかサザエさんの雑学クイズみたいになっていますが、trueかfalseかはこんな感じで使います。
こうした「真か偽か」という値を持つ変数の型を「boolean」といい、「ブーリアン」とか「ブール」と呼ばれています。

このブール式は、InDesignスクリプトでは次のような感じで出てきます。

 ① layers[0].locked = true;
 ② layers[0].visible = false;

①も②もレイヤーの状態に関する文です。
 
 ①のlockedは「レイヤーのロック状態」という文で、右辺がtrueであれば「ロックされている」ということになります。「false」は非ロック。
 ②のvisibleは「レイヤーの表示状態」で、trueであれば「表示(見える)」、falseであれば「非表示(見えない)」です。
 こんなふうに、InDesignスクリプトでは機能の設定が「オンかオフか」の判断時にブールを使うことが多いです。
 自分で新たにブール式を作成することもできるのですが、それは別な機会で…(正直を言うと、私もあまり使ったことがありません…)
if文とは関係ないですが、次のように書けば、レイヤーのロック/非ロック・表示/非表示の状態をコントロールすることができます。
※試す場合は新規文書を作成してから実行してください※

var layObj = app.activeDocument.layers[0];

layObj.locked = true;//レイヤーをロックする
layObj.visible = false;//レイヤーを非表示にする

1つのレイヤーが、ロックかつ非表示の状態になったと思います。

ではこのブールにforとifを絡めたスクリプトを書いてみましょう。
新規文書にレイヤーを10個ほど追加し、そのうちのいくつかをロック状態にしてください。

[例1]は「現在のロック状態を調べさせて条件判断を行い、trueならば処理を実行する」というスクリプトです。
実行すると、「ロック状態のレイヤーのみ、レイヤー名が『ロックレイヤー+連番』」になります。

[例1]ロックされたレイヤーのレイヤー名を『ロックレイヤー+連番』にする
var layObj = app.activeDocument.layers;
var j=1;//連番用の変数

for (var i=0; i<layObj.length; i++) {
    if (layObj[i].locked == true) {//trueならば、という文
            layObj[i].name = "ロックレイヤー"+[j];
            j++
        }
    }

ループの外で宣言している「j」という変数が、レイヤー名の連番の部分になります。
ループの「i」でも連番にできそうですが、「if」に選ばれなかったときにもカウンタが進んでしまうので、番号が飛び飛びになってしまいます。

2. else(条件にあてはまらないものへの処理)

ここまで3記事に渡って説明してきたif文を使い、「条件分岐で、条件にマッチしたものへの処理」が行えるようになりました。
[例1]で言うならば、「ロックされたレイヤーに任意のレイヤー名を付けることが出来るようになった」わけです。
では条件に当てはまらなかったものはどうでしょう。[例1]の非ロックレイヤーにも名前を付けたい場合は、非ロックレイヤーを条件にしたスクリプトも書かなくてはいけないのでしょうか。
もちろんtrueの場合とfalseの場合の両方の処理を書くことも可能ですが、if文では「else」という文を使って「条件に当てはまらなかったものへの処理」をあわせて指定することが出来ます。
elseを加えたif文の書き方はこんな感じです。

if(条件){
 条件が成立した場合の処理
} else {
 条件にあてはまらなかった場合の処理
}


[例1]を書き直して、「ロックレイヤーと非ロックレイヤーにそれぞれ名前を付ける」という処理のスクリプトを書いてみましょう。

スクリプトを実行する前に、新規文書を作成し、レイヤーを10個ほど追加し、そのうちのいくつかをロック状態にしてください

[例2]ロックレイヤーには『ロック+連番』、非ロックレイヤーには『非ロック+連番』という名前を付ける

var layObj = app.activeDocument.layers;
    var j=0;
 
for (var i=0; i<layObj.length; i++) {

if (layObj[i].locked == true) {
        layObj[i].name = "ロック"+[j]
        j++
    } else {
        layObj[i].name = "非ロック"+[j]}//あてはまらないときの処理を書く
        j++
    }

ロックされているレイヤー、されていないレイヤーそれぞれに名前が付けば成功です。
if文、便利ですね!
以前の記事で書いたコマンドバトルのスクリプトでも、いろいろな役割でif文が登場します。
(いいえボタンが押されたら…HPが0になったら…から会心の一撃判定まで)
良かったらそちらも読んでみてください。

条件に当てはまらなければ」という書き方ができるのはとても便利ですね。
ちなみに条件文の「==true」や「!=true」は省略することができます。
下図参照

if (layObj[i].locked == true)
  //↓こう書いてもOK
if (layObj[i].locked)

if (layObj[i].locked != true)
  //↓こう書いてもOK
if (!layObj[i].locked)

次回は「複数の条件での条件分岐」を書くつもりです…
記事が気に入ったら、スターボタンかブックマークボタンをクリックしていただると幸いです!