【AEスクリプト】エラーが出ているエクスプレッションを削除する『DelErrorExps』

アクティブコンポ内のエラーが出ているエクスプレッションを削除します。

以下のコードをテキストにコピーして、拡張子を.jsxにすれば完成です。
右上のマークをクリックすれば全文をコピーできます。

(function () {
    app.beginUndoGroup("DelErrorExps");

    //間違ってプロジェクトパネル内の1アイテムを処理しないよう、一応ビューワーをアクティブにしておく。
    app.activeViewer.setActive();

    var mAi = app.project.activeItem;
    var mLyrs = mAi.layers;
    var mAllValProps = [];
    //hiddenかどうか調べる用の正規表現。
    var mRegExpHdn = new RegExp("hidden");
    //全てのレイヤーからvalueがあるプロップを集める。
    for (var i = 1; i <= mLyrs.length; i++) {
        mAllValProps = mAllValProps.concat(mGetValProps(mLyrs[i]));
    }
    //そのうち、エクスプレッション適用可能かつエラー文が””ではない(つまりエラーが出ている)もののエクスプレッションを””にする。
    for (var i = 0; i < mAllValProps.length; i++) {
        var mProp = mAllValProps[i];
        if (mProp.canSetExpression && mProp.expressionError !== "" && !(mIsHidden(mProp, mRegExpHdn))) {
            mProp.expression = "";
        }
    }

    app.endUndoGroup();
    //--------------------------------------------------
    //--------------------------------------------------
    //レイヤーからvalueがあるプロップを集める関数。
    function mGetValProps(aLyr) {
        var mRstProps = [];
        mFunc(aLyr);

        function mFunc(aProp) {
            if (aProp.propertyType === PropertyType.PROPERTY) {
                mRstProps.push(aProp);
            } else {
                for (var i = 1; i <= aProp.numProperties; i++) {
                    mFunc(aProp(i));
                }
            }
        }
        return mRstProps;
    }
    //プロップがhiddenかどうか調べる関数。キーが全選択になることに注意。
    function mIsHidden(aProp, aRegExpHdn) {
        try {
            aProp.selected = aProp.selected;
            return false;
        } catch (e) {
            return aRegExpHdn.test(e.message);
        }
    }
})();

使い方

jsxを実行すると、現在アクティブなコンポから全てのレイヤーの全てのプロパティを抽出、そのうち、エクスプレッションエラーがでているもののエクスプレッションを消します。

*UIはありません。
*プロジェクト全体が対象ではありません。プロジェクト全体に掛けたい場合は面倒ですが、ビューワー下に出るエラー文の右にある虫眼鏡マークをクリックしてエラーコンポを開き、各コンポにつき一回ずつこのjsxを実行していってください。

*もしも『エラーがあるが表示されていないプロパティ』があれば、それは処理されません。例えば、いったん3Dレイヤーにして”方向”にエクスプレッションを適用、エクスプレッションエラーとなったが3Dスイッチを戻して2Dにしたのでエラーが無くなった、といった場合などです。レイヤースタイルでも起こりがちです。

解説

現在コンポから全てのレイヤーを集め、それらのレイヤーから再帰関数で全てのプロパティを集めています。
そしてそれらプロパティのうち、expressionErrorが””ではないもの(つまりエラーが出ているもの)のエクスプレッションを””にしています。前者の””はエラー文があるか否かのチェック用、後者の””はエクスプレッションを消すための空文字列であり、別物であることに注意してください。

プロジェクト全体版も作ってみたのですが、どうもexpressionErrorが””かどうか(つまりエラーが出ているか否か)は、開いていないコンポだと正常に動作するか運のようです。
これは、エラーありエクスプレッションを含むコンポであっても、開いていなければビューワーにエラー警告が出ないことがあるのに関係しているのだろう、と思います。

あと、hiddenですが、2Dレイヤーの”方向”や適用していないレイヤースタイルなどは『実はレイヤーがすでに持っているが隠しているプロパティ』であり、これらは表示させない限りスクリプトで扱えません。厳密に言うと扱えるんですが、値を変更などができないです。
hiddenでは無くする操作はプロパティによってさまざまで、操作後にいちいち戻すのも実装が現実的ではありません。
そもそもhiddenかどうかを調べるメソッドなども無いため、以下のような判断関数を使っています。
エラーが起こるような処理をして、起こらなければfalse、起こったときにエラー文に”hidden”が含まれていればtrueを返す。
この関数がtrueになったプロパティに関しては処理を省く仕様にしてあります。

参考サイト:
After Effects スクリプトリファレンス

よかったらシェアしてね!
  • URLをコピーしました!