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

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

【入門者向け⑥】if文(条件分岐)について ~等しい・等しくない~

すぐ挫折すると思って書いていたこのブログですが、なんだかんだで入門者向けの記事も⑥まで来ました。
誰かの役に立てているかはともかく…
今回はifという命令文を使って条件分岐をする方法を書きます。
forとifが使いこなせれば、簡単なスクリプトは書けてしまいます。
私自身、長らくこの2つの命令文だけで色々なスクリプトを書いていました。
あとで読み返して「あー、なんだこの書き方」と頭を抱えることにもなるのですが、自分の書いたスクリプトを他者が編集するとかでなければ、多少不格好なスクリプトでも「(バグることなく)動いてしまえばこっちのもん」です(怒られそう)。

if文の説明をするに当たり、InDesignの適当な新規ドキュメントに次のような部品を用意してください。

■下準備

黄色という名のスウォッチを用意する(C=0 M=0 Y=100 K=0)
水色という名のスウォッチを用意する(C=100 M=0 Y=0 K=0)

■左のフレーム
属性=テキスト/線カラー=水色/塗りカラー=黄色/Q数=24Q/フォントは適当に/テキスト=あいうえお

■右のフレーム
属性=テキスト/線カラー=[黒]/塗りカラー=[なし]/Q数=13Q/フォントは適当に/テキスト=かきくけこさしすせそ

f:id:rokuyaN:20170628134902j:plain

それではif文の説明。
if文の、基本中の基本の式はこんな感じです。

if (A==B){
AとBが等しい時に行う処理
}

イコールの記号が2つあることに注目。演算子と呼ばれるものの一つで、「左辺と右辺が等しい」というif文を書くときに記します。イコールがひとつだけだとうまく行かないので注意。「等しい」以外にも「より大きい」「より小さい」とか「等しいもしくは大きい」みたいな演算子もありますが、まずは「等しい」から始めます。

ではこの基本式を使って例題を解きながら説明をしていきます。まずは「何も選択していない状態」にしてください。

[例題1]塗りが黄色のフレームを選択せよ

[解0]

var myDoc = app.activeDocument; 
var obj = myDoc.textFrames;
    if (obj.fillColor.name == "黄色"){
            obj.select();//オブジェクトを選択
        }   

select()
は「選択」の命令文です。今回はif文の説明なので、selectについての詳しい説明は割愛します。

これで塗りが黄色のフレームが選択……されません。いつかのコラムにも書きましたが、スクリプトの場合
・「こういう条件のフレームを探して」
ではなく、
・「全部調べて。そして条件に合うフレームを見つけて
という書き方をしなくてはなりません。それに沿った書き方に直したものが[解1B]です。

[解1]

var myDoc = app.activeDocument; 
var obj = myDoc.textFrames;

for (var i=0; i<obj.length; i++) {
    if (obj[i].fillColor.name == "黄色"){
            obj[i].select();
        }   
    }

↑を実行すると、「塗りが黄色」という「条件に合致」する左のフレームが選択されますね。
ループを使って全部のフレームを総当たりしています。条件に合致したものだけがifの{}の中身に進めるというわけです。

調子に乗ってどんどん行きます。
スクリプトを実行する前には選択を全解除するのを忘れずに…

[例題2]線が水色のフレームを選択せよ

[解2]

var myDoc = app.activeDocument; 
var obj = myDoc.textFrames;

for (var i=0; i<obj.length; i++) {
    if (obj[i].strokeColor.name == "水色"){
            obj[i].select();
        }   
    }
[例題3]フレーム内の文字数が5文字のフレームを選択せよ

[解3]

var myDoc = app.activeDocument; 
var obj = myDoc.textFrames;

for (var i=0; i<obj.length; i++) {
    if (obj[i].characters.length == 5){
            obj[i].select();
        }   
    }
[例題4]フレーム内の文字が「あいうえお」のフレームを選択せよ

[解4]

var myDoc = app.activeDocument; 
var obj = myDoc.textFrames;

for (var i=0; i<obj.length; i++) {
    if (obj[i].contents == "あいうえお"){
            obj[i].select();
        }   
    }
[例題5]フレーム内の文字のQ数が24Qのフレームを選択せよ

[解5]

var myDoc = app.activeDocument; 
var obj = myDoc.textFrames;

for (var i=0; i<obj.length; i++) {
    if (obj[i].parentStory.pointSize == "24 Q"){
            obj[i].select();
        }   
    }

左ばかりが選択されて、右のフレームが可愛そうですね。
「==」を「!=」に打ち替えると、「等しければ」じゃなくて「等しくなければ」という条件式になります。
ためしに[解5]の条件中の「==」を「!=」にして実行してみましょう。

[解5B]

var myDoc = app.activeDocument; 
var obj = myDoc.textFrames;

for (var i=0; i<obj.length; i++) {
    if (obj[i].parentStory.pointSize != "24 Q"){
            obj[i].select();
        }   
    }

「中の文字が24Qじゃなければ」という条件式になったので、今度は右のフレームが選択されたと思います。
「等しい・等しくない」の説明はこのくらいで終わろうと思います。