Skip to content

Instantly share code, notes, and snippets.

@Yamonov
Last active October 11, 2025 14:49
Show Gist options
  • Select an option

  • Save Yamonov/5e116126dee361f954df0667b80b6eed to your computer and use it in GitHub Desktop.

Select an option

Save Yamonov/5e116126dee361f954df0667b80b6eed to your computer and use it in GitHub Desktop.
Photoshopのレイヤーまわりスクリプトパック

LayerRename.kmmacrosは、KeyboardMaestroで実行して、レイヤー名を大きな表示で変更するためのマクロです。

image
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
<dict>
<key>Activate</key>
<string>OnceWithPalette</string>
<key>AddToMacroPalette</key>
<true/>
<key>AddToStatusMenu</key>
<true/>
<key>CreationDate</key>
<real>487499811.51941299</real>
<key>KeyCode</key>
<integer>3</integer>
<key>Macros</key>
<array>
<dict>
<key>Actions</key>
<array>
<dict>
<key>ActionUID</key>
<integer>69978</integer>
<key>DisplayKind</key>
<string>Variable</string>
<key>HonourFailureSettings</key>
<true/>
<key>IncludeStdErr</key>
<false/>
<key>IncludedVariables</key>
<array>
<string>9999</string>
</array>
<key>MacroActionType</key>
<string>ExecuteAppleScript</string>
<key>NotifyOnFailure</key>
<false/>
<key>Path</key>
<string></string>
<key>Text</key>
<string>tell application id "com.adobe.photoshop" to name of current layer of current document</string>
<key>TimeOutAbortsMacro</key>
<true/>
<key>TrimResults</key>
<true/>
<key>TrimResultsNew</key>
<true/>
<key>UseText</key>
<true/>
<key>Variable</key>
<string>PSLayerName</string>
</dict>
<dict>
<key>ActionUID</key>
<integer>69979</integer>
<key>Floating</key>
<true/>
<key>HasTitle</key>
<false/>
<key>MacroActionType</key>
<string>CustomPrompt</string>
<key>Text</key>
<string>&lt;!DOCTYPE html&gt;
&lt;html lang="ja-jp"&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;title&gt;レイヤー名編集&lt;/title&gt;
&lt;style&gt;
#textinput{
border:none;
border-radius:20px;
padding:5px 15px;
font-family:"ヒラギノ角ゴ Pro W3";
font-size:48px;
background-color:#f2f2f2;
width:95%;
}
&lt;/style&gt;
&lt;script type="text/javascript"&gt;
document.addEventListener('keydown', function(e) {
if(e.key === 'Escape'){
window.KeyboardMaestro.Cancel('');
}
})
const a = window.KeyboardMaestro.GetVariable('PSLayerName');
function init1() {
document.getElementById("textinput").value=a;
document.getElementById("textinput").focus();
document.getElementById("textinput").select();
}
&lt;/script&gt;
&lt;/head&gt;
&lt;body data-kmwindow="1300,140" onload="init1()"&gt;
&lt;form&gt;
&lt;input type="text" id="textinput" name="PSLayerName"&gt;
&lt;button type="submit" style="padding:0;border:0;" onclick="window.KeyboardMaestro.Submit()"&gt;&lt;/button&gt;
&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</string>
<key>TimeOutAbortsMacro</key>
<true/>
<key>Transparent</key>
<true/>
<key>UseText</key>
<true/>
</dict>
<dict>
<key>ActionUID</key>
<integer>70774</integer>
<key>Conditions</key>
<dict>
<key>ConditionList</key>
<array>
<dict>
<key>ConditionType</key>
<string>Text</string>
<key>Text</key>
<string>%HTMLResult%</string>
<key>TextConditionType</key>
<string>IsNot</string>
<key>TextValue</key>
<string>Cancel</string>
</dict>
</array>
<key>ConditionListMatch</key>
<string>All</string>
</dict>
<key>ElseActionListDisclosed</key>
<false/>
<key>ElseActions</key>
<array/>
<key>MacroActionType</key>
<string>IfThenElse</string>
<key>ThenActions</key>
<array>
<dict>
<key>ActionUID</key>
<integer>70775</integer>
<key>DisplayKind</key>
<string>None</string>
<key>HonourFailureSettings</key>
<true/>
<key>IncludeStdErr</key>
<false/>
<key>IncludedVariables</key>
<array>
<string>9999</string>
</array>
<key>IsActive</key>
<false/>
<key>IsDisclosed</key>
<false/>
<key>MacroActionType</key>
<string>ExecuteAppleScript</string>
<key>Path</key>
<string></string>
<key>Text</key>
<string>-- 1. KMからレイヤー名を取得
tell application "Keyboard Maestro Engine"
set myLN to getvariable "PSLayerName" as text
end tell
-- 2. PSLayerNameの先頭が「★」なら JSXで一括置換
if myLN starts with "★" then
set jsxCode to "
app.activeDocument.suspendHistory('Rename ★ to ☆', 'main()');
function main() {
if (app.documents.length === 0) return;
var skipName = app.activeDocument.activeLayer.name;
renameLayers(app.activeDocument.layers, skipName);
}
function renameLayers(layerCollection, skipName) {
for (var i = 0; i &lt; layerCollection.length; i++) {
var layer = layerCollection[i];
// アクティブレイヤーは除外
if (layer.name === skipName) continue;
// レイヤー名が★で始まるなら☆に置換
if (layer.name.charAt(0) === '★') {
layer.name = (layer.name.length === 1) ? '☆' : '☆' + layer.name.substring(1);
}
// レイヤーグループなら再帰
if (layer.typename === 'LayerSet') {
renameLayers(layer.layers, skipName);
}
}
}
"
tell application id "com.adobe.photoshop"
do javascript jsxCode
end tell
end if
-- 3. アクティブレイヤーの名前を Keyboard Maestro の変数で上書き
tell application id "com.adobe.photoshop"
set name of current layer of current document to myLN
end tell
</string>
<key>TimeOutAbortsMacro</key>
<true/>
<key>TrimResults</key>
<true/>
<key>TrimResultsNew</key>
<true/>
<key>UseText</key>
<true/>
</dict>
<dict>
<key>ActionUID</key>
<integer>14348099</integer>
<key>DisplayKind</key>
<string>None</string>
<key>HonourFailureSettings</key>
<true/>
<key>IncludeStdErr</key>
<false/>
<key>IncludedVariables</key>
<array>
<string>9999</string>
</array>
<key>MacroActionType</key>
<string>ExecuteAppleScript</string>
<key>Path</key>
<string></string>
<key>Text</key>
<string>-- 1. JSXコード(先に定義しておく)
set jsxCode to "
app.activeDocument.suspendHistory('Rename ★ to ☆', 'main()');
function main() {
if (app.documents.length === 0) return;
var skipLayer = app.activeDocument.activeLayer;
renameLayers(app.activeDocument.layers, skipLayer);
}
function renameLayers(layerCollection, skipLayer) {
for (var i = 0; i &lt; layerCollection.length; i++) {
var layer = layerCollection[i];
// 再帰はグループなら常に行う(グループ内の処理は止めない)
if (layer.typename === 'LayerSet') {
renameLayers(layer.layers, skipLayer);
}
// アクティブレイヤー自身(Layer or LayerSet)だけは除外して名前変更しない
if (layer === skipLayer) continue;
// ★で始まる名前なら置換
if (layer.name.charAt(0) === '★') {
layer.name = (layer.name.length === 1) ? '☆' : '☆' + layer.name.substring(1);
}
}
}
"
-- 1. JSXコード(省略、内容同じ)
-- 変数取得
tell application "Keyboard Maestro Engine"
set myLN to getvariable "PSLayerName" as text
end tell
-- 星チェック処理
set processFlag to false
if myLN starts with "★" then
if (length of myLN) &gt; 1 then
set restText to text 2 thru -1 of myLN
set secondOffset to offset of "★" in restText
if secondOffset is 0 then
set processFlag to true
end if
else
-- 1文字のみが「★」の場合も処理対象
set processFlag to true
end if
end if
if processFlag then
tell application id "com.adobe.photoshop"
do javascript jsxCode
end tell
end if
-- 4. アクティブレイヤーの名前を Keyboard Maestro の変数で上書き
tell application id "com.adobe.photoshop"
set name of current layer of current document to myLN
end tell</string>
<key>TimeOutAbortsMacro</key>
<true/>
<key>TrimResults</key>
<true/>
<key>TrimResultsNew</key>
<true/>
<key>UseText</key>
<true/>
</dict>
</array>
<key>TimeOutAbortsMacro</key>
<true/>
</dict>
</array>
<key>CreationDate</key>
<real>683471164.55709195</real>
<key>ModificationDate</key>
<real>774708776.80095696</real>
<key>Name</key>
<string>UTL:レイヤーリネーム</string>
<key>Triggers</key>
<array>
<dict>
<key>FireType</key>
<string>Pressed</string>
<key>KeyCode</key>
<integer>15</integer>
<key>MacroTriggerType</key>
<string>HotKey</string>
<key>Modifiers</key>
<integer>0</integer>
</dict>
</array>
<key>UID</key>
<string>F7845850-5FA2-4473-9011-7CBB3E5C4E41</string>
</dict>
</array>
<key>Modifiers</key>
<integer>4096</integer>
<key>Name</key>
<string>PhotoshopPalettesWindow1</string>
<key>PaletteUnderMouse</key>
<true/>
<key>Targeting</key>
<dict>
<key>Targeting</key>
<string>Included</string>
<key>TargetingApps</key>
<array>
<dict>
<key>BundleIdentifier</key>
<string>com.adobe.Photoshop</string>
<key>Match</key>
<string>BundleID</string>
<key>Name</key>
<string>Adobe Photoshop 2025</string>
<key>NewFile</key>
<string>/Applications/Adobe Photoshop 2025/Adobe Photoshop 2025.app</string>
</dict>
</array>
</dict>
<key>Theme</key>
<dict>
<key>Columns</key>
<integer>2</integer>
<key>Opacity</key>
<integer>100</integer>
<key>UseDefaultInstead</key>
<false/>
<key>UseTitle</key>
<false/>
<key>UseTrigger</key>
<true/>
</dict>
<key>ToggleMacroUID</key>
<string>5C291F3F-311F-4124-8CF1-0A58B1A84E09</string>
<key>UID</key>
<string>14905F45-EEE3-4F58-A39D-9D85F7F4D603</string>
</dict>
</array>
</plist>
#target photoshop
/*
<javascriptresource>
<name>Toggle Starred Layers</name>
<category>YPresets</category>
</javascriptresource>
*/
// ★で始まるレイヤー・レイヤーグループを表示・非表示
if (app.documents.length > 0) {
app.activeDocument.suspendHistory("Toggle Starred Layers", "main()");
}
function main() {
var prefix = "★";
var layers = collectAllLayers(app.activeDocument);
for (var i = 0; i < layers.length; i++) {
if (layers[i].name.indexOf(prefix) === 0) {
layers[i].visible = !layers[i].visible;
}
}
}
function collectAllLayers(parent) {
var result = [];
for (var i = 0; i < parent.layers.length; i++) {
var layer = parent.layers[i];
result.push(layer);
if (layer.typename === "LayerSet") {
result = result.concat(collectAllLayers(layer));
}
}
return result;
}
#target photoshop
/*
<javascriptresource>
<name>一番下以外の表示トグル</name>
<category>YPresets</category>
</javascriptresource>
*/
// 一番下のレイヤー・レイヤーグループの目玉をoption+クリックしたときと同じ動作をショートカットで行うためのスクリプト
// ショートカットを割り当てて使う。推奨はF1(WinはF2)
// --- IDs & helpers (hoisted once) ---
var cid = charIDToTypeID;
var ID_SHOW = cid("Shw ");
var ID_NULL = cid("null");
var ID_LAYER = cid("Lyr ");
var ID_BKG = cid("Bckg");
var ID_TOGGLE = cid("TglO");
function bottomLayerOf(doc) {
// レイヤーが無い or 非対応なら null
if (!doc || !doc.layers || doc.layers.length === 0) return null;
return doc.layers[doc.layers.length - 1];
}
function toggleLayerVisibility() {
try {
var doc = app.activeDocument;
var targetLayer = bottomLayerOf(doc);
if (!targetLayer) return; // レイヤー無しなら終了
var ref = new ActionReference();
if (targetLayer.isBackgroundLayer) {
ref.putProperty(ID_LAYER, ID_BKG);
} else {
ref.putIndex(ID_LAYER, targetLayer.itemIndex);
}
var list = new ActionList();
list.putReference(ref);
var desc = new ActionDescriptor();
desc.putList(ID_NULL, list);
desc.putBoolean(ID_TOGGLE, true);
executeAction(ID_SHOW, desc, DialogModes.NO);
} catch (e) {
// no-op(Photoshopの一時状態で失敗する場合に備える)
}
}
toggleLayerVisibility();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment