コンポジションにあらかじめテロップ用のレイヤーを作成する TEXT1、TEXT2 など

WAVファイルを並べ終わって、コンポジションを選択した状態で下記を実行

CopyLayerNames.jsx

// 選択しているコンポジションのレイヤー名を取得し、aepファイルと同じディレクトリにテキストファイルを生成するスクリプト

(function () {
    function getLayerNamesFromComp(comp) {
        var layerNames = [];
        for (var i = 1; i <= comp.numLayers; i++) {
            layerNames.push(comp.layer(i).name);
        }
        return layerNames;
    }

    function saveToFile(layerNames, filePath) {
        var file = new File(filePath);
        if (file.open("w")) {
            file.write(layerNames.join("\n"));
            file.close();
            // 出力ファイルを開く場合
            file.execute();
            return true;
        } else {
            return false;
        }
    }

    // スクリプトのメイン処理
    app.beginUndoGroup("Save Layer Names to File");

    var activeItem = app.project.activeItem;

    if (activeItem && activeItem instanceof CompItem) {
        var layerNames = getLayerNamesFromComp(activeItem);
        if (layerNames.length > 0) {
            var projectFile = app.project.file; // 現在のプロジェクトファイル (.aep)
            if (projectFile) {
                var projectPath = projectFile.path; // .aepファイルのディレクトリ
                var textFilePath = projectPath + "/" + "Info_LayerNames_" + activeItem.name + ".txt";

                if (saveToFile(layerNames, textFilePath)) {
                    alert("レイヤー名が以下のファイルに保存されました:\n" + textFilePath);
                } else {
                    alert("ファイルの保存に失敗しました。");
                }
            } else {
                alert("プロジェクトファイルが保存されていません。プロジェクトを保存してください。");
            }
        } else {
            alert("選択したコンポジションにレイヤーがありません。");
        }
    } else {
        alert("コンポジションを選択してください。");
    }

    app.endUndoGroup();
})();

telop_imp.csv を作成する

AudioLayer	TextLayer	Telop

WAVのレイヤー名をコピーしてAudioLayer 列に貼り付ける 下記のようなCSVファイルを作成する

AudioLayer	TextLayer	Telop
07_03_また、逢いましょう。_タカハシ.wav	TEXT3	また、逢いましょう
06_02_さよなら_タカハシ.wav	TEXT1	さよなら
05_01_ありがとう!_タカハシ.wav	TEXT3	ありがとう
04_00_こんにちわ_タカハシ.wav	TEXT2	こんにちわ
03_また、逢いましょう。_タカハシ.wav	TEXT1	また、逢いましょう
02_さよなら_タカハシ.wav	TEXT3	さよなら
01_ありがとう!_タカハシ.wav	TEXT2	ありがとう
00_こんにちわ_タカハシ.wav	TEXT1	こんにちわ

コンポジションを作成して下記を実行する

telopFromCsv.jsx

(function () {
    // 現在選択しているコンポジションを取得
    var comp = app.project.activeItem;

    // コンポジションが選択されていることを確認
    if (comp && comp instanceof CompItem) {
        app.beginUndoGroup("Create Telop Text Layers");

        // オーディオファイルのレイヤー情報を格納する配列
        var audioLayerData = [];

        // コンポジション内のレイヤーを確認
        for (var i = 1; i <= comp.numLayers; i++) {
            var layer = comp.layer(i);

            // オーディオファイルレイヤーを探し、その情報を配列に格納
            if (layer instanceof AVLayer && layer.hasAudio) {
                audioLayerData.push({
                    name: layer.name,
                    inPoint: layer.inPoint,
                    outPoint: layer.outPoint,
                    index: i  // レイヤーのインデックス
                });
            }
        }

        // ファイル選択ダイアログでCSVファイルを選択
        var csvFile = File.openDialog("CSVファイルを選択してください", "*.csv");

        if (!csvFile) {
            alert("CSVファイルが選択されていません。");
            app.endUndoGroup();
            return;
        }

        var telopData = [];
        csvFile.open("r");

        // ヘッダ行をスキップ
        csvFile.readln();

        // CSVを読み込み、配列に格納
        while (!csvFile.eof) {
            var line = csvFile.readln();
            var columns = line.split(",");
            telopData.push({
                audioLayer: columns[0],
                textLayer: columns[1],
                telop: columns[2]
            });
        }

        csvFile.close();

        // telopDataの順番を逆にする
        telopData.reverse();

        // 新しいレイヤーが既存のインデックスを保ちながら追加されるように設定
        var currentLayerIndex = comp.numLayers;  // 新しいレイヤーを追加するインデックス

        // CSVデータに基づいてテキストレイヤーを複製し、テキストを変更
        for (var j = 0; j < telopData.length; j++) {
            var data = telopData[j];

            // オーディオレイヤーを検索 (findの代わりにforループで手動で検索)
            var audioLayer = null;
            for (var k = 0; k < audioLayerData.length; k++) {
                if (audioLayerData[k].name === data.audioLayer) {
                    audioLayer = audioLayerData[k];
                    break;
                }
            }

            if (!audioLayer) {
                alert("オーディオレイヤー '" + data.audioLayer + "' が見つかりません。");
                continue;
            }

            // 対応するテキストレイヤーを探す
            var textLayer = comp.layer(data.textLayer);
            if (!textLayer) {
                alert("テキストレイヤー '" + data.textLayer + "' が見つかりません。");
                continue;
            }

            // テキストレイヤーを複製
            var newTextLayer = textLayer.duplicate();
            newTextLayer.name = data.telop;

            // 複製したテキストレイヤーのインポイントとアウトポイントを設定
            newTextLayer.inPoint = audioLayer.inPoint;
            newTextLayer.outPoint = audioLayer.outPoint;

            // テキストの内容を変更
            newTextLayer.text.sourceText.setValue(data.telop);

            // 新しいレイヤーをコンポジションの一番上に移動
            newTextLayer.moveToBeginning();
        }

        app.endUndoGroup();
    } else {
        alert("コンポジションを選択してください。");
    }
})();