【AfterEffect】マーカーをコピーするスクリプト

AfterEffect

遊技機案件でプレビュー的なコンポジションに打ったマーカーを他のコンポジションにコピーする機会が結構あったのでスクリプトを作りました。
いつでもどこでも使えるように記事に残して置きたいと思います。


スクリプトの使い方&機能説明             

■スクリプト機能
・指定したコンポジションのマーカーを、別のコンポジションへコピーします。
・コピーしたい範囲を指定することも出来ます。

■導入方法
・「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();

ご利用にあたっての注意事項

  • 本スクリプトは無保証で提供されています。
  • ご利用は自己責任でお願いいたします。
  • スクリプトの使用によって発生したいかなる損害についても、作者は責任を負いません。
  • 改変・再配布等はご自由にどうぞ(クレジット表記は不要です)。
  • バグ報告や改善要望は歓迎しますが、必ず対応できるとは限りません。

タイトルとURLをコピーしました