文字レイヤーの「2025」を「2026」へ置き換えるJSXです。
初期状態では一致数を表示するだけで、文字は変更しません。
置換を有効にしても元文書を残し、未保存の複製へ変更を加えます。
画像化された文字やスマートオブジェクト内部の文字は対象外です。
標準の検索と置換・データセットとの使い分け
表示されている文字の検索・置換を画面で操作する場合は、標準の[編集]→[検索と置換]も候補です。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回です。
コードの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になることを確認してください。
入力を変更した場合は、それに応じて期待する数も変わります。
検索範囲を確認したら、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として保存します。
戻す場合は複製を保存せず閉じ、元文書へ戻ります。
原本の上書きは行わないでください。
複製に必要なメモリが不足する場合はそこで中断し、小さい練習用PSDから確認します。
確認範囲と公式資料
2026年10月3日、AdobeのJSX実行手順を確認しました。
空検索の停止、プレビュー、複製への変更、グループとロック、読み書きエラーの扱いは、2026年10月3日にNode.jsの模擬環境で確認しました。配布ZIPのarticle-1394.jsxが本文のコードと一致することも照合しています。
Photoshop本体での置換、書式保持、複製の保存は未検証です。
