遊技機案件でプレビュー的なコンポジションに打ったマーカーを他のコンポジションにコピーする機会が結構あったのでスクリプトを作りました。
いつでもどこでも使えるように記事に残して置きたいと思います。
スクリプトの使い方&機能説明
■スクリプト機能
・指定したコンポジションのマーカーを、別のコンポジションへコピーします。
・コピーしたい範囲を指定することも出来ます。
■導入方法
・「Scripts」フォルダに入れてください。※ファイル名は任意で、拡張子は「jsx」にして下さい。
【Scriptsフォルダパス】
Windows:Program Files\Adobe\Adobe After Effects \Support Files\Scripts
macOS:Applications/Adobe After Effects \Scripts
■使用方法
1.AfterEffectのメニューバーにある「ファイル → スクリプト」から、このスクリプトを選択します。
3.小さなウィンドウが出現するので「コピー元のコンポジション名」と「コピー先のコンポジション名」を入力してください。コピーしたい範囲を指定することも出来ます。
4.OKボタンを押してください。
■更新履歴
・2025/07/03 新規作成
// スクリプトの説明:指定したコンポジションのマーカーを、別のコンポジションへコピーします。
// 導入方法:このファイルを「Scripts」フォルダに入れてください。ファイル名は任意で、拡張子は「jsx」にして下さい。
// 作成者: kita
// 日付: 2025/07/03
function showInputDialog() {
var dialog = new Window("dialog", "マーカーコピー設定");
dialog.orientation = "column";
dialog.alignChildren = "left";
dialog.add("statictext", undefined, "コピー元コンポジション名:");
var sourceInput = dialog.add("edittext", undefined, "");
sourceInput.characters = 30;
dialog.add("statictext", undefined, "コピー先コンポジション名:");
var targetInput = dialog.add("edittext", undefined, "");
targetInput.characters = 30;
dialog.add("statictext", undefined, "開始フレーム(空欄で0):");
var startFrameInput = dialog.add("edittext", undefined, "");
startFrameInput.characters = 10;
dialog.add("statictext", undefined, "終了フレーム(空欄で最後まで):");
var endFrameInput = dialog.add("edittext", undefined, "");
endFrameInput.characters = 10;
var buttonGroup = dialog.add("group");
buttonGroup.alignment = "right";
var okBtn = buttonGroup.add("button", undefined, "OK", { name: "ok" });
var cancelBtn = buttonGroup.add("button", undefined, "キャンセル", { name: "cancel" });
if (dialog.show() !== 1) return null;
return {
sourceName: sourceInput.text,
targetName: targetInput.text,
startFrame: startFrameInput.text,
endFrame: endFrameInput.text
};
}
function copyMarkersUI() {
var input = showInputDialog();
if (!input) return;
var proj = app.project;
app.beginUndoGroup("Copy Markers");
var sourceComp = null;
var targetComp = null;
for (var i = 1; i <= proj.numItems; i++) {
if (proj.item(i) instanceof CompItem) {
if (proj.item(i).name === input.sourceName) {
sourceComp = proj.item(i);
}
if (proj.item(i).name === input.targetName) {
targetComp = proj.item(i);
}
}
}
if (sourceComp && targetComp) {
var markers = sourceComp.markerProperty;
var fps = sourceComp.frameRate;
var startTime = input.startFrame ? parseInt(input.startFrame) / fps : 0;
var endTime = input.endFrame ? parseInt(input.endFrame) / fps : sourceComp.duration;
for (var i = 1; i <= markers.numKeys; i++) {
var time = markers.keyTime(i);
if (time >= startTime && time <= endTime) {
var value = markers.keyValue(i);
var newMarker = new MarkerValue(value.comment);
newMarker.duration = value.duration;
newMarker.cuePoint = value.cuePoint;
newMarker.chapter = value.chapter;
newMarker.url = value.url;
newMarker.frameTarget = value.frameTarget;
targetComp.markerProperty.setValueAtTime(time, newMarker);
}
}
alert("マーカーをコピーしました。");
} else {
alert("指定されたコンポジションが見つかりません。");
}
app.endUndoGroup();
}
copyMarkersUI();
ご利用にあたっての注意事項
- 本スクリプトは無保証で提供されています。
- ご利用は自己責任でお願いいたします。
- スクリプトの使用によって発生したいかなる損害についても、作者は責任を負いません。
- 改変・再配布等はご自由にどうぞ(クレジット表記は不要です)。
- バグ報告や改善要望は歓迎しますが、必ず対応できるとは限りません。