【入門者向け⑥】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/フォントは適当に/テキスト=かきくけこさしすせそ
それでは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じゃなければ」という条件式になったので、今度は右のフレームが選択されたと思います。
「等しい・等しくない」の説明はこのくらいで終わろうと思います。