元の設問はこちら。
さて、今回は機能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行です。ちなみに、実行するとこんな感じです。
ひとつずつ確認できるので、部分的に処理を省きたい場合や、一律で処理してしまうのが不安な場合など、けっこういろいろな場面で活躍します。
順を追って追加した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);
confirm ("第二引数がfalseのとき", false); //このfalseは省略しても同じ
しかし「例外を飛ばしたかったのに間違ってEnterを押してしまった…」ということがままあるわけです。
個人的には、こういうconfirm
の使い方の場合は常にtrue
を推奨します。というのも、意図せずスクリプトが実行されてしまったケースと、意図せず飛ばしてしまったというケースであれば、圧倒的に後者のほうが被害が少ないからです。後者ならば改めてスクリプトを実行すればいいだけですが、前者の場合、Undoで戻りきれないスクリプトも中にはあるので、そのような場合は最悪ドキュメントの復帰が必要になることもあるからです。
また、confirm
メソッドの戻り値は「はい」が押されればtrue
、そうでなければfalse
です。なので一般的には下記のようになります。
if (confirm ("設問………")){ //「はい」が押されたときの処理 }
ただこれだとネスト(入れ子の{ })がひとつ増えてしまうので、前述のコードではif文の中の真偽値を反転しています。つまりif文の中がfalse
なら…という条件文にしているわけです。一応自分なりのネストを減らす工夫です。
コードではこのif文がfor文の中にあるので、if文の中の条件式の評価(コードではconfirm
メソッドの戻り値)がfalse
だったらcontinue
する、という処理になっています。
というわけで、ひとつずつ確認しながら処理するやり方でした。選択、画面遷移、confirm
という流れを覚えておいてください。