DTPab

DTPにまつわるあれこれ

もくもく会#2レジュメ 解答編4「任意に実行」

元の設問はこちら

さて、今回は機能5です。
5.ひとつずつ画面で確認しながら「はい・いいえ」で設定変更を任意でできるようにする

var myDoc = app.activeDocument;
var myTxf = myDoc.textFrames;
var tgtBlack = myDoc.swatches.item('Black');
for (var i=0; i<myTxf.length; i++){
    var myTab = myTxf[i].tables;
    for (var k=0; k<myTab.length; k++){
        var myCel = myTab[k].cells;
        for (var m=0; m<myCel.length; m++){
            myCel[m].select();
            app.activeWindow.zoomPercentage = 200;
            if (!confirm ("斜線のオーバープリントをオンにしますか?", true)) continue;
            if (!myCel[m].diagonalLineStrokeOverprint &&
                myCel[m].diagonalLineStrokeColor == tgtBlack){
                myCel[m].diagonalLineStrokeOverprint = true;
                }
            if (!myCel[m].diagonalLineStrokeGapOverprint &&
                myCel[m].diagonalLineStrokeGapColor == tgtBlack){
                myCel[m].diagonalLineStrokeGapOverprint = true;
                }
            }
        }
    }

元のコードと比べると、3行増えるだけです。具体的には

myCel[m].select();
app.activeWindow.zoomPercentage = 200;
if (!confirm ("斜線のオーバープリントをオンにしますか?", true)) continue;

この3行です。ちなみに、実行するとこんな感じです。

f:id:uske_S:20170726092655g:plain

ひとつずつ確認できるので、部分的に処理を省きたい場合や、一律で処理してしまうのが不安な場合など、けっこういろいろな場面で活躍します。

順を追って追加した3行を解説します。

myCel[m].select();

まずこれがセルの選択です。selectメソッドは引数を渡すことでいろんなことができますが、今回は単純に選択状態にさせるだけなので引数は渡していません。

app.activeWindow.zoomPercentage = 200;

続くこれが画面遷移です。オブジェクト(今回はセル)を選択しただけでは画面が移動しません。これをコメントアウトしてもらえばわかりますが、画面外のオブジェクトでもスクリプトでは問題なく選択できてしまいます。そこで、オブジェクトを選択した状態でapp.activeWindow.zoomPercentageを調整すると、選択したオブジェクトが画面の中央に表示されるということを利用して画面遷移を処理しています。
注意すべきはactiveWindowのプロパティという点です。activeDocumentではありません。activeDocumentはその名の通りドキュメントを指していますので、言い換えれば開いているinddファイルとも言えます。ですがactiveWindowはアクティブなウィンドウを指します。つまり開いているドキュメントを表示しているウィンドウを指しています。zoomPercentageプロパティはこのactiveWindowが持っているのです。
このzoomPercentageプロパティに数値を代入すれば、それがそのままドキュメントの表示拡大率になります。今回は200%表示としてましたが、この辺は好みで調整できます。

if (!confirm ("斜線のオーバープリントをオンにしますか?", true)) continue;

最後のこれが「はい・いいえ」の選択をさせるconfirmメソッドです。第一引数に表示させる文字列、第二引数に真偽値(true/false)を渡します。第二引数は省略可能で、その場合はfalseがデフォルトです。
この第二引数が何を表すかというと、「はい」と「いいえ」ボタンの配置、というかどちらにハイライトさせた状態で表示するかです。これをfalseとすると「はい」がハイライトされた状態のウィンドウが表示されるので、作業者はマウスを使わずともEnterキーを押しまくればすべての処理が完了します。

confirm ("第二引数がtrueのとき", true);

f:id:uske_S:20170726101153p:plain

confirm ("第二引数がfalseのとき", false); //このfalseは省略しても同じ

f:id:uske_S:20170726101158p:plain
しかし「例外を飛ばしたかったのに間違ってEnterを押してしまった…」ということがままあるわけです。
個人的には、こういうconfirmの使い方の場合は常にtrueを推奨します。というのも、意図せずスクリプトが実行されてしまったケースと、意図せず飛ばしてしまったというケースであれば、圧倒的に後者のほうが被害が少ないからです。後者ならば改めてスクリプトを実行すればいいだけですが、前者の場合、Undoで戻りきれないスクリプトも中にはあるので、そのような場合は最悪ドキュメントの復帰が必要になることもあるからです。
また、confirmメソッドの戻り値は「はい」が押されればtrue、そうでなければfalseです。なので一般的には下記のようになります。

if (confirm ("設問………")){
    //「はい」が押されたときの処理
    }

ただこれだとネスト(入れ子の{ })がひとつ増えてしまうので、前述のコードではif文の中の真偽値を反転しています。つまりif文の中がfalseなら…という条件文にしているわけです。一応自分なりのネストを減らす工夫です。
コードではこのif文がfor文の中にあるので、if文の中の条件式の評価(コードではconfirmメソッドの戻り値)がfalseだったらcontinueする、という処理になっています。

というわけで、ひとつずつ確認しながら処理するやり方でした。選択、画面遷移、confirmという流れを覚えておいてください。