選択レイヤーへ同じ長さの表示区間を割り当てるには、この記事のJSXでワークエリアを分割します。コンポ全体に割り付ける場合は、先にワークエリアをコンポの先頭から末尾まで設定してください。
このスクリプトは、レイヤーを時間上で移動したうえでイン/アウトポイントを設定します。映像の再生速度を変えたり、キーフレームを区間内へ縮めたりする処理ではありません。
開始時刻を等間隔にずらす、または既存の長さのまま端をつなぐ場合は、標準機能を使い分けます。
| やりたいこと | 標準機能 |
|---|---|
| 選んだレイヤーの時間位置を等間隔にずらす | クイックオフセット |
| レイヤーを端と端でつないで並べる | アニメーション/キーフレーム補助/シーケンスレイヤー |
| 重ねてトランジションを入れる | シーケンスレイヤーの「オーバーラップ」 |
ワークエリアを指定して区間を割り付ける場合は、下のスクリプト例を試せます。
まず標準機能を試してから、必要ならスクリプトを使ってください。
ワークエリアを3つの区間に分ける練習
別名保存した練習コンポジションへ色の異なるソリッド(平面)を3枚置き、ワークエリアを0〜6秒にします。以下の実機例は960×540、30fps、コンポの長さ8秒です。レイヤー名を上からBox1、Box2、Box3にすると結果を追いやすくなります。
3枚を選択し、タイムラインの上からの番号と各レイヤーの開始・イン・アウトポイントを記録します。
下のコードをdistribute.jsxとしてUTF-8で保存し、「ファイル」→「スクリプト」→「スクリプトファイルを実行」から実行します。
対象は選択したレイヤーだけで、タイムラインの上からの順に0〜2秒、2〜4秒、4〜6秒へ割り付けます。
元のインポイントが1秒なら、startTimeへ目標開始を直接代入せず、インポイントの移動量を加えてから区間を設定します。
並びを逆にする場合は、冒頭のREVERSEをtrueにします。
逆順でも各区間の開始は終了より前になります。
割り切れないフレーム数では区間の長さに最大1フレームの差が出ます。
たとえば10フレームを3枚へ分けると3・3・4フレームです。
コードには、ロック、100%以外の伸縮、タイムリマップ、1枚あたり1フレーム未満、素材の長さ不足を検出して変更前に止める判定があります。今回実機で確かめた停止条件は、3枚に対してワークエリアが2フレームしかない場合です。
まずソリッドで確認し、実動画は元素材の表示範囲とアニメーションも実機で比べてください。
取り消す場合は、実行直後にCtrl+Z(Windows)/Command+Z(macOS)を使います。意図しない結果になったら追加操作を続けず、元の時刻と照合してください。途中でエラーが出た場合は一部のレイヤーだけ変更されている可能性があるため、保存したコピーも残しておきます。
| 確認すること | 期待する結果 | 違ったとき |
|---|---|---|
| 6秒・3レイヤー | 各2秒の連続区間 | ワークエリアの範囲を確認 |
| 逆順 | 順番のみ反転 | in/outを交換しない |
| 素材が足りない | 変更前に停止 | 素材長と開始を確認 |
Windows実機で確認した配置結果
2026年10月14日、Windows 11 Pro(OSビルド26200)・After Effects 2026、26.5×89(Build 89)で掲載JSXを実行しました。3枚とも開始時刻startTime=0秒、イン=1秒、アウト=5秒とし、不透明度へ1秒=20%、2秒=80%のキーを入れた状態から確認しています。
ワークエリア0〜6秒では、上からイン/アウトが0〜2秒、2〜4秒、4〜6秒になりました。startTimeはそれぞれ−1秒、1秒、3秒です。元のインポイント1秒を目標へ移動するため、先頭レイヤーのstartTimeが負になりますが、表示区間のインは0秒です。

不透明度のキー時刻も、上から0・1秒、2・3秒、4・5秒へ移動しました。直後にCtrl+Zを1回押すと、3枚ともstartTime=0秒、イン=1秒、アウト=5秒、キー=1・2秒に戻りました。REVERSE=trueでは、Box3が0〜2秒、Box2が2〜4秒、Box1が4〜6秒となり、区間の開始と終了が逆転することはありませんでした。
次にワークエリアを1秒から10フレームへ変更して通常順で実行すると、開始フレーム30・33・36、終了フレーム33・36・40となりました。長さは3・3・4フレームです。この表記の終了は次の区間との境界で、たとえば最初の区間に含まれるのは30〜32フレームです。
この短い区間でもキー同士の間隔は1秒のままでした。最後のキーは各レイヤーのアウトポイントより後ろに残ります。アニメーション全体を短い区間内に収めたい場合は、配置後にキーの時刻を別途調整してください。スクリプトだけでは動きの尺を圧縮できません。
3枚に対してワークエリアを2フレームにすると、1枚あたり1フレーム以上が必要という警告が表示され、3枚のstartTime・イン・アウト・キー時刻は直前の値を保ちました。警告が出たら、まずワークエリアのフレーム数と選択枚数を確認します。
実動画の素材長不足、ロック・伸縮・タイムリマップの各停止条件、他バージョン・macOSは今回の実機確認に含めていません。動画へ使う前に複製したコンポで元素材の範囲、音声、キーが表示区間に収まるかを確認してください。
標準機能で等間隔に並べる(クイックオフセット)
選んだレイヤーの間隔を、ドラッグひとつで揃えられます。
- 並べたいレイヤーを、順番を意識して選ぶ
- Windowsは Ctrl + Alt、macOSは Command + Option を押しながらレイヤーをドラッグする
最初に選んだレイヤーはその場に残ります。
最後に選んだレイヤーがドラッグした距離ぶん動きます。
間にあるレイヤーは、その2つの間に時間的に均等に配置されます。
Adobeの説明では、レイヤーの移動に伴ってキーフレームもシフトします。ただし、他のレイヤーとの同期や式が参照するコンポ時刻まで保たれるとは限らないため、配置後に再生して確認してください。
選ぶ順番がそのまま並び順になるので、順不同で選べばばらけた配置にもできます。
端と端をつないで並べる(シーケンスレイヤー)
動画やカットを順番に並べたい場合は、こちらです。
- 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行へ置き換えてから、スクリプト全体を実行します。
参考資料・関連記事
After Effectsのほかの操作は、まとめからご覧いただけます。

標準機能の説明は、2026年10月14日にAdobe公式ヘルプ「レイヤーの選択と配置」で確認しました。クイックオフセットとシーケンスレイヤーの操作説明はこの一次情報に基づきます。今回の独自検証は掲載JSXの配置結果と取り消しです。
以前の実装は、GitHubのMOTOKI-LLC/cg-method-codeを参考にできますが、本稿の修正版とは異なります。
レイヤーやテキストを揃えるスクリプトは、ほかにもあります。




