選択したレイヤーの重なりを切り、上のレイヤーの終了を、次に選択されているレイヤーの開始へ合わせるスクリプトです。タイムライン上の順番で処理し、未選択レイヤーと最後の選択レイヤーは変更しません。
レイヤーを移動して隙間を埋める処理や、クロスフェードではありません。アウトポイントだけを変更するため、アニメーションのキーフレームも元の時刻に残ります。
未選択レイヤーを残して重なりを切る練習
練習コンポジションを別名保存し、タイムラインの1番と3番のレイヤーを選択します。
1番を0〜5秒、2番を1〜7秒、3番を3〜6秒にします。2番は選択しないでください。
下のコードをoverlap.jsxとして保存し、対象のコンポジションで「ファイル」→「スクリプト」→「スクリプトファイルを実行」から実行します。
選択したレイヤーをタイムラインの上から順に扱い、1番のアウトポイントを次の選択レイヤーである3番のインポイントへ切り詰めます。
期待する区間は1番が0〜3秒、3番が3〜6秒で、未選択の2番の時刻は変わりません。
クリックした順番や未選択の隣接レイヤーは参照しません。
この例は重なりを切る用途で、隙間を埋めて素材を延長する処理はしません。
2枚未満、変更対象のロック、終了が開始以前になる組み合わせ、延長が必要な組み合わせは変更前に止めます。
Undo処理はfinallyで1回だけ閉じますが、処理中の例外で変更が途中まで進む場合はあります。
例外の後に別方向の変更を試す処理は行わず、Ctrl+Z/Command+Zか元コピーで復元します。
| 確認すること | 期待する結果 | 違ったとき |
|---|---|---|
| 1番と3番を選択 | 1番のoutが3秒 | タイムラインの番号を確認 |
| 2番を未選択 | 元のin/outを維持 | 対象の選択を確認 |
| 隙間を埋める必要あり | 変更前に停止 | 素材を延ばす操作は別途確認 |
Windowsで確認した区間と取り消し
2026年10月14日、Windows 11 Pro(OSビルド26200)・After Effects 26.5(26.5×89、Build 89)で本文のコードを検証しました。960×540、30fps、8秒のコンポジションに3枚の2D平面を置き、3番→1番の順で選択しました。実行後は1番が0〜3秒、2番は1〜7秒、3番は3〜6秒でした。クリック順による逆転はありませんでした。

1番の不透明度に置いた1秒・4秒のキーフレームは、実行後も同じ時刻に残り、開始時間も0秒のままでした。4秒のキーは新しいアウトポイントの外です。したがって、5秒で終わるアニメーションを3秒へ圧縮したい場合には、この処理だけでは足りません。必要なキーの時刻を別途調整してください。
Adobe公式のレイヤーの選択と配置でも、イン/アウトポイントだけの変更ではキーフレームは移動しないと説明されています。トリミングは元の素材ファイルのフレームを削除する操作でもありません。
実行直後にWindowsのCtrl+Zを1回押すと、1番の終了は5秒に戻り、2番・3番の区間とキー時刻は維持されました。これは通常終了した今回の例の結果です。別の編集を挟んだ場合は、その編集から順に取り消されるので履歴を確認してください。
警告が出たときに確認すること
「Open a composition and select at least two layers.」なら、コンポジションを開き、変更したいレイヤーを2枚以上選びます。「Only overlapping, unlocked selected layers can be trimmed. Nothing changed.」なら、変更対象のロック、上下の並び、各レイヤーのイン/アウトポイントを確認します。開始時刻で自動ソートするコードではありません。
実機では、1枚だけの選択、変更対象のロック、上が2秒で終わり下が3秒から始まる隙間、次の開始が上の開始と同じになるケースで、変更されずに警告が出ました。さらに3枚選択し、最初の組は切り詰め可能でも後の組で開始・終了が逆転する条件を作ると、最初のレイヤーも変更されませんでした。コードは全対象の条件を確認してから書き換えます。検証時は警告文をログへ記録しました。
今回確認したのは2D平面と不透明度キーです。動画・音声、タイムリマップ、負の伸縮、別バージョンのAfter Effectsでは未検証です。特に音の繋がりや時間を加工した素材は、コピーで実行し、境界付近を再生してから採用してください。
APIの補足にはコミュニティのLayerリファレンスを参照しています。上記の実測結果と、APIの説明は区別しています。
選択したレイヤーの繋ぎ目の重なりを調整するスクリプト
(function () {
var comp = app.project && app.project.activeItem;
if (!(comp instanceof CompItem) || comp.selectedLayers.length < 2) {
alert("Open a composition and select at least two layers."); return;
}
var layers = [], plans = [], i;
for (i = 0; i < comp.selectedLayers.length; i++) { layers.push(comp.selectedLayers[i]); }
layers.sort(function (a, b) { return a.index - b.index; });
for (i = 0; i < layers.length - 1; i++) {
var layer = layers[i], end = layers[i + 1].inPoint;
if (layer.locked || !isFinite(end) || !isFinite(layer.inPoint) ||
!isFinite(layer.outPoint) || end <= layer.inPoint ||
end > layer.outPoint || Math.abs(end) > 10800) {
alert("Only overlapping, unlocked selected layers can be trimmed. Nothing changed."); return;
}
plans.push({layer:layer, end:end});
}
app.beginUndoGroup("Trim overlap of selected layers");
try {
for (i = 0; i < plans.length; i++) { plans[i].layer.outPoint = plans[i].end; }
} finally { app.endUndoGroup(); }
})();
After Effectsのほかの操作やテクニックは、まとめ記事から確認できます。

以前の実装は、GitHubのMOTOKI-LLC/cg-method-codeを参考にできますが、本稿の修正版とは異なります。
レイヤーやテキストを整列・配置するスクリプトは、ほかにも紹介しています。




