レイヤーをコンポの長さに合わせて均等に配置したい
下の修正版は、選択レイヤーをワークエリアのフレーム数へ割り付けます。
いまのAfter Effectsには、同じことができる標準機能があります。
| やりたいこと | 標準機能 |
|---|---|
| 選んだレイヤーを等間隔に並べ直す | クイックオフセット |
| レイヤーを端と端でつないで並べる | アニメーション/キーフレーム補助/シーケンスレイヤー |
| 重ねてトランジションを入れる | シーケンスレイヤーの「オーバーラップ」 |
ワークエリアを指定して区間を割り付ける場合は、下のスクリプト例を試せます。
まず標準機能を試してから、必要ならスクリプトを使ってください。
ワークエリアを3つの区間に分ける練習
別名保存した練習コンポジションへ色の異なるソリッドを3枚置き、ワークエリアを0〜6秒にします。
3枚を選択し、タイムラインの上からの番号と各レイヤーの開始・イン・アウトポイントを記録します。
下のコードをdistribute.jsxとしてUTF-8で保存し、「ファイル」→「スクリプト」→「スクリプトファイルを実行」から実行します。
対象は選択したレイヤーだけで、タイムラインの上からの順に0〜2秒、2〜4秒、4〜6秒へ割り付けます。
元のインポイントが1秒なら、startTimeへ目標開始を直接代入せず、インポイントの移動量を加えてから区間を設定します。
並びを逆にする場合は、冒頭のREVERSEをtrueにします。
逆順でも各区間の開始は終了より前になります。
割り切れないフレーム数では区間の長さに最大1フレームの差が出ます。
たとえば10フレームを3枚へ分けると3・3・4フレームです。
ロック、100%以外の伸縮、タイムリマップ、1枚あたり1フレーム未満、素材の長さが足りない場合は全体を変更前に止めます。
まずソリッドで確認し、実動画は元素材の表示範囲とアニメーションも実機で比べてください。
終了後は1回のCtrl+Z/Command+Zで各時刻が元へ戻るか確認し、元コピーを開きます。
| 確認すること | 期待する結果 | 違ったとき |
|---|---|---|
| 6秒・3レイヤー | 各2秒の連続区間 | ワークエリアの範囲を確認 |
| 逆順 | 順番のみ反転 | in/outを交換しない |
| 素材が足りない | 変更前に停止 | 素材長と開始を確認 |
2026年10月3日にLayer・CompItem・ApplicationのAPI参照を照合し、ローカルのJavaScriptで境界と選択条件を検証しましたが、AE実機でのプロパティ連動・表示・取り消しは未検証です。
標準機能で等間隔に並べる(クイックオフセット)
選んだレイヤーの間隔を、ドラッグひとつで揃えられます。
- 並べたいレイヤーを、順番を意識して選ぶ
- Windowsは Ctrl + Alt、macOSは Command + Option を押しながらレイヤーをドラッグする
最初に選んだレイヤーはその場に残ります。
最後に選んだレイヤーがドラッグした距離ぶん動きます。
間にあるレイヤーは、その2つの間に時間的に均等に配置されます。
キーフレームも一緒にずれるので、アニメーションは崩れません。
選ぶ順番がそのまま並び順になるので、順不同で選べばばらけた配置にもできます。
端と端をつないで並べる(シーケンスレイヤー)
動画やカットを順番に並べたい場合は、こちらです。
- Ctrl(Windows)またはCommand(macOS)を押しながら、表示したい順にレイヤーを選ぶ
- アニメーション/キーフレーム補助/シーケンスレイヤー を選ぶ
- ダイアログで並べ方を決める
| 設定 | 結果 |
|---|---|
| 「オーバーラップ」を外す | レイヤーの端と端をつないで並べる |
| 「オーバーラップ」を入れてデュレーションを指定 | 指定した長さだけ重ねる |
| デュレーションに負の値を入れる | レイヤーの間に間隔が空く |
重ねる場合は、トランジションも選べます。
選んだレイヤーの透明度を使うなら「前面レイヤーと背面レイヤーをクロスディゾルブ」です。
そうでなければ「前面レイヤーをディゾルブ」を選びます。
並べるレイヤーの長さは、コンポジションより短くしておいてください。
ほかのレイヤーを置く時間が取れなくなるためです。
選択したレイヤーをワークエリアに均等配置するスクリプト
(function () {
var REVERSE = false;
var comp = app.project && app.project.activeItem;
if (!(comp instanceof CompItem) || comp.selectedLayers.length === 0) {
alert("Open a composition and select 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; });
if (REVERSE) { layers.reverse(); }
var start = comp.workAreaStart, length = comp.workAreaDuration;
var frame = comp.frameDuration;
if (!isFinite(start) || !(length > 0) || !isFinite(length) || !(frame > 0) || !isFinite(frame)) {
alert("Invalid work area or frame duration."); return;
}
var firstFrame = Math.round(start / frame);
var lastFrame = Math.round((start + length) / frame);
var count = lastFrame - firstFrame;
if (count < layers.length || Math.abs(firstFrame * frame - start) > 0.00001 ||
Math.abs(lastFrame * frame - start - length) > 0.00001) {
alert("Use frame-aligned work area with at least one frame per layer."); return;
}
for (i = 0; i < layers.length; i++) {
var layer = layers[i];
var targetIn = (firstFrame + Math.floor(i * count / layers.length)) * frame;
var targetOut = (firstFrame + Math.floor((i + 1) * count / layers.length)) * frame;
var shiftedStart = layer.startTime + targetIn - layer.inPoint;
if (layer.locked || layer.stretch !== 100 || layer.timeRemapEnabled ||
!isFinite(shiftedStart) || Math.abs(shiftedStart) > 10800 ||
targetIn < 0 || targetOut > comp.duration) {
alert("Locked, stretched, remapped, or out-of-range layer. Nothing changed."); return;
}
var source = layer.source;
if (source && !(source.mainSource && source.mainSource.isStill)) {
if (!isFinite(source.duration) || targetIn - shiftedStart < -0.00001 ||
targetOut - shiftedStart > source.duration + 0.00001) {
alert("Source does not cover the proposed interval. Nothing changed."); return;
}
}
plans.push({layer:layer, start:shiftedStart, inside:targetIn, outside:targetOut});
}
app.beginUndoGroup("Distribute selected layers in work area");
try {
for (i = 0; i < plans.length; i++) {
var plan = plans[i];
plan.layer.startTime = plan.start;
plan.layer.inPoint = plan.inside;
plan.layer.outPoint = plan.outside;
}
} finally { app.endUndoGroup(); }
})();
並びを逆にしたい場合
並びを逆にする場合は、配列の順序を反転します。
var REVERSE = true;
冒頭の「var REVERSE = false;」をこの1行へ置き換えてから、スクリプト全体を実行します。
おまけ
Twitterで知ったのですが、こちらのスクリプトも便利そうです。
“OneTwoTrim”というスクリプトで、レイヤーを複数選択して実行すると、最初に選んだレイヤーの長さに揃えてくれます。
After Effectsのほかの操作は、まとめからご覧いただけます。

※ 標準機能の操作は、Adobe公式ヘルプ「After Effects でのレイヤーの選択と配置」で2026年9月19日に確認しました。
以前の実装は、GitHubのMOTOKI-LLC/cg-method-codeを参考にできますが、本稿の修正版とは異なります。
レイヤーやテキストを揃えるスクリプトは、ほかにもあります。




