アクティブコンポ内のエラーが出ているエクスプレッションを削除します。
以下のコードをテキストにコピーして、拡張子を.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になったプロパティに関しては処理を省く仕様にしてあります。