UXPスクリプトは、.psjsというJavaScriptファイルからPhotoshopを操作する仕組みです。
スタンドアロンの実行はPhotoshop 23.5以降で使えます。
JSXの拡張子を変えるだけの移行ではなく、API・非同期処理・画面とファイル権限を確認します。
最初は文書の情報を読む
練習ZIPのscene-landscape.jpgを作業コピーで開き、article-1362-report.psjsを[ファイル]→[スクリプト]→[参照]から実行します。
文書名と400×200pxの表示を確認する例で、画像の内容や寸法は変更しません。
文書がない場合は、開いてから試すメッセージを表示します。
const { app, core } = require("photoshop");
if (app.documents.length === 0) {
await core.showAlert("No document is open. Open a practice image and try again.");
} else {
const doc = app.activeDocument;
await core.showAlert("Document: " + doc.name + "\nSize: " + doc.width + " x " + doc.height + " px");
}
app.documents.lengthやdoc.widthなどのプロパティを読む処理と、完了を待つAPIを区別します。
showAlertの前にはawaitを置いて、ダイアログの処理を待ちます。
通常のブラウザーやNode.jsのAPIが、そのままPhotoshop UXPにあるとは判断しないでください。
新しい未保存の文書を作る
作業中の文書は自分で保存して閉じ、article-1362-create.psjsを実行します。
この例は文書が開いている場合に停止し、空の状態から256×128px、RGB・8bit、72ppi、透明背景の新しい練習文書とレイヤーを作ります。
既存画像を閉じたり、保存先へファイルを書いたりする処理はありません。
const { app, core } = require("photoshop");
if (app.documents.length !== 0) {
await core.showAlert("Save and close your current documents before this practice.");
} else {
try {
const doc = await app.documents.add({
name: "CGM UXP Practice",
width: 256,
height: 128,
resolution: 72,
depth: 8,
mode: "RGBColorMode",
fill: "transparent"
});
await doc.createLayer({ name: "CGM practice layer" });
await core.showAlert("Created a new unsaved practice document: " + doc.name +
"\nSize: " + doc.width + " x " + doc.height + " px");
} catch (e) {
await core.showAlert("Practice failed: " + e.message +
"\nIf a new practice document remains open, inspect it before closing without saving.");
}
}
app.documents.addはPromiseを返すため、awaitで文書作成を待ってから、その文書にレイヤーを作ります。
レイヤー作成も待ってから完了表示を出します。
作成後は文書名、256×128pxの寸法、CGM practice layerというレイヤーを確認し、不要な練習文書は保存せず閉じます。
途中でレイヤー作成などが失敗した場合、新しい練習文書だけが残る可能性があります。
エラーメッセージを読み、残った文書の内容を確認してください。
エラーが表示されたのに、作成途中の文書を完成品として保存しないようにします。
JSXから移すときの違い
| 確認する項目 | JSX | スタンドアロンPSJS |
|---|---|---|
| 実行するファイル | .jsx、ExtendScript | .psjs、UXP |
| アプリへアクセス | グローバルのappなど | require('photoshop').app |
| 処理の完了待ち | 従来DOMは同期処理 | Promiseを返すメソッドはawait |
| UI | ScriptUIのdialog | UXPのダイアログとawait showModal |
| ファイル選択 | File・Folder | uxp.storage.localFileSystemのピッカー |
UXPではES6などの新しい構文が使えますが、DOMメソッドや列挙値はExtendScriptと同じとは限りません。
画像を変更する処理を移す前に、まず文書情報を読む小さい例で実行経路を確認してください。
JSXの入力欄・ボタンはScriptUIのダイアログ例で確認できます。JSXとPSJSの初回実行はスクリプトを参照から実行する手順を使い、それぞれの拡張子で試してください。
スタンドアロンとプラグインを分ける
Adobeのスタンドアロン.psjsサンプルは、await app.documents.addなどをexecuteAsModalで包まずに実行しています。
一方、プラグインから文書を変更する処理にはモーダル実行のルールがあります。
プラグイン用の説明をそのままPSJSへ足したり、PSJSの例をそのままプラグインのボタン処理に移したりせず、呼び出す場所の仕様を確認します。
スタンドアロンでもLocalFileSystemのファイル選択から保存先を選べます。
利用できないプラグイン用データフォルダーやwindow.localStorageと、ユーザーが選ぶ保存先は別です。
「保存先フォルダーへ一切アクセスできない」とは説明しません。
自動上書きや任意パスへの無制限アクセスを許す仕組みでもありません。
Adobeのスタンドアロン資料では、NetworkやLaunchProcessなどのモジュールは許可されないものとして説明されています。
権限の追加やパネルが必要な用途では、スクリプトとプラグインを分けて検討します。
通常のalert、prompt、confirmの代わりに、この例ではPhotoshopのcore.showAlertを使います。
実行できないときと確認範囲
ファイルが見つからない場合は.psjs.txtになっていないか確認します。
requireやawaitの構文エラーではJSXとして実行していないかを、文書作成の失敗ではPhotoshopの版とAPI条件を確認してください。
UXP Developer Toolは1.6以降のDebug Scriptが案内されています。
2026年10月3日に、Adobeの実行手順、実行コンテキストと許可モジュール、スタンドアロンの公式サンプル、Documents.add、文書作成オプションを確認しました。
awaitの順序と失敗時の制御は明示的モックで確認していますが、Photoshop実機のAPI呼び出し・表示・レイヤー作成は未検証です。
