選択した複数レイヤーの開始点または終了点を、現在の時間にまとめて揃えるスクリプトです。INは終了点を維持して開始側を切り詰め、OUTは開始点を維持して終了側を切り詰めます。
選択レイヤーのイン/アウトポイントを現在の時間に変更する標準のショートカットは以下の通りです。
Alt+[
Alt+]ボタンから呼び出したい場合は、以下の.jsxを利用できます。本稿のOUTはoutPointに現在時刻を設定するため、その時刻のフレームは表示区間に含みません。標準ショートカットと終了フレームの扱いを同一と考えず、結果の区間を確認してください。
現在時刻でINとOUTを別々に確認する練習
別名保存した練習コンポジションで、ソリッドのインポイントを0.5秒、アウトポイントを2秒にし、現在時刻を1秒へ移動します。
IN用のコードをset-in.jsx、OUT用をset-out.jsxとしてUTF-8で別々に保存します。
「ファイル」→「スクリプト」→「スクリプトファイルを実行」から対象のコードを選びます。
INの例では1〜2秒、OUTの例では0.5〜1秒になることを確認します。
2つを続けて実行せず、それぞれ元の練習コピーから試してください。
現在時刻が選択レイヤーの区間外、ロック中、開始と終了が同じになる場合は全体を変更前に止めます。
このスクリプトは現在の表示区間を切り詰める例で、素材の尺を延ばす用途は扱いません。
下の伸縮を100%へ戻す補足では、元のstartTimeをinPointとして代用せず、変更前のin/outを保存します。
補足例の対象は正の伸縮・タイムリマップなし・静止画やソリッドなどの静止素材だけです。
表示区間の保持と、キーや素材の再生速度の保持は別に確認してください。
終了後はCtrl+Z/Command+Zで0.5〜2秒に戻るか確認し、元コピーを開きます。
| 確認すること | 期待する結果 | 違ったとき |
|---|---|---|
| IN・現在1秒 | 1〜2秒 | 元のoutを確認 |
| OUT・現在1秒 | 0.5〜1秒 | 元のinを確認 |
| 現在時刻が区間外 | 変更しない | 選択と現在時刻を確認 |
Windows実機で確認した境界と取り消し
2026年10月15日、Windows 11 Pro(10.0.26200)・After Effects 26.5 Build 89で、640×360、30 fps、3秒の練習コンポジションと2枚のソリッドを使って確認しました。両方を0.5〜2秒、現在時刻を1秒にして、INとOUTを別々に実行しています。
INは2枚とも1〜2秒、OUTは0.5〜1秒になり、それぞれCtrl+Zを1回押すと2枚とも0.5〜2秒へ戻りました。OUT後の1秒の画面にはソリッドが映りません。


現在時刻が0.25秒で区間外の場合、INを終了点の2秒で実行した場合、OUTを開始点の0.5秒で実行した場合は、警告で止まり2枚とも変更されませんでした。ロックしたレイヤーを含む選択と、レイヤー未選択でも処理を止めることを確認しました。警告が出たら、全レイヤーに正の長さが残る時刻へ移し、対象の選択とロックを確認してください。
INでは、inPointだけを0.5秒から1秒へ変更すると、今回の環境ではoutPointも2秒から2.5秒へ動きました。掲載コードでは変更前のoutPointを保存し、inPoint変更後に戻しています。これにより終了点を保ったまま開始側だけを切り詰めます。
プロパティの意味はAfter Effects Scripting GuideのLayer参照で確認できます。inPointとoutPointの値はコンポジション上の秒数です。
撮影した練習コンポ「LayerInOut17821」の、実行前の画面です。
「Target117821」「Target217821」「Target317821」の3枚を選択し、現在の時間は0:00:02:00(25 fps)でした。
3枚のレイヤーは、タイムラインの左端から右端まで伸びていました。

この画面は、記事の練習(インポイント0.5秒、アウトポイント2秒、現在時刻1秒)とは別の数値の例です。
選択レイヤーのインポイントを現在の時間にするスクリプト
(function () {
var MODE = "IN";
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 = comp.selectedLayers, time = comp.time;
if (!isFinite(time) || time < 0 || time > comp.duration) { alert("Invalid current time."); return; }
for (var i = 0; i < layers.length; i++) {
var layer = layers[i];
if (layer.locked || !isFinite(layer.inPoint) || !isFinite(layer.outPoint) ||
time < layer.inPoint || time > layer.outPoint ||
(MODE === "IN" && time >= layer.outPoint) ||
(MODE === "OUT" && time <= layer.inPoint)) {
alert("Current time must leave a positive interval in every unlocked selected layer. Nothing changed."); return;
}
}
app.beginUndoGroup("Trim selected layers at current time");
try {
for (var j = 0; j < layers.length; j++) {
if (MODE === "IN") { var oldOut = layers[j].outPoint; layers[j].inPoint = time; layers[j].outPoint = oldOut; }
else { layers[j].outPoint = time; }
}
} finally { app.endUndoGroup(); }
})();

インポイントを現在の時間に揃えた後の画面です。
現在の時間は2:00のままで、3枚のレイヤーの開始が、2秒の位置に揃いました。
次の画像は2026年10月13日の別条件の例です。現在の掲載コードで終了点を保持する処理は、上の10月15日の数値検証で確認しています。

選択レイヤーのアウトポイントを現在の時間にするスクリプト
(function () {
var MODE = "OUT";
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 = comp.selectedLayers, time = comp.time;
if (!isFinite(time) || time < 0 || time > comp.duration) { alert("Invalid current time."); return; }
for (var i = 0; i < layers.length; i++) {
var layer = layers[i];
if (layer.locked || !isFinite(layer.inPoint) || !isFinite(layer.outPoint) ||
time < layer.inPoint || time > layer.outPoint ||
(MODE === "IN" && time >= layer.outPoint) ||
(MODE === "OUT" && time <= layer.inPoint)) {
alert("Current time must leave a positive interval in every unlocked selected layer. Nothing changed."); return;
}
}
app.beginUndoGroup("Trim selected layers at current time");
try {
for (var j = 0; j < layers.length; j++) {
if (MODE === "IN") { var oldOut = layers[j].outPoint; layers[j].inPoint = time; layers[j].outPoint = oldOut; }
else { layers[j].outPoint = time; }
}
} finally { app.endUndoGroup(); }
})();

アウトポイントを現在の時間に揃えた画面です。
現在の時間を4:00へ移して実行すると、3枚のレイヤーの区間は、2秒から4秒になりました。
4:00の位置では、3つの平面は映らず、背景だけが見えていました。

使い方の応用
以下は旧実装の応用イメージです。現在の掲載コードは表示区間を切り詰める処理に限り、素材の長さを延ばす操作は含めません。

レイヤーのデュレーションを変えずに伸縮を100%に戻すスクリプト
正の伸縮を100%へ戻し、変更前のインポイントとアウトポイントを設定し直す静止素材用の補足例です。
対象のレイヤーをまとめて選択した状態で、スクリプトを実行します。
対象は静止素材・ロックなし・正の伸縮・タイムリマップなしに限ります。キーの時刻を維持する処理は含めていないため、アニメーション付きのレイヤーでは実行せず、別コピーで確認してください。
(function () {
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 = comp.selectedLayers, plans = [];
for (var i = 0; i < layers.length; i++) {
var layer = layers[i];
if (layer.locked || !(layer.stretch > 0) || layer.timeRemapEnabled ||
!isFinite(layer.inPoint) || !isFinite(layer.outPoint) || layer.inPoint >= layer.outPoint ||
!(layer.source && layer.source.mainSource && layer.source.mainSource.isStill)) {
alert("This example supports unlocked still-source layers with positive stretch only. Nothing changed."); return;
}
plans.push({layer:layer, inside:layer.inPoint, outside:layer.outPoint});
}
app.beginUndoGroup("Reset stretch and preserve visible interval");
try {
for (var j = 0; j < plans.length; j++) {
plans[j].layer.stretch = 100;
plans[j].layer.inPoint = plans[j].inside;
plans[j].layer.outPoint = plans[j].outside;
}
} finally { app.endUndoGroup(); }
})();
実機では、2枚のソリッドの伸縮200%・150%を100%へ戻し、表示区間0.5〜2秒が維持されました。一方、不透明度キーを1秒に置いた200%のソリッドでは、100%へ変更するとキーが0.5秒へ動きました。表示区間の保持は、キーの時刻の保持を意味しません。
After Effectsのほかの操作は、まとめからご覧いただけます。

以前の実装は、GitHubのMOTOKI-LLC/cg-method-codeを参考にできますが、本稿の修正版とは異なります。
レイヤーやテキストを揃えるスクリプトは、ほかにもあります。




