プロジェクトパネルで選択したPNG・JPEGの単一静止画を、TAB区切りの対応表で別ファイルへ置き換える方法です。
素材名と変更先パスを対応させ、変更前に全行を検査します。
コードはローカルのAPI模擬テストで検証しました。
AEでの実際の読み込み・変換設定・画面・Undoは未確認のため、練習用画像と別名保存したプロジェクトで先に確認してください。
コンポを複製しても素材の参照は共有される
このスクリプトはコンポ・素材・ディスク上のファイルを複製しません。
選択した素材アイテムを使う全コンポで参照元が変わります。
元のコンポを残したい場合は、差し替え先の素材を新規読み込みし、複製したコンポの対象レイヤーだけを差し替える方法を使います。
コンポを複製しただけで素材が独立したとは判断しないでください。
プロジェクト全体の素材を同じ対応表で置き換える用途と、複製コンポだけの差し替えは別の作業です。
実行前の確認画面に旧パスと新パスが出るので、共有素材を変更してよいか照合します。
対象になる素材と対応表の作り方
Windowsの、リンクが有効なPNG・JPEGの単一静止画を1〜20個選択します。
動画・画像連番・PSDやAIのレイヤー素材・リンク切れ素材は対象外です。
プロジェクトパネル上の素材名を1列目、存在する画像ファイルの絶対パスを2列目にします。
列の区切りは空白ではなくTAB1文字です。
以下の例では素材名をtest01とtest02に変更して選択し、実際に用意したファイルのパスへ書き換えます。
Excel等で2列を作り、TAB区切りのUTF-8テキストとして保存しても構いません。
test01 C:\AE-practice\new\001.png
test02 C:\AE-practice\new\002.jpg
ヘッダー行、引用符、コメント行は付けません。
素材名とパスの前後の空白も値として扱うため、不要な空白を入れないでください。
| 条件 | 変更前の検査 | 結果 |
|---|---|---|
| 選択素材名が重複 | 名前が一意か | 重複なら変更しない |
| 対応表の不足・重複・未選択名 | 選択素材と1対1か | 全件を変更せず中止 |
| 存在しないパス・相対パス・PSD | 絶対パスとPNG/JPEGか | 全件を変更せず中止 |
| 確認画面でキャンセル | 実行の確認 | 変更しない |
選択静止画を置換するスクリプト
次のコードをUTF-8でreplace-stills.jsxに保存します。
対応表とは別のファイルです。
/* Windows PNG/JPEG stills only. No duplication or disk writes. Native AE pending. */
(function () {
var project = app.project;
if (!project) { alert("プロジェクトを開いてください。"); return; }
var selected = project.selection.slice(0), byName = {}, jobs = [], lines, input;
if (!selected.length || selected.length > 20) {
alert("プロジェクトパネルでPNG/JPEGの静止画を1〜20個選択してください。"); return;
}
function fail(message) { throw new Error(message); }
function raster(name) { return /\.(png|jpe?g)$/i.test(name); }
try {
for (var i = 0; i < selected.length; i++) {
var item = selected[i], key = "name_" + item.name;
if (!(item instanceof FootageItem) || !item.file || !item.file.exists ||
!raster(item.file.name) || !item.mainSource.isStill) {
fail("選択対象はリンクが有効なPNG/JPEGの単一静止画に限定します。");
}
if (byName[key]) fail("選択した素材の名前が重複しています:" + item.name);
byName[key] = item;
}
input = File.openDialog("UTF-8のTSVを選択:素材名[TAB]変更先の絶対パス");
if (!input) return;
input.encoding = "UTF-8";
if (!input.open("r")) fail("TSVを開けません。");
var text;
try { text = input.read(); } finally { input.close(); }
lines = text.replace(/^\uFEFF/, "").split(/\r\n|\r|\n/);
var seen = {};
for (var n = 0; n < lines.length; n++) {
if (!lines[n].length) continue;
var fields = lines[n].split("\t");
if (fields.length !== 2 || !fields[0] || !fields[1]) fail("行" + (n + 1) + "は2列のTAB区切りにしてください。");
var nameKey = "name_" + fields[0], target = byName[nameKey];
if (!target || seen[nameKey]) fail("未選択の素材名、または重複行です:" + fields[0]);
if (!/^(?:[A-Za-z]:[\\/]|\\\\)/.test(fields[1])) fail("Windowsの絶対パスを指定してください。");
var file = new File(fields[1]);
if (!file.exists || !raster(file.name)) fail("変更先は存在するPNG/JPEGにしてください。");
if (file.fullName === target.file.fullName) fail("変更前後のパスが同じです。");
seen[nameKey] = true;
jobs.push({item:target,file:file,before:target.file.fullName});
}
if (jobs.length !== selected.length) fail("選択素材1つにつき、TSVをちょうど1行用意してください。");
} catch (error) { alert("変更せずに中止しました。\n" + error.toString()); return; }
var report = "次の素材アイテムを使う全コンポで参照元が変わります。複製・ファイル書き込みは行いません。\n";
for (var k = 0; k < jobs.length; k++) report += "\n" + jobs[k].item.name + "\n" + jobs[k].before + "\n→ " + jobs[k].file.fullName + "\n";
if (!confirm(report + "\n続けますか?")) return;
// Recheck after the confirmation dialog, before the first replacement.
for (var c = 0; c < jobs.length; c++) {
if (!jobs[c].item.file || jobs[c].item.file.fullName !== jobs[c].before ||
!jobs[c].item.file.exists || !jobs[c].file.exists) {
alert("確認中に参照元またはファイルの状態が変わったため、変更せずに中止しました。"); return;
}
}
var changed = 0;
app.beginUndoGroup("選択静止画の参照元をTSVで置換");
try {
for (var j = 0; j < jobs.length; j++) { jobs[j].item.replace(jobs[j].file); changed++; }
alert(changed + "素材を置き換えました。各コンポの見た目とフッテージの変換設定を確認してください。");
} catch (error) {
alert("途中で止まりました。" + changed + "素材の置換が完了しています。編集メニューで取り消して確認してください。\n" + error.toString());
} finally { app.endUndoGroup(); }
}());
練習画像で入力・操作・結果を照合する
同じサイズの画像を4枚作り、oldフォルダに元の2枚、newフォルダに差し替え先の2枚を置きます。
元の2枚をAEに読み込み、プロジェクトパネルの名前をtest01とtest02にします。
元の2枚を練習コンポで使い、プロジェクトを別名保存します。
2素材を選択し、スクリプトを実行して対応表を指定します。
確認画面の素材名・旧パス・新パスが正しければ続行します。
成功メッセージが2素材になり、フッテージのファイルパスと各コンポの画像が差し替わったか確認します。
FootageItem.replaceは素材アイテムの参照元を変更します。
画像寸法やアルファの扱いが異なると見た目が変わるため、同じサイズでもフッテージの変換設定と画面を確認してください。
途中失敗の切り分けと戻し方
「2列」のエラーではTAB区切りを確認し、「素材名」のエラーでは選択と対応表の名前を照合します。
リンク切れの場合は、先に標準機能で元の素材を繋ぎ直してください。
変更後は「編集」メニューで直前の処理を1回取り消し、2素材の元のパスと画像が戻るか確認します。
ディスク上の画像は上書きしていません。
壊れた画像などでreplaceが途中で失敗すると、一部の置換が残る場合があります。
表示される完了件数だけで全件成功と判断せず、取り消して照合し、戻らなければ別名保存したプロジェクトを開き直します。
画像のデコード、実際の置換後の色・サイズ・アルファ、Undoの結果はAE実機では未確認です。
参考資料と関連記事
FootageItem.replaceとItemを参照しました。
資料確認日:2026年10月3日。
APIの参照先はコミュニティ管理のAfter Effects Scripting Guideです。
以前紹介していた外部のsample.jsxは、今回のスクリプトとは別の実装です。
配布元の取得と実行を確認できていないため、本稿の対応表をそのまま旧実装へ渡す手順は案内しません。
関連記事
PSD読み込み、リンク修復、プロジェクト内の素材整理は目的が異なります。
旧GitHub実装は本稿の修正版と同期していません。





