PhotoshopのJSXでは、app.load(File)でATNを読み込み、app.doAction(アクション名, セット名)で読み込んだアクションを再生します。ATNのファイル名と、内部に保存されたセット名・アクション名をそれぞれ確認してください。
以下は自作の練習ATNと画像コピー1枚を使う例です。
同名セットが既にある場合は停止し、既存セットの削除や置き換えは行いません。
2026年10月19日に、Photoshop 2026(27.11.0)とWindows 11 Proで、このコードを[ファイル]→[スクリプト]→[参照]から実行し、読み込み・再生と2つの停止を確かめました。
結果は「Photoshop 2026で実行した結果」にまとめています。
仕事用の画像を使う前に、練習用の入力と結果を照合してください。
練習ATNと元サイズの画像コピーを用意する
ATNの保存・読み込み手順で、CGM-ATN-PracticeセットのResize-Width200を保存します。練習アクションは幅200pxへ変更する手順だけにし、開く・保存・閉じる操作を記録しません。架空の400×200px画像は、再生後に200×100pxとなる想定です。
ATNを保存した環境では元のセットがパネルに残っています。この例は同名セットがあると読み込み前に停止します。自作の練習セットだけを別名へ変更するか、まだそのATNを追加していない環境で試してください。仕事用のセットを削除して空きを作る手順は使いません。
元サイズの画像を開いて[イメージ]→[複製]で練習コピーを作り、元画像を閉じます。スクリプト実行時は未保存の練習コピー1枚だけを開きます。コードは開いている文書数を確認しますが、文書が練習用か、アクションに保存操作が含まれるかまでは判定しません。
ATNを選び、名前を照合して再生するコード
次のコードをUTF-8のImportAndRunAction.jsxとして保存し、[ファイル]→[スクリプト]→[参照]から実行します。初回の参照実行では、インストール先への配置やPhotoshopの再起動は必要ありません。
ファイル選択の後に、ATN内のセット名とアクション名を入力します。名前は大文字・小文字を含めて一致させます。例えばファイル名がcgm-atn-practice.atnでも、セット名はCGM-ATN-Practice、アクション名はResize-Width200です。
#target photoshop
(function () {
function trimmed(value) { return String(value).replace(/^\s+|\s+$/g, ""); }
function readSets() {
var result = [];
for (var i = 1; i <= 500; i++) {
var ref = new ActionReference();
ref.putIndex(charIDToTypeID("ASet"), i);
var desc;
try { desc = executeActionGet(ref); }
catch (endOfList) { return result; }
var name = desc.getString(charIDToTypeID("Nm "));
var count = desc.getInteger(charIDToTypeID("NmbC"));
var actions = [];
for (var j = 1; j <= count; j++) {
var actionRef = new ActionReference();
actionRef.putIndex(charIDToTypeID("Actn"), j);
actionRef.putIndex(charIDToTypeID("ASet"), i);
actions.push(executeActionGet(actionRef).getString(charIDToTypeID("Nm ")));
}
result.push({name: name, actions: actions});
}
throw new Error("More than 500 sets or unable to determine the end of the list.");
}
function matchingSets(sets, name) {
var result = [];
for (var i = 0; i < sets.length; i++) {
if (sets[i].name === name) result.push(sets[i]);
}
return result;
}
try {
if (app.documents.length !== 1) {
alert("Open just one unsaved practice copy before running this script.");
return;
}
var file = File.openDialog("Choose your own practice ATN file");
if (!file) return;
if (!file.exists || !/\.atn$/i.test(file.name)) {
alert("Choose an existing .atn file.");
return;
}
var setName = prompt("Exact set name stored inside the ATN (not the filename):", "CGM-ATN-Practice");
if (setName === null) return;
var actionName = prompt("Exact action name inside that set:", "Resize-Width200");
if (actionName === null) return;
setName = trimmed(setName); actionName = trimmed(actionName);
if (!setName || !actionName) { alert("Both names are required."); return; }
if (matchingSets(readSets(), setName).length !== 0) {
alert("This set name is already loaded. Nothing was loaded or played. Inspect your practice sets first.");
return;
}
app.load(file);
var matches = matchingSets(readSets(), setName);
if (matches.length !== 1) {
alert("Expected one matching set after loading. No action was played. The loaded set may remain in the panel.");
return;
}
var actionMatches = 0;
for (var k = 0; k < matches[0].actions.length; k++) {
if (matches[0].actions[k] === actionName) actionMatches++;
}
if (actionMatches !== 1) {
alert("Expected one exact matching action. No action was played. The loaded set remains in the panel.");
return;
}
app.doAction(actionName, setName);
alert("Playback returned without an exception. Inspect the document and output before counting it as successful.");
} catch (e) {
alert("Stopped: " + e.message + "\nThe loaded set or a partially changed practice document may remain. Inspect before saving.");
}
}());
Photoshop 2026で実行した結果
2026年10月19日に、Photoshop 2026(27.11.0)とWindows 11 Proで、上のコードを改変せずにImportAndRunAction.jsxとして保存し、[ファイル]→[スクリプト]→[参照]から3回実行しました。
練習用のATNには、セットCGM-ATN-Practiceの中に、幅を200pxにする[画像解像度]の1手順だけのアクションResize-Width200を入れました。
このATNはアクションパネルで記録したものではなく、別にファイルとして作ったので、記録の手順は確認に含めていません。
400×200pxの練習画像を開いて複製し、元の画像を閉じる準備も別のスクリプトで行ったので、確認には含めていません。
実行前のアクションパネルには、ほかに2つのセットがありました。
[参照]から実行し、ATNを選ぶ

練習コピーだけを開いた状態で、[ファイル]→[スクリプト]→[参照]を選び、保存したファイルを読み込みます。

最初にChoose your own practice ATN fileという題名のファイル選択の窓が開きました。
ファイルの種類は「すべてのファイル (*.*)」で、ATN以外のファイルも一覧に出ます。
ATNファイルを選んで[OK]を押します。
セット名とアクション名を入力する

続けて、セット名とアクション名を入れる窓が1つずつ開きました。
どちらにも練習用の名前が初めから入っているので、練習用のATNならそのまま[OK]を押せます。
自分のATNで使うときは、ファイル名ではなく、ATNの中のセット名とアクション名に書き換えます。
再生後は200×100pxになり、パネルにセットが追加された

2つ目の窓で[OK]を押すと、練習コピーは200×100pxになり、Playback returned without an exception.で始まるメッセージが出ました。
アクションパネルには、既存の2つのセットの下にCGM-ATN-PracticeとResize-Width200が追加されました。
ヒストリーにはアクション : Resize-Width200が1つだけ増えました。
元のPNGファイルは、実行の前後で更新日時もファイルの中身(SHA-256)も変わりませんでした。
練習コピーは保存しないので、元のファイルには影響しません。
同名セットがある・アクション名が違うと止まる

セットを読み込んだまま2回目を実行すると、This set name is already loaded.で始まるメッセージが出て止まりました(左上)。
このとき、セットは増えず、練習コピーの大きさとヒストリーも変わりませんでした。
次に、セットを消して元の大きさの練習コピーを用意し直し、アクション名だけをResize-Width100に変えて実行しました。
この場合はExpected one exact matching action.で始まるメッセージが出て止まりました(左下)。
セットは読み込まれてパネルに残り、練習コピーは400×200pxのままでした(右)。
試した後はセットを削除する
読み込んだ練習セットは、確かめた後にアクションパネルから削除します。
今回はスクリプトでCGM-ATN-Practiceだけを削除し、パネルが実行前の2つのセットに戻ったことを読み取って確かめました。
Photoshopを起動したままでも、設定フォルダーのActions Palette.pspには、セットを読み込んでいた間に練習セットが書き込まれていました。
セットを削除し忘れると、次に起動したときもパネルに残る可能性があります。
確かめていないこと
アクションパネルで記録して保存したATN、開く・保存・閉じるを含むアクション、再生の途中でエラーになる場合、文書が0枚や2枚以上のときの停止、ファイル選択や入力の取り消しは確かめていません。
同じ名前のセットが2つある場合、日本語のセット名、Scriptsフォルダーへの配置と再起動、Mac版と他の版も確かめていません。 また、readSetsはセット情報を取得するexecuteActionGetで最初に例外が出た位置を一覧の終端とみなします。終端以外の取得失敗を区別していないため、その場合は一覧を途中までしか取得できず、同名セットの確認が不完全になる可能性があります。500番まで取得できても終端を確認する501番は調べずに停止するので、500セット以上の環境を扱えるコードではありません。これらはコードを読んだ制約で、実機では再現していません。パネルの実際のセット名と照合し、一覧取得に問題がある環境では自動読み込みを繰り返さないでください。
読み込み後の状態と結果を確認する
再生から例外なしで戻ったメッセージは、画像の結果を保証するものではありません。パネルに指定のセットとアクションが追加され、練習コピーが200×100pxになったかを確認します。原本ファイルの寸法・更新日時と内容も照合し、この練習ではコピーを保存せず閉じます。
読み込み後の名前照合で停止しても、追加されたセットはパネルに残ります。コードはそれを自動で削除しません。パネルで実際の名前を確認し、必要なアクションは元サイズの新しい練習コピーで手動再生して切り分けてください。再実行すると、既に読み込んだ同名セットの確認で停止します。
| 症状 | 確認する点 |
|---|---|
| 画像がない、または複数開いている | 未保存の練習コピー1枚だけにする |
| 読み込み前に停止する | ATNの存在・拡張子・同名セット・入力した2つの名前 |
| 読み込めたが再生されない | ファイル名ではなく内部のセット名・アクション名を照合。重複名も確認 |
| 再生中にエラーが出る | 記録された手順、必要な素材・フォント・プラグイン、文書条件を確認 |
| コードをメニューに常設したい | 参照実行で確認してからスクリプトのメニュー登録へ進む |
アクション内の途中の操作が成功してからエラーになると、練習コピーだけ一部が変わっている場合があります。停止を成功件数に加えず、コピーを保存せず閉じ、元サイズから再確認します。このコードは自動ロールバックや処理ファイルの削除を実装していません。
旧コードの変更点と参照用記録
旧例は、ATNの存在確認で関数から戻っても、その後の再生を呼び出していました。また、ATNファイル名由来の正規表現に一致するセットを削除してから読み込む処理がありました。今回の例では、失敗時の後続処理を止め、入力した内部名の完全一致を確認します。
旧コードと旧配置先は経緯を確認するために残します。既存セットを削除する処理を含むため、そのまま実行するコードとして使わないでください。既存GitHubの01.jsも旧例の配布記録で、このページの新しいコードへの差し替えは行っていません。
旧コードと旧配置先(参照用・実行しない)
var atnPath = "C:\\Users\\min\\Desktop\\"
var atn = "test"
var filePath = atnPath + atn + ".atn"
$.writeln(filePath);
main(); //アクションのインポート
runAtn(); //アクションの実行
function runAtn() {
var idPly = charIDToTypeID("Ply ");
var desc12 = new ActionDescriptor();
var idnull = charIDToTypeID("null");
var ref3 = new ActionReference();
var idActn = charIDToTypeID("Actn");
ref3.putName(idActn, "glay");
var idASet = charIDToTypeID("ASet");
ref3.putName(idASet, atn);
desc12.putReference(idnull, ref3);
executeAction(idPly, desc12, DialogModes.NO);
}
function main() {
var atnFile = new File(filePath);
var rex = new RegExp(decodeURI(atnFile.name.replace(/\.[^\.]+$/, '')), "g");
if (!atnFile.exists) {
alert("ActionSetが存在しません");
return;
}
var actionList = getActionSets();
for (var d in actionList) {
if (decodeURI(actionList[d]).match(rex)) unLoadAction(actionList[d]);
}
app.load(atnFile);
var actionList = getActionSets();
var flag = false;
for (var d in actionList) {
if (decodeURI(actionList[d]).match(rex)) flag = true;
}
if (!flag) {
alert("アクションセットがロードされませんでした");
return;
}
}
function getActionSets() {
cTID = function(s) {
return app.charIDToTypeID(s);
};
var i = 1;
var sets = [];
while (true) {
var ref = new ActionReference();
ref.putIndex(cTID("ASet"), i);
var desc;
var lvl = $.level;
$.level = 0;
try {
desc = executeActionGet(ref);
} catch (e) {
break;
} finally {
$.level = lvl;
}
if (desc.hasKey(cTID("Nm "))) {
var set = {};
set.index = i;
set.name = desc.getString(cTID("Nm "));
set.toString = function() {
return this.name;
};
set.count = desc.getInteger(cTID("NmbC"));
set.actions = [];
for (var j = 1; j <= set.count; j++) {
var ref = new ActionReference();
ref.putIndex(cTID('Actn'), j);
ref.putIndex(cTID('ASet'), set.index);
var adesc = executeActionGet(ref);
var actName = adesc.getString(cTID('Nm '));
set.actions.push(actName);
}
sets.push(set);
}
i++;
}
return sets;
};
function unLoadAction(aSet) {
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putName(charIDToTypeID("ASet"), decodeURI(aSet));
desc.putReference(charIDToTypeID("null"), ref);
executeAction(charIDToTypeID("Dlt "), desc, DialogModes.NO);
};C:\Program Files\Adobe\Adobe Photoshop CC\Presets\Scripts手動での持ち出しはATN保存・読み込み、キーからの再生はアクションのショートカット、ATNからJSXへの変換はxtoolsによる変換記録で確認できます。この例はファイル1つの読み込みと1つのアクション再生を対象にし、フォルダー一括処理は行いません。
確認範囲と公式資料
2026年10月3日に、Adobe公開のPhotoshop JavaScript Reference 2020のload・doAction・executeActionGetと、ATNの保存・読み込みを確認しました。
ファイル取消・存在確認・名前照合・読み込み失敗後の停止と既存セットを削除しない制御は、Node.jsの模擬APIで確認しています。
2026年10月19日に、Photoshop 2026(27.11.0)とWindows 11 Proで、ATNの読み込み、Action Managerによるセットとアクションの一覧取得、アクションの再生、原本の保持、同名セットとアクション名の違いでの停止を確かめました。
実機の画面は「Photoshop 2026で実行した結果」に載せています。
よくある質問:PhotoshopのJSXでATNを読み込み・実行する
JSXで、ATNを読み込んで再生するには、どうしますか?
PhotoshopのJSXで、app.load(File)でATNを読み込み、app.doAction(アクション名, セット名)で、読み込んだアクションを再生します。ATNのファイル名と、内部に保存されたセット名・アクション名をそれぞれ確認してください。記事は、自作の練習ATNと画像コピー1枚を使う例です。同名セットが既にある場合は停止し、既存セットの削除や置き換えは行いません。
練習用のATNと画像は、どう用意しますか?
ATNの保存・読み込み手順で、セットを保存します。練習アクションは、幅200pxへ変更する手順だけにし、開く・保存・閉じる操作を記録しません。架空の400×200px画像は、再生後に200×100pxとなる想定です。元サイズの画像を開いて[イメージ]→[複製]で練習コピーを作り、元画像を閉じます。スクリプト実行時は、未保存の練習コピー1枚だけを開きます。コードは開いている文書数を確認しますが、文書が練習用か、アクションに保存操作が含まれるかまでは判定しません。
ATNを保存した環境で試すときの注意点は?
ATNを保存した環境では、元のセットがパネルに残っています。この例は同名セットがあると、読み込み前に停止します。自作の練習セットだけを別名へ変更するか、まだそのATNを追加していない環境で試してください。仕事用のセットを削除して空きを作る手順は使いません。
コードは、どう実行しますか? セット名やアクション名は、どう入力しますか?
コードをUTF-8のJSXとして保存し、[ファイル]→[スクリプト]→[参照]から実行します。初回の参照実行では、インストール先への配置やPhotoshopの再起動は必要ありません。ファイル選択の後に、ATN内のセット名とアクション名を入力します。名前は、大文字・小文字を含めて一致させます。ファイル名と、内部のセット名・アクション名は、別のものです。
実行したあと、何を確認しますか?
再生から例外なしで戻ったメッセージは、画像の結果を保証するものではありません。パネルに指定のセットとアクションがあるか、画像の寸法・内容を確認します。記事の確認表では、読み込めない場合はファイル名ではなく内部のセット名・アクション名を照合し、重複名も確認します。再生中にエラーが出る場合は、記録された手順、必要な素材・フォント・プラグイン、文書条件を確認します。コードをメニューに常設したい場合は、参照実行で確認してから、スクリプトのメニュー登録へ進みます。なお、読み込んだセットはパネルに残り、コードはそれを自動で削除しません。パネルで実際の名前を確認し、必要なアクションは、元サイズの新しい練習コピーで手動再生して切り分けてください。再実行すると、既に読み込んだ同名セットの確認で停止します。
途中でエラーになったら、どうなりますか?
アクション内の途中の操作が成功してからエラーになると、練習コピーだけ一部が変わっている場合があります。停止を成功件数に加えず、コピーを保存せず閉じ、元サイズから再確認します。このコードは、自動ロールバックや処理ファイルの削除を実装していません。
旧コードは、何が問題でしたか?
旧例は、ATNの存在確認で関数から戻っても、その後の再生を呼び出していました。また、ATNファイル名由来の正規表現に一致するセットを削除してから読み込む処理がありました。今回の例では、失敗時の後続処理を止め、入力した内部名の完全一致を確認します。旧コードと旧配置先は、経緯を確認するために残されており、既存セットを削除する処理を含むため、そのまま実行するコードとして使わないでください。
フォルダー内をまとめて処理できますか? 実機で確認されていますか?
この例は、ファイル1つの読み込みと1つのアクション再生を対象にし、フォルダー一括処理は行いません。
2026年10月19日に、Photoshop 2026(27.11.0)とWindows 11 Proで、練習用のATNの読み込みと再生、同名セットとアクション名の違いでの停止を、[ファイル]→[スクリプト]→[参照]から実行して確かめました。
ファイル選択の取り消しなどは、Node.jsの模擬APIでの確認です。
Mac版とほかの版は確かめていません。
2026年10月3日に、Adobe公開のPhotoshop JavaScript Reference 2020のload・doAction・executeActionGetなどを確認しています。
最新はAdobe公式の資料で確認してください。
