DTPab

印刷やデザイン、アドビ製アプリやスクリプトなど、雑多な技術ブログ

Undoが効かないコマンドを実行する前に一旦確認したい

代表格が「ストーリーの再計算」、「ブックの同期」などでしょうか。
このコマンドを実行してしまうと、もう戻せません。何かあっても手遅れです。最悪はバックアップから拾い上げたりしなくちゃならなくなります。
これは余談ですが、(限定的な状況で)Macでストーリーの再計算をやったときと、Windowsでそれをやったときとで結果が変わることがあります。その上、その状況でMacで再計算を繰り返すとその都度文字組み結果が変わるというきな臭い話*1もあります。

そこでこういったUndoが効かないコマンドが実行される前に、それ本当に実行してもいいの?と確認するスクリプトです。
警告文が出てもそれでもそのコマンドを実行するんだ!という場合は「はい」、いや手違いだったのでキャンセルしたいという場合は「いいえ」を押すと動作を中断してなかったことにできます。
確認対象とするコマンドは、お好みで変えるなり増やすなりしてください。

#targetengine "preventDefEvents"

//{'menu': [menuActionsのコマンド名], 'notice': 警告文} という体裁で配列に記述
var myPrevetnEvents = [
    {'menu': "全ストーリーを再計算", 'notice': "全ストーリーを再計算します。\\r実行してよろしいですか?"},
    ];

for (var i=0; i<myPrevetnEvents.length; i++){
    try {
        var str = '\
        (function(){\
            app.menuActions.itemByName("'+myPrevetnEvents[i].menu+'").addEventListener("beforeInvoke", function(event){\
                if(!confirm("'+myPrevetnEvents[i].notice+'",true)) {\
                    alert("中断します");\
                    event.preventDefault();\
                    }\
                });\
            }());';
        eval (str);
        }
    catch(e){}
    }

使い方は、StartupScriptに放り込んでおくだけです。
あとはInDesignがひたすらそのメニューを待ちます。

で、確認対象とするアクション(これはメニューアクションと呼ばれます)は何があるのかというと、ここに一覧があります。

menuActionTitleToString

表の左側、menuActionTitleの列がメニュー名です。
任意のメニュー名を、下記の要領で書いてください。

//{'menu': [menuActionsのコマンド名], 'notice': 警告文} という体裁で配列に記述
var myPrevetnEvents = [
    {'menu': "全ストーリーを再計算", 'notice': "全ストーリーを再計算します。\\r実行してよろしいですか?"},//このカンマ必須です
    {'menu': "確認対象としたいコマンド名", 'notice': "そのコマンドが実行された際の警告文"]},
    ];

{}は必ずカンマで区切ってくださいね。

*補足*
InDesignのバージョンなどによって、上記のサイトの文言とコメンド名が違うケースも考えられます。
そういう場合はスクリプトからメニュー名を調べたり、KeyStringを使ったり、IDを特定したり…という方法を採るのですが、今回は割愛しました。

*1:Mac版InDesignCS6でストーリーの再計算を行う度に文字組みの処理結果が変わる。あさうすさんのこの記事より。

InDesignではCS6から単数行コンポーザーの結果が変わる - 実験る~む