AEのスクリプトはES3準拠。しかし何時からかスクリプトに標準でJSONが使えたり、配列にmapやfilterやindexOfが使えるようになっている...?
実際に使えるようになっているのですが、実はここには大きな落とし穴が。
(function(){
var a = [1, 2, 3];
var b = a.map(function(d){return d * 2});
$.writeln(a);
$.writeln(b);
}());
1,2,3
2,4,6
結果 : undefined
前述のとおりAEのスクリプトはES3準拠なので配列に関してはいわゆるポリフィルが行われているのですが、このポリフィルが行われているタイミングに問題があります。
ポリフィルがどこで行われているかというと、AE2023の場合標準の拡張機能であるCCライブラリのファイル群である
C:\Program Files\Adobe\Adobe After Effects 2023\Support Files\Libraries\jsx\shims.jsx
というファイルで、isArray、indexOf、filter、mapがポリフィルされてるのですが、このファイルは
CCライブラリを開いたときに実行されるようになっているのです。
CCライブラリを開くとポリフィルされるということは、AEを終了するときにCCライブラリが開いた状態になっていると次回起動時もCCライブラリを開くのでポリフィルされるのですが、CCライブラリを閉じた状態でAEを終了すると次回起動時にCCライブラリを開かないのでポリフィルされないということになります。
AE起動後に一度でもCCライブラリを開くとその後CCライブラリを閉じても大丈夫なのですが、次回起動時にはCCライブラリが開かないのでポリフィルされません。
このせいで自分のPCで動作しても他人のPCでは動作しなかったり、ある日自分が書いたスクリプトが動かないという現象が発生します。
Folder.appPackage
でSupport Filesフォルダまでを取得できるので、CCライブラリがあるAEをターゲットとするなら、下記のように自分のスクリプトから呼び出してしまうというのもありだと思います。
var shims_file = new File(Folder.appPackage.fsName + '/Libraries/jsx/shims.jsx');
if(shims_file.exists) $.evalFile(shims_file);
ポリフィルだけではなくCCライブラリを開くとJSONも使えるようになっており、AE2023では以下の場所にあります。
C:\Program Files\Adobe\Adobe After Effects 2023\Support Files\Libraries\jsx\json2.jsx
標準でJSONが使えると思わせておきながら使えるようになっているのはCCライブラリを開いているおかげという罠が用意されているので以下のようにしておくのもよいかもしれません。
var json_file = new File(Folder.appPackage.fsName + '/Libraries/jsx/json2.jsx');
if(json_file.exists && (typeof JSON !== 'object')) $.evalFile(json_file);
JSONはjson2.jsをそのままincludeして使ってる人も多いと思うのであまり問題は無さそうですが、標準で使えると思わせてる罠にひっかかると配布時にややこしいことになるので気を付けてみてくださいー。
追記
拡張機能用のフォルダC:\Program Files\Common Files\Adobe\CEP\extensionsに各AEバージョンごとのCCライブラリの実態が入っているようで、その中にあるjsxフォルダにもshims.jsxやjson2.jsxが入っているようです。
もしかしたらこっちのほうを実行しているのかもしれないですが、CCライブラリを開かないとポリフィルもJSONも有効にならないのは変わらないようなので上記対応でも問題ないと思います。