Amazonで商品を見るセール会場へ

After Effects│エクスプレッションエラーの直し方|JavaScriptエンジンとレガシーの違い

昔の記事やプロジェクトからエクスプレッションをコピーすると、エラーになって動かないことがあります。

原因はエンジンの違いだけではありません。参照先のレイヤーやエフェクトの名前、貼り付けたプロパティの値の数も確認します。本稿は、古い式の構文を現在のJavaScriptエンジンで使うための切り分けを扱います。

  • 今の初期値は JavaScript エンジン(ECMAScript 2018)
  • 古い式は Legacy ExtendScript エンジン(ECMAScript 3)向けに書かれていることがある
  • よくある原因:if だけで終わる、1行の if…else、関数の宣言で終わる、this()、アンダーバーの名前
  • どちらのエンジンでも動く書き方に直すのが確実

この記事は、Adobe公式の「Syntax differences between expression engines」(2026年5月5日更新、2026年10月3日に公式資料を確認)にもとづいています。

After Effectsの画面での再現は含みません。

目次

2つのエンジン

JavaScriptLegacy ExtendScript
もとにしている規格ECMAScript 2018ECMAScript 3(1999年)
使える書き方let・const・アロー関数など新しい書き方古い書き方だけ
書き方の厳しさ厳しいゆるい
Adobe公式の説明をもとに作成

エンジンは、プロジェクトごとに「ファイル」→「プロジェクト設定」の「エクスプレッション」タブで切り替えられます。

ただし、古いエンジンに戻すより、式を直すほうがあとで困りません。

よくあるエラーと直し方

1. if だけで終わっている

Undefined value used in expression (could be an out of range array subscript?)

式の最後が else の無い if だと、JavaScript エンジンではこのエラーになります。

// 動かない
var x = 50;
if (time > 1) {
  x = 100
}
// 修正例:最後の行で結果を返す
var x = 50;
if (time > 1) {
  x = 100;
}
x;

最後に x; を書き、条件が成立しない時間にも結果を返します。不透明度なら1秒ちょうどまで50、1秒を過ぎると100を返す例です。

2. if と else を1行にかっこなしで書いている

Syntax Error: Unexpected token else
// 動かない
if (time > 1) 100 else 50;
// 動く(どれか1つ)
if (time > 1) { 100 } else { 50 };

time > 1 ? 100 : 50;

簡単な分かれ道なら、下の「? :」(三項演算子)がいちばん短く書けます。

3. 関数の宣言で終わっている

Object of type found where a Number, Array, or Property is needed
// 動かない
timesTen(value);
function timesTen(val) {
  return val * 10
}
// 動く
function timesTen(val) {
  return val * 10
}
timesTen(value);

関数を先に書き、最後の行で呼び出して値を返します。

4. this を使っている

this is not a function
// 動かない
this(5)(2).value;

// 動く
thisLayer(5)(2).value;

古いエンジンでは this が thisLayer の省略形でしたが、今は使えません。

5. アンダーバーの名前を使っている

this_comp・in_point のように、単語をアンダーバーでつないだ古い名前は、JavaScript エンジンでは使えません。

古い名前今の名前
this_compthisComp
this_layerthisLayer
in_pointinPoint
out_pointoutPoint
anchor_pointanchorPoint
frame_durationframeDuration
Adobe公式の一覧から抜粋

6. ソーステキストの文字を番号で取り出している

// 動かない
text.sourceText[0]

// 動く
text.sourceText.value[0]

ソーステキストの1文字目を取り出すときは、.value を付けます。

新しいエンジンで楽になったこと

  • ソーステキストでほかのプロパティを参照するとき、.value を付けなくても値が出る
  • let・const・アロー関数・テンプレート文字列など、今のJavaScriptの書き方が使える
  • posterizeTime(0) で、値を0秒の時点に固定できる(AE 16.0以降)

古い版の After Effects でも使う式なら、新しい書き方は避けて、どちらでも動く書き方にしておきます。

エラーの場所を探すコツ

  • エラーが出ると、コンポジションパネルの下に黄色い帯で表示される
  • 式の入力欄の横にある警告のアイコンを押すと、エラーの内容が出る
  • 元の式をテキストに保存し、複製した練習レイヤーで式を短くして、どの行で止まるかを探す
  • 引用符は半角の " を使います。全角の ” と区別し、コピー後も式の入力欄で確認します

たくさんのレイヤーの式をまとめて消したいときは、After Effectsのエクスプレッションをまとめて削除する方法で紹介しています。

不透明度で結果を切り分ける練習

プロジェクトを別名で保存し、練習用レイヤーの不透明度に修正例を1つだけ貼ります。

0秒・1秒・1.1秒を確認します。

「動かない」と記載した例はエラー比較用で、本番の式へまとめて貼らないでください。

入力時刻式の結果確認する条件
0秒50条件より前
1秒50time > 1 はまだ偽
1.1秒100条件が成立

数値が変わらない場合は式の有効スイッチと貼付先を確認します。

参照先が存在しないエラーは、構文を直しても残ります。

元に戻すときは練習レイヤーの式を無効にするか、保存した原文を戻します。

プロジェクト全体のエンジンを変更する前に元の設定を記録してください。

練習用エクスプレッション6本をダウンロードできます。

READMEの貼付先を確認し、1つずつ練習用プロパティに使います。

AE本体での動作確認は含みません。

まとめ

  • 古いエンジン向けの構文、参照先の名前、貼付先の値の数を分けて調べる
  • 式の最後は必ず値を返す(if だけで終わらない、関数の宣言で終わらない)
  • this ではなく thisLayer、アンダーバーの名前ではなく今の名前を使う
  • エンジンを戻すより、どちらでも動く書き方に直す

参考:Adobe「Syntax differences between expression engines」(2026年10月3日に公式資料を確認)。

次に学ぶ・作業環境を選ぶ

学習を続けたい方や、作業環境を整えたい方は、目的に合うガイドをご覧ください。

After Effectsのおすすめ書籍

必要なPCスペック

周辺機器の優先度

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