昔の記事やプロジェクトからエクスプレッションをコピーすると、エラーになって動かないことがあります。
原因はエンジンの違いだけではありません。参照先のレイヤーやエフェクトの名前、貼り付けたプロパティの値の数も確認します。本稿は、古い式の構文を現在のJavaScriptエンジンで使うための切り分けを扱います。
- 今の初期値は JavaScript エンジン(ECMAScript 2018)
- 古い式は Legacy ExtendScript エンジン(ECMAScript 3)向けに書かれていることがある
- よくある原因:条件が偽のとき値を返さない末尾のif、区切りが不正なif…else、末尾の関数宣言、this()、古いアンダーバーの名前
- どちらのエンジンでも動く書き方に直すのが確実
この記事は、Adobe公式の「Syntax differences between expression engines」(2026年5月5日更新、2026年10月3日に公式資料を確認)にもとづいています。
2026年10月14日、Windows 11 Pro(OSビルド26200)・After Effects 26.5(26.5×89、Build 89)のJavaScriptエンジンで、以下の構文例を実際に評価しました。古いエンジンと別バージョンでの動作は未検証です。
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?)この例では、条件が成立しない時刻に最後のifから値が得られず、未定義の値のエラーになりました。今回の実測では0秒・1秒で発生し、条件が成立する1.1秒ではエラーが消えました。ある時刻で動くだけでは、式全体が正しいとは判断できません。
// 動かない
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 の区切りが不正になっている
Syntax Error: Unexpected token else// 動かない
if (time > 1) 100 else 50;// 動く(どれか1つ)
if (time > 1) { 100 } else { 50 };
time > 1 ? 100 : 50;この修正前の例は、100とelseの間に文の区切りがありません。波括弧を使って各分岐を囲むと区切りが明確になります。波括弧を省いたifがすべて不正なわけではありません。簡単な条件分岐なら、下の「? :」(三項演算子)でも書けます。
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;上のコードはAdobe資料にある省略形の置き換え例です。ただし、thisLayerに直すだけで任意のレイヤーで動くわけではありません。今回の平面レイヤーではthis(5)(2)が「this is not a function」、thisLayer(5)(2)が「インデックスが範囲外です」となりました。後者の(5)(2)はプロパティの番号で、対象レイヤーの構造にも依存します。
位置を参照したい場合は、目的が分かる thisLayer.transform.position のような名前による参照を使います。今回、平面のアンカーポイントにこの式を設定すると位置の値を取得でき、エラーはありませんでした。位置を不透明度へ貼ると値の次元が合わないので、貼付先も確認してください。
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 を付けます。文字列ABCDEで比較すると、修正後はAでした。修正前はエラー欄が空でもAにならず、意図しない数値の文字列になりました。警告が消えていることだけでなく、実際の文字も確認してください。
Windows実機で確認したエラーと修正結果
960×540、30fps、3秒の練習コンポジションで、平面の不透明度へifの例を1つずつ設定しました。下は0秒の比較です。修正前は未定義の値の警告が出て、表示された不透明度は元の100%でした。この100%は、式が正常に100を返した証拠ではありません。

末尾にx;を置くと、同じ0秒で50%となり警告が消えました。1秒も50%、1.1秒は100%です。式が返す結果を時刻ごとに確認し、最後に式の有効スイッチを切って元の表示へ戻せることも確認してください。

ほかの例も個別に評価しました。括弧のない1行if…elseは構文エラーになり、括弧付きと三項演算子はどちらも0秒・1秒・1.1秒で50・50・100でした。回転を5度にして関数の例を試すと、宣言で終わる方は型のエラー、最後に呼び出す方は50度でした。in_pointは未定義エラー、inPointは開始時刻0秒を返しました。
存在しないMISSINGというレイヤーを参照する式では、参照先が見つからないエラーになりました。これは末尾の値やifの書き方を直す問題ではありません。レイヤー名を照合し、必要な参照先を復元してください。今回の検証は本文中の構文例が対象で、ダウンロードZIP全体の検証や、すべてのエラー原因の網羅ではありません。
新しいエンジンで楽になったこと
- ソーステキストでほかのプロパティを参照するとき、.value を付けなくても値が出る
- let・const・アロー関数・テンプレート文字列など、今のJavaScriptの書き方が使える
- posterizeTime(0) で、値をコンポジションの0秒の時点に固定できる(AE 16.0以降。JavaScript・Legacy ExtendScriptの両方に対応)
古い版の After Effects でも使う式なら、新しい書き方は避けて、どちらでも動く書き方にしておきます。
エラーの場所を探すコツ
- エラーが出ると、コンポジションパネルの下に黄色い帯で表示される
- 式の入力欄の横にある警告のアイコンを押すと、エラーの内容が出る
- 元の式をテキストに保存し、複製した練習レイヤーで式を短くして、どの行で止まるかを探す
- 引用符は半角の
"を使います。曲がった引用符”と区別し、コピー後も式の入力欄で確認します
たくさんのレイヤーの式をまとめて消したいときは、After Effectsのエクスプレッションをまとめて削除する方法で紹介しています。
エラーの原因を切り分ける順序
古い式がエラーになったときは、次の順に確認すると原因を絞り込めます。
- エラーの内容を読む:コンポジションパネルの下の黄色い帯や、式の入力欄の横の警告アイコンで、どの行で止まっているかを確認します。
- 参照先が存在するか確認する:レイヤー名やエフェクト名が変わっていると、構文を直してもエラーが残ります。
- 構文がエンジンに合っているか確認する:末尾のifが条件の偽のときに値を返さない、if…elseの区切りが不正、末尾が関数宣言、this()や古いアンダーバーの名前を使っている、といった点を確認します。
- 引用符を確認する:半角の引用符になっているかを、コピー後に式の入力欄で確かめます。
- それでも動かないとき:プロジェクトを別名で保存し、練習用レイヤーで式を短くして、どの行で止まるかを探します。
どちらのエンジンでも動く書き方に直しておけば、古い版のAfter Effectsとも共有しやすくなります。
不透明度で結果を切り分ける練習
プロジェクトを別名で保存し、練習用レイヤーの不透明度に修正例を1つだけ貼ります。
0秒・1秒・1.1秒を確認します。
「動かない」と記載した例はエラー比較用で、本番の式へまとめて貼らないでください。
| 入力時刻 | 式の結果 | 確認する条件 |
|---|---|---|
| 0秒 | 50 | 条件より前 |
| 1秒 | 50 | time > 1 はまだ偽 |
| 1.1秒 | 100 | 条件が成立 |
数値が変わらない場合は式の有効スイッチと貼付先を確認します。
参照先が存在しないエラーは、構文を直しても残ります。
元に戻すときは練習レイヤーの式を無効にするか、保存した原文を戻します。
プロジェクト全体のエンジンを変更する前に元の設定を記録してください。
READMEの貼付先を確認し、1つずつ練習用プロパティに使います。
このZIP全体の動作確認は今回の検証に含めていません。本文の実測と区別してください。
まとめ
- 古いエンジン向けの構文、参照先の名前、貼付先の値の数を分けて調べる
- 式の最後は条件が真でも偽でも必要な値を返し、関数宣言だけで終わらないようにする
- this ではなく thisLayer、アンダーバーの名前ではなく今の名前を使う
- エンジンを戻すより、どちらでも動く書き方に直す
参考:Adobe公式:Syntax differences between expression engines(2026年10月14日確認)。構文の仕様と、このページで記載したAE26.5での実測結果を区別しています。
