文字レイヤーの「2025」を「2026」へ置き換えるJSXです。
初期状態では一致数を表示するだけで、文字は変更しません。
置換を有効にしても元文書を残し、未保存の複製へ変更を加えます。
画像化された文字やスマートオブジェクト内部の文字は対象外です。
2026年10月16日に、Windows 11 Pro(10.0.26200)のPhotoshop 27.11.0(日本語表示)でこのコードを実行し、プレビューの一致数、複製への置換、元文書が変わらないことを確かめました。
標準の検索と置換・データセットとの使い分け
表示されている文字の検索・置換を画面で操作する場合は、標準の[編集]→[検索と置換]も候補です。Adobeの説明では、非表示やロック中の文字レイヤーは検索対象になりません。このJSXは非表示でも完全ロックされていない文字を対象にするため、同じ検索範囲として扱わないでください。
この例は、開いている1文書のグループ内まで検索し、一致数を確認してから複製へ変更する用途です。選択したレイヤーだけの処理、フォルダー内の全PSD、スマートオブジェクトの内部は扱いません。行ごとに異なる文言や画像を入れた複数PSDを作る場合は、CSVを使うデータセットへ進みます。
初めてJSXを使う場合は、JSXの保存と参照実行を確認してください。標準操作の範囲はAdobeの「テキストの検索と置換」を2026年10月3日に照合しています。ここで説明した標準操作も、今回のPhotoshop実機確認ではありません。
練習用PSDと検索文字列の準備
新しい文書に文字レイヤーA「CGM 2025 / 2025」を作ります。
グループ内に文字レイヤーB「CGM 2025」を作り、比較用に「CGM 2024」のレイヤーも追加してください。
PSDをpractice-text.psdとして保存し、原本のコピーも残します。
AとBをロックしない場合、一致するレイヤーは2個、文字列の出現回数は3回です。
確認に使ったのは、700×280px・白背景の文書に、Aと、GROUP_Bの中のB、比較用のCOMPARE_2024を置いた自作のPSDです。
3つともロックも非表示もなく、書式はArialの1種類だけです。
このPSDの作成は、画面操作ではなく自動処理で行いました。

コードのFINDが検索文字列、REPLACEが置換後の文字列です。
大文字小文字を区別し、FINDと一致する部分文字列をすべて置換します。文字レイヤー全体の一致や単語単位の一致を判定するものではなく、正規表現も使いません。
FINDを空にすると文字間へ置換文字列が挿入されるため、このコードでは空文字と同じ文字列同士の置換を停止します。
プレビューから始めるJSXコード
#target photoshop
(function () {
var FIND = "2025";
var REPLACE = "2026";
var DRY_RUN = true; // First count matches. Set false only after reviewing the result.
if (app.documents.length === 0) { alert("Open a practice PSD first."); return; }
if (!FIND.length || FIND === REPLACE) { alert("Use a non-empty, different search string."); return; }
var source = app.activeDocument;
// Changes are confined to an unsaved duplicate; the original stays open.
var work = DRY_RUN ? source : source.duplicate(source.name + "-text-preview");
var matchedLayers = 0, occurrences = 0, changedLayers = 0, skipped = 0, errors = [];
function walk(layers, parentLocked) {
for (var i = 0; i < layers.length; i++) {
var layer = layers[i];
var locked = parentLocked || layer.allLocked;
if (layer.typename === "LayerSet") {
walk(layer.layers, locked);
} else if (layer.typename === "ArtLayer" && layer.kind === LayerKind.TEXT) {
if (locked) { skipped++; continue; }
try {
var text = layer.textItem.contents;
var parts = text.split(FIND);
if (parts.length > 1) {
matchedLayers++;
occurrences += parts.length - 1;
if (!DRY_RUN) {
layer.textItem.contents = parts.join(REPLACE);
changedLayers++;
}
}
} catch (e) { errors.push(layer.name + ": " + e.message); }
}
}
}
walk(work.layers, false);
alert((DRY_RUN ? "PREVIEW ONLY" : "UNSAVED DUPLICATE") +
"\nMatched layers: " + matchedLayers + "\nOccurrences: " + occurrences +
"\nChanged layers: " + changedLayers + "\nLocked text layers skipped: " + skipped +
"\nErrors: " + errors.length + "\n" + errors.join("\n"));
}());
一致数を確認して複製へ置換する
練習ZIPのarticle-1394.jsxを、Photoshopの[ファイル]→[スクリプト]→[参照]から実行します。
最初はDRY_RUN=trueのまま、PREVIEW ONLY、Matched layers: 2、Occurrences: 3、Changed layers: 0になることを確認してください。
2026年10月16日の確認では、「スクリプト警告」という題名の通知に、この4項目とLocked text layers skipped: 0、Errors: 0が表示されました。
実行の前後で、元文書の文字は変わっていません。

入力を変更した場合は、それに応じて期待する数も変わります。
検索範囲を確認したら、JSXのDRY_RUNをfalseに変更して同じ文書で実行します。
確認では、DRY_RUNの行だけをfalseに書き換えたファイルを、同じ[参照]から実行しました。
通知の1行目はUNSAVED DUPLICATEで、Matched layers: 2、Occurrences: 3、Changed layers: 2、Locked text layers skipped: 0、Errors: 0でした。

別文書の複製が作られ、Aは「CGM 2026 / 2026」、Bは「CGM 2026」になり、比較用の2024は変わらないことを確認してください。
確認では、practice-text.psd-text-previewという名前の複製が隣のタブに開き、AとBだけが2026に変わりました。

元文書へ切り替え、2025のままであることも確認します。
元文書のタブをクリックすると、AもBも2025のままでした。

スクリプトは複製を自動保存しません。
確認では、実行後の複製は未保存のままで、元文書も保存済みのまま変わっていませんでした。
グループは再帰的にたどります。
非表示でもロックされていない文字レイヤーは対象で、レイヤーまたは親グループが完全ロックされている場合は除外します。
Locked text layers skippedは除外した文字レイヤー数です。
別種類の制限などで文字を書き換えられない場合はErrorsへ記録されます。
保存前の確認と戻し方
| 完了表示 | 意味 |
|---|---|
| Matched layers | 検索文字があるレイヤー数。1レイヤーの複数一致は1個 |
| Occurrences | 検索文字列の出現回数 |
| Changed layers | 書き換えに成功したレイヤー数。プレビューでは0 |
| Errors | 文字の読み書きに失敗したレイヤー名と理由 |
文字全体のcontentsを更新するため、複数の書式が混在した文字レイヤーで書式が保たれることは保証しません。
文字のはみ出し、改行、フォント、文字サイズ、字間を複製側で確認してください。
エラーがある場合は一部だけ変更されている可能性があるため、成功件数だけで完成と判断しません。
結果が正しければ複製を別名のPSDとして保存します。
戻す場合は複製を保存せず閉じ、元文書へ戻ります。
原本の上書きは行わないでください。
複製に必要なメモリが不足する場合はそこで中断し、小さい練習用PSDから確認します。
確認範囲と公式資料
2026年10月3日、AdobeのJSX実行手順を確認しました。
空検索の停止、プレビュー、複製への変更、グループとロック、読み書きエラーの扱いは、2026年10月3日にNode.jsの模擬環境で確認しました。配布ZIPのarticle-1394.jsxが本文のコードと一致することも照合しています。
2026年10月16日に、Windows 11 Pro(10.0.26200)のPhotoshop 27.11.0(日本語表示)で、本文のコードを[ファイル]→[スクリプト]→[参照]から実行しました。
同じ日に、配布ZIPのarticle-1394.jsxが本文のコードと同じ内容であることも確かめています。
DRY_RUNをfalseにした実行には、その1行だけを書き換えたファイルを使いました。
| 項目 | DRY_RUN=true | DRY_RUN=false |
|---|---|---|
| 通知の1行目 | PREVIEW ONLY | UNSAVED DUPLICATE |
| Matched layers | 2 | 2 |
| Occurrences | 3 | 3 |
| Changed layers | 0 | 2 |
| Locked text layers skipped | 0 | 0 |
| Errors | 0 | 0 |
| 文字が変わった文書 | なし | 未保存の複製だけ(AとBが2026、比較用の2024はそのまま) |
練習用PSDの作成と、実行前後の文字や保存状態の読み取りは、画面操作ではなく自動処理で行いました。
複製を別名のPSDとして保存する画面操作は、今回は確かめていません。
ロックした文字レイヤーや親グループ、非表示のレイヤー、ほかの編集制限、複数の書式が混在した文字、スマートオブジェクトの内部は、Photoshop本体では確かめていません。
空の検索文字列、読み書きのエラー、メモリが足りないときの動きも、Photoshop本体では確かめていません。
よくある質問:文字レイヤーをJSXで一括置換
このJSXは、何をするものですか?
文字レイヤーの「2025」を「2026」へ置き換えるJSXです。初期状態では、一致数を表示するだけで、文字は変更しません。置換を有効にしても元文書を残し、未保存の複製へ変更を加えます。画像化された文字やスマートオブジェクト内部の文字は対象外です。
標準の「検索と置換」とは、どう使い分けますか?
表示されている文字の検索・置換を画面で操作する場合は、標準の[編集]→[検索と置換]も候補です。Adobeの説明では、非表示やロック中の文字レイヤーは検索対象になりません。このJSXは、非表示でも完全ロックされていない文字を対象にするため、同じ検索範囲として扱わないでください。このJSXは、開いている1文書のグループ内まで検索し、一致数を確認してから複製へ変更する用途で、選択したレイヤーだけの処理、フォルダー内の全PSD、スマートオブジェクトの内部は扱いません。行ごとに異なる文言や画像を入れた複数PSDを作る場合は、CSVを使うデータセットへ進みます。
練習用のPSDは、どう用意しますか?
新しい文書に文字レイヤーA「CGM 2025 / 2025」を作り、グループ内に文字レイヤーB「CGM 2025」を作って、比較用に「CGM 2024」のレイヤーも追加します。PSDをpractice-text.psdとして保存し、原本のコピーも残します。AとBをロックしない場合、一致するレイヤーは2個、文字列の出現回数は3回です。
置換のルールを教えてください。
コードのFINDが検索文字列、REPLACEが置換後の文字列です。大文字小文字を区別し、FINDと一致する部分文字列をすべて置換します。文字レイヤー全体の一致や単語単位の一致を判定するものではなく、正規表現も使いません。
最初は、どう実行すればよいですか?
最初はDRY_RUNがtrueのまま実行し、PREVIEW ONLY、Matched layers: 2、Occurrences: 3、Changed layers: 0になることを確認してください。入力を変更した場合は、それに応じて期待する数も変わります。検索範囲を確認したら、JSXのDRY_RUNをfalseに変更して同じ文書で実行します。別文書の複製が作られ、Aは「CGM 2026 / 2026」、Bは「CGM 2026」になり、比較用の2024は変わらないことを確認してください。元文書へ切り替え、2025のままであることも確認します。スクリプトは複製を自動保存しません。
ロックされた文字レイヤーや、非表示のレイヤーは、どうなりますか?
グループは再帰的にたどります。非表示でもロックされていない文字レイヤーは対象で、レイヤーまたは親グループが完全ロックされている場合は除外します。完了表示のLocked text layers skippedは、除外した文字レイヤー数です。別種類の制限などで文字を書き換えられない場合は、Errorsへ記録されます。
保存する前に、何を確認しますか? 実機で確認されていますか?
完了表示のMatched layersは検索文字があるレイヤー数(1レイヤーの複数一致は1個)、Occurrencesは検索文字列の出現回数、Changed layersは書き換えに成功したレイヤー数(プレビューでは0)、Errorsは文字の読み書きに失敗したレイヤー名と理由です。文字全体のcontentsを更新するため、複数の書式が混在した文字レイヤーで書式が保たれることは保証しません。文字のはみ出し、改行、フォント、文字サイズ、字間を複製側で確認してください。エラーがある場合は、一部だけ変更されている可能性があるため、成功件数だけで完成と判断しません。結果が正しければ複製を別名のPSDとして保存し、戻す場合は複製を保存せず閉じます。原本の上書きは行わないでください。2026年10月16日に、Windows版Photoshop 27.11.0で、ロックも非表示もない単一書式の練習用PSDを使い、プレビュー(2レイヤー・3か所・変更0)と複製への置換(変更2レイヤー)、元文書が2025のまま残ることを確かめました。ロックと空検索、読み書きエラーの扱いは、2026年10月3日にNode.jsの模擬環境で確認したもので、Photoshop本体では確かめていません。非表示のレイヤー、書式の保持、複製を別名で保存する操作も、実機では確かめていません。最新はAdobe公式の資料で確認してください。
