Photoshopで開いている文書を複製し、選んだフォルダーへ「元の名前_export.psd」として保存するJSXの例です。元の文書を保存・統合・閉じず、複製を直接参照して処理します。複数の文書が開いていても、配列の位置から元の文書を推定しません。
2026年10月20日に、Photoshop 2026(27.11.0)とWindows 11 Proで下の新しい例を実行し、複製・PSD保存・開き直しまで確かめました(結果は「実機で確かめた結果」の節)。
直す前のコードでは、名前にピリオドを含む未保存の文書で、出力名の一部が消えることも分かりました。
2026年10月20日にコードを直し、未保存の文書は名前を削らずに出力名に使うようにしました。
保存の失敗・PSB・16bit・CMYK・Macは確かめていないので、まず自作の文書で試し、元ファイルと出力PSDを別に照合してください。
元文書・複製・保存済みファイルの違い
| 対象 | この例の扱い |
|---|---|
| 元文書 | 実行開始時のapp.activeDocumentを保持する。未保存文書も選択フォルダーへ出力できる構成。元文書のsave/closeは呼ばない。 |
| 複製 | duplicate(…, false)の戻り値を使う。レイヤーを保持し、自動で統合しない。 |
| 出力 | 明示した_export.psd。既存同名なら複製前に停止。保存前にも再確認する。 |
| 成功の照合 | ファイルの存在とサイズだけではPSDの内容を証明できない。開き直して寸法・レイヤー・表示・色を確認する。 |
旧コードはdocuments.length−2から保存先の文書を選び、複製にmergeVisibleLayersを適用していました。文書の並びに依存する参照と、レイヤー構造を変える処理は分けます。単なるバックアップが目的ならレイヤーを保持し、統合が必要な場合だけ複製に対して別途処理してください。mergeVisibleLayersは可視レイヤーの統合で、すべてのレイヤーを一律にフラット化する説明とは異なります。
AdobeのJavaScript Scripting Reference 2020のDocument.duplicate、saveAs、closeとPhotoshopSaveOptionsを参照しています。UXPのsaveAs APIとは別です。保存形式ごとの保持項目はAdobeのファイル保存資料でも確認できます。
CGM_DuplicateAndSave.jsxの新しい例
次の全体をUTF-8の.jsxとして保存し、ファイル→スクリプト→参照から1回実行します。旧コードへ追記せず別ファイルにしてください。メニューへ登録する配置先は、スクリプトメニューの記事を参照します。
#target photoshop
(function () {
if (app.documents.length === 0) {
alert("文書を開いてください。");
return;
}
var source = app.activeDocument;
var copy = null;
var output = null;
try {
var folder = Folder.selectDialog("複製PSDの保存先を選択してください");
if (folder === null) { return; }
var base = source.name;
var hasFile = true;
try { source.fullName; } catch (nameError) { hasFile = false; }
if (hasFile) { base = base.replace(/\.[^.]+$/, ""); }
base = base.replace(/[\\\/:*?"<>|]/g, "_").replace(/[ .]+$/, "");
if (!base) { base = "document"; }
output = new File(folder.fsName + "/" + base + "_export.psd");
if (output.exists) {
alert("同名ファイルがあるため保存しません: " + output.fsName);
return;
}
copy = source.duplicate(base + "_export", false);
var options = new PhotoshopSaveOptions();
options.layers = true;
options.alphaChannels = true;
options.annotations = true;
options.embedColorProfile = true;
options.spotColors = true;
if (output.exists) { throw new Error("保存直前に同名ファイルが見つかりました。"); }
copy.saveAs(output, options, true, Extension.LOWERCASE);
if (!output.exists || output.length === 0) {
throw new Error("保存先ファイルを確認できません。複製を残します。");
}
copy.close(SaveOptions.DONOTSAVECHANGES);
copy = null;
alert("保存処理が戻りました: " + output.fsName + "\nPSDを開き直して内容を確認してください。");
} catch (error) {
alert("中断: " + error.message + "\n複製が残っている場合は内容を確認してください。自動再実行はしません。");
} finally {
try { app.activeDocument = source; } catch (restoreError) {
alert("元の文書へ表示を戻せませんでした: " + restoreError.message);
}
}
}());
出力名は、保存済みの文書なら名前から拡張子(最後のピリオドから後ろ)を外したもの、未保存の文書なら名前そのままです。
名前の禁止文字と末尾の空白・ピリオドを置き換えます。同名の既存ファイルを自動で上書きしたり、連番を推測して保存したりしません。別フォルダーを選ぶか、元文書の複製名を整理してから実行してください。既存確認は排他的なファイルロックではないため、同じ保存先へ別の処理を同時に書き込まないでください。
初回の確認条件と期待値
| 条件 | 確認すること |
|---|---|
| 文書なし/保存先取消 | 文書・ファイルを作成しない。 |
| RGBの自作2レイヤー文書 | 複製PSDを1つ出力し、レイヤーを保持。元文書は開いたまま。 |
| 複数文書・未保存文書 | 実行時に前面の文書の内容を保存。別タブのパスや名前を使わない。 |
| 同名PSDあり | 上書きせず停止。既存ファイルのハッシュを実行前後で比較。 |
| 保存失敗 | 複製は確認用に残す。書きかけの出力がある場合は開き直して検査し、自動削除や再実行をしない。 |
上の表は、実行前に決めた期待値です。
保存失敗を除く4つの条件は、次の節のとおり実機で期待値どおりでした。
保存後はPSDを開き直し、寸法・レイヤー数/名前・可視状態・画像・プロファイルを比較します。
原本ファイルのハッシュ、元文書の未保存状態とほかの文書が変わっていないことも確認してください。
PSBや特殊なモード・大きな文書は、このPSD例で保存できると一律に扱いません。
実機で確かめた結果(Photoshop 2026)
2026年10月20日に、Adobe Photoshop 2026 (27.11.0)、Windows 11 Pro (10.0.26200)で、直す前のコードを改変せずに[ファイル]→[スクリプト]→[参照…]から5回実行しました。
その後、名前にピリオドを含む未保存の文書で名前が欠ける不具合を直しました。
直したコードの結果は、この節の最後の「直したコードで確かめた結果」にまとめています。
練習用の文書(800×500px、レイヤーは背景・赤・非表示の青)と、実行前の状態はスクリプトで用意しました。
保存先は、実行中に出るフォルダー選択の窓で作業用のフォルダーを画面から選びました。
保存済みの文書に未保存の変更があるとき
保存済みのsample.psdを開き、保存せずにレイヤー「追加」を足した状態で実行しました。
後ろには、別の未保存の文書も開いておきました。
出力されたsample_export.psdを開き直すと、未保存だった「追加」を含む4レイヤーが同じ順序で入り、非表示の青は非表示のままでした。
寸法(800×500px・72ppi)とプロファイル(sRGB IEC61966-2.1)も元の文書と同じでした。
元のsample.psdは開いたままで未保存の印も残り、ヒストリーも実行前と同じ7つでした。
ディスク上の元のsample.psdは、実行前後でハッシュが変わりませんでした。
実行後の前面は元のsample.psdで、途中で作られた複製の文書は閉じられていました。

同じ名前のPSDがあるとき
同じ状態でもう一度実行して同じフォルダーを選ぶと、「同名ファイルがあるため保存しません」と出て止まりました。
既存のsample_export.psdは、ハッシュも更新時刻も変わりませんでした。
開いている文書の数も増えず、複製は作られていませんでした。

直す前のコードは、名前にピリオドを含む未保存の文書で名前が欠けた
「ver1.5 draft」という名前の未保存の文書で実行すると、出力名はver1_export.psdになりました。
直す前のコードは名前の最後のピリオドから後ろを拡張子とみなして消すため、まだ保存していない文書では名前の一部が消えていました。
中身は元の文書と同じ(600×400px、2レイヤー)でした。
ピリオドより前が同じ未保存の文書「ver1.6 draft」で続けて実行すると、同じver1_export.psdになるため、「同名ファイルがあるため保存しません」と出て止まりました(別のスクリプトから実行して確認)。
直したコードでは、名前を削らないので、どちらも別の名前で保存されます。

文書なし・保存先の取り消し
文書を開いていない状態で実行すると「文書を開いてください。」と出て、何も作られませんでした。
フォルダー選択の窓で[キャンセル]を押すと、警告も出ずに終わり、文書もファイルも増えませんでした。
フォルダー選択の窓は、5回ともスクリプトファイルを置いたフォルダーで開きました。
定規の単位・前景色・背景色・ダイアログの表示設定は、実行前後で変わりませんでした。
保存の失敗(書き込めないフォルダーなど)、PSB・16bit・CMYK・大きな文書、Mac、ほかの版は確かめていません。
直したコードで確かめた結果
2026年10月20日に、直したコードを練習用の文書で実行しました。
フォルダー選択の窓の代わりに作業用のフォルダーを渡し、警告の窓の代わりに文字を記録する版を、別のスクリプトから実行して確かめています([参照…]からは実行していません)。
未保存の文書「ver1.5 draft」はver1.5 draft_export.psd、「ver1.6 draft」はver1.6 draft_export.psdとして保存されました。
ピリオドの無い未保存の文書「other」は、other_export.psdになりました。
保存済みのsample.psdに未保存のレイヤー「追加」を足した状態では、直す前と同じくsample_export.psdとして保存され、開き直すと4レイヤーで非表示の青も非表示のままでした。
同じ状態でもう一度実行すると「同名ファイルがあるため保存しません」と出て止まり、既存のファイルはハッシュも更新時刻も変わりませんでした。
元のsample.psdは開いたまま未保存の印も残り、ディスク上のファイルのハッシュも変わりませんでした。
文書が無いときの警告と、保存先を取り消したときに何も作られないことも、直す前と同じでした。
旧コードと配布元
旧コードの参照資料(実行しない)
旧コードは文書配列から元文書を推定し、可視レイヤー統合と固定名保存を行います。同名上書き・保存失敗・文書なし・未保存の条件を扱っていません。比較用に原文を保持しますが、新例と混ぜて実行しないでください。
旧コード 1
(function(){
//ドキュメントを複製
var copiedDoc = app.activeDocument.duplicate();
//処理(レイヤーを統合)
mergeLayers();
//名前をつけて保存
saveSceneAs();
// 複製したドキュメントを保存せず閉じる
activeDocument.close(SaveOptions.DONOTSAVECHANGES);
//アラート
alert('終わったよ♪');
//レイヤーを統合
function mergeLayers() {
docObj = activeDocument;
docObj.mergeVisibleLayers();
}
function saveSceneAs() {
//ドキュメント数を調べて、オリジナルのドキュメントナンバーを取得
n = documents.length -2;
//オリジナルのドキュメントのパスと名前を取得
var filePath = documents[n].path;
var fileName = documents[n].name.replace(/\.[^\.]+$/, '');
//プリフィックスを追加
var fileFullName = filePath + "/" + fileName + "_export";
//保存オプション
var psdObj = new File(fileFullName);
var psdOpt = new PhotoshopSaveOptions();
psdOpt.alphaChannels = true;
psdOpt.annotations = true;
psdOpt.embedColorProfile = false;
psdOpt.layers = true;
psdOpt.spotColors = false;
//名前をつけて保存
activeDocument.saveAs(psdObj, psdOpt, true, Extension.LOWERCASE);
}
})() ;旧コード 2
C:\Program Files\Adobe\Adobe Photoshop CC\Presets\Scripts\GitHubにも、この記事の直したコードを置いています(2026年10月20日更新)。
JSXの文書/レイヤー/ファイル操作、レイヤーごとの書き出しとは目的が異なります。文書全体を別名で残す場合にこの例を使います。





よくある質問:開いている文書を複製してPSDで保存する
このスクリプトは何をしますか?
Photoshopで開いている文書を複製し、選んだフォルダーに「元の名前_export.psd」として保存します。元の文書は保存・統合・閉じる操作をせず、複製を直接参照して処理します。
元の文書が変更されたり閉じられたりしませんか?
元の文書のsaveやcloseは呼ばない作りです。実行開始時のapp.activeDocumentを保持して使うため、複数の文書が開いていても配列の位置から元の文書を推定しません。
レイヤーは統合されますか?
複製はレイヤーを保持し、自動では統合しません。旧コードはmergeVisibleLayersを複製に適用していましたが、バックアップが目的ならレイヤーを保持し、統合が必要な場合だけ複製に対して別途処理します。
同じ名前のPSDが保存先にあるとどうなりますか?
既存ファイルを自動で上書きせず、複製を作る前に停止します。保存前にも再確認します。別のフォルダーを選ぶか、元文書の複製名を整理してから実行してください。
保存したPSDはそのまま信頼してよいですか?
2026年10月20日にPhotoshop 2026(27.11.0)で実行し、開き直したPSDの寸法・4レイヤーの名前と順序・非表示の状態・プロファイルが元の文書と同じことを確かめました。
版や文書の種類で結果が変わりうるので、ファイルの存在やサイズだけで判断せず、開き直して寸法・レイヤー数と名前・可視状態・画像・プロファイルを確認してください。
初回は何を使って試せばよいですか?
記事の確認条件では、RGBの自作2レイヤー文書を使い、複製PSDが1つ出力されてレイヤーが保持され、元文書が開いたままであることを確かめる流れです。文書がない場合や保存先を取り消した場合は、文書やファイルを作成しない動作を期待します。
未保存の文書でも使えますか?
未保存の文書でも、選択したフォルダーへ出力できました(2026年10月20日に実機で確認)。
2026年10月20日に直したコードでは、名前にピリオドがあってもそのまま使い、「ver1.5 draft」はver1.5 draft_export.psdになります。
直す前のコードでは、最後のピリオドから後ろが消えて、ver1_export.psdになっていました。
複数文書が開いているときは、実行時に前面にある文書の内容が保存され、後ろの文書は使われませんでした。
保存に失敗したときはどうしますか?
複製は確認用に残します。書きかけの出力がある場合は開き直して検査し、自動削除や再実行はしない扱いです。なお、既存確認は排他的なファイルロックではないため、同じ保存先へ別の処理を同時に書き込まないでください。
PSBや大きな文書でも保存できますか?
PSBや特殊なモード、大きな文書は、このPSD例で保存できると一律には扱いません。該当する場合は、保存形式ごとの保持項目などを含め、最新の情報をAdobeの公式資料で確認してください。
