昔の記事やプロジェクトからエクスプレッションをコピーすると、エラーになって動かないことがあります。
原因はエンジンの違いだけではありません。参照先のレイヤーやエフェクトの名前、貼り付けたプロパティの値の数も確認します。本稿は、古い式の構文を現在の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つのエンジン
| JavaScript | Legacy ExtendScript | |
|---|---|---|
| もとにしている規格 | ECMAScript 2018 | ECMAScript 3(1999年) |
| 使える書き方 | let・const・アロー関数など新しい書き方 | 古い書き方だけ |
| 書き方の厳しさ | 厳しい | ゆるい |
エンジンは、プロジェクトごとに「ファイル」→「プロジェクト設定」の「エクスプレッション」タブで切り替えられます。
ただし、古いエンジンに戻すより、式を直すほうがあとで困りません。
よくあるエラーと直し方
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_comp | thisComp |
| this_layer | thisLayer |
| in_point | inPoint |
| out_point | outPoint |
| anchor_point | anchorPoint |
| frame_duration | frameDuration |
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秒 | 50 | time > 1 はまだ偽 |
| 1.1秒 | 100 | 条件が成立 |
数値が変わらない場合は式の有効スイッチと貼付先を確認します。
参照先が存在しないエラーは、構文を直しても残ります。
元に戻すときは練習レイヤーの式を無効にするか、保存した原文を戻します。
プロジェクト全体のエンジンを変更する前に元の設定を記録してください。
READMEの貼付先を確認し、1つずつ練習用プロパティに使います。
AE本体での動作確認は含みません。
まとめ
- 古いエンジン向けの構文、参照先の名前、貼付先の値の数を分けて調べる
- 式の最後は必ず値を返す(if だけで終わらない、関数の宣言で終わらない)
- this ではなく thisLayer、アンダーバーの名前ではなく今の名前を使う
- エンジンを戻すより、どちらでも動く書き方に直す
参考:Adobe「Syntax differences between expression engines」(2026年10月3日に公式資料を確認)。
