PSDをコンポジションとして読み込み、そのレイヤー素材を読み込んだコンポと同じプロジェクト階層へ移すスクリプトです。
旧コードのキャンセル後の処理継続と、同名の既存フォルダを削除する処理を修正しました。
掲載コードはローカルのAPI模擬テストで検証しました。
After EffectsでのPSD読み込み・表示・取り消しは未確認のため、実案件の前に練習用PSDと別名保存したプロジェクトで確認してください。
変更する範囲と読み込み形式
ImportAsType.COMPを指定し、PSDをコンポジションとして読み込みます。
レイヤーサイズを保持するCOMP_CROPPED_LAYERSとは異なります。
読み込み前の全アイテムIDと読み込み後のソースIDを比べ、今回追加された直接参照のFootageItemだけを移します。
既存素材・既存フォルダ・ディスク上のPSDは変更しません。
読み込み時に作られたフォルダは、空になっても残します。
「レイヤー」フォルダを作らない設定ではありません。
| 操作 | 対象 | 結果 |
|---|---|---|
| ファイル選択をキャンセル | なし | 読み込みも整理もしない |
| PSD読み込みに成功 | 新規素材のみ | 読み込んだコンポと同じ階層へ移動 |
| 同名の既存フォルダがある | 既存アイテム | 削除・移動しない |
| 途中で失敗 | 今回の読み込み・移動 | 一部が残る場合あり。取り消して確認 |
修正版スクリプト
次のコードをUTF-8のテキストとしてimport-psd.jsxに保存します。
/* Owned PSD import helper. Local API-double tests only; native AE validation pending. */
(function () {
var project = app.project;
if (!project) { alert("プロジェクトを開いてください。"); return; }
var file = File.openDialog("レイヤーを持つPSDを1つ選択してください");
if (!file) return;
if (!file.exists || !/\.psd$/i.test(file.name)) {
alert("存在する.psdファイルを選択してください。"); return;
}
var before = {}, options, imported, moved = 0;
try {
options = new ImportOptions(file);
if (!options.canImportAs(ImportAsType.COMP)) {
alert("このPSDをコンポジションとして読み込めません。標準の読み込みで確認してください。"); return;
}
options.importAs = ImportAsType.COMP;
options.sequence = false;
for (var i = 1; i <= project.numItems; i++) before["id_" + project.item(i).id] = true;
} catch (error) { alert("読み込み前の確認に失敗しました。\n" + error.toString()); return; }
app.beginUndoGroup("PSDをコンポジションとして読み込み");
try {
imported = project.importFile(options);
if (!(imported instanceof CompItem) || before["id_" + imported.id]) {
throw new Error("新規コンポジションを取得できませんでした。");
}
// Move only newly imported direct sources, identified by Item.id.
// Retain importer-created folders; never remove a project item.
var sources = [], seen = {};
for (var n = 1; n <= imported.numLayers; n++) {
var source = imported.layer(n).source;
if (!(source instanceof FootageItem)) continue;
var key = "id_" + source.id;
if (before[key] || seen[key]) continue;
seen[key] = true; sources.push(source);
}
for (var j = 0; j < sources.length; j++) {
sources[j].parentFolder = imported.parentFolder;
moved++;
}
alert("コンポジション「" + imported.name + "」を読み込み、新規素材" + moved + "個を同じ階層へ移しました。空のフォルダは残します。");
} catch (error) {
alert("処理が途中で止まりました。一部の読み込み・移動が残る場合があります。編集メニューで取り消して確認してください。\n" + error.toString());
} finally { app.endUndoGroup(); }
}());
2レイヤーのPSDで実行する手順
自作の練習用PSDに「赤い四角」と「青い四角」の2レイヤーを作り、保存します。
既存プロジェクトは番号を付けて別名保存してから使います。
既存素材の保護を確かめる場合は、あらかじめ同名の「練習 レイヤー」フォルダと別素材を置き、所在を記録します。
After Effectsで「ファイル」→「スクリプト」→「スクリプトファイルを実行」を選び、import-psd.jsxを実行します。
ファイル選択で練習PSDを指定してください。
成功メッセージのコンポ名と新規素材数を確認し、読み込んだコンポを開きます。
2つの色とレイヤー数、新規素材の所在、既存フォルダ内の素材が維持されていることを照合します。
PSDの構成によって読み込み結果は異なるため、素材数を常に2個とは断定しません。
失敗時の切り分けと戻し方
PSD以外、存在しないファイル、コンポジション形式に対応しないPSDは読み込み前に中止します。
標準のファイル読み込みで同じPSDを開けるか確認してください。
成功後に「編集」メニューで直前の処理を1回取り消し、新規コンポ・素材・読み込みフォルダが戻り、既存素材が維持されているか確認します。
途中のエラーでは読み込みや移動が一部残る場合があります。
取り消した後も期待した状態にならなければ、保存した別名プロジェクトを開き直してください。
レイヤー効果・色・マスク・PSD更新時の追従、AEのバージョン差、Undoによる復元は実機での確認が必要です。
API模擬テストはこれらの画面結果を保証しません。
参考資料と関連記事
ImportOptions.importAs・canImportAs、Project.importFile、Item.id・parentFolderを参照しました。
資料確認日:2026年10月3日。
APIの参照先はコミュニティ管理のAfter Effects Scripting Guideです。
GitHubに残る旧実装は本稿の修正版と同期していません。
今回の練習では本稿のコードを使ってください。
関連記事
PSD読み込み、リンク修復、プロジェクト内の素材整理は目的が異なります。
旧GitHub実装は本稿の修正版と同期していません。





