Copy link to clipboard
Copied
Text layers in Photoshop will auto-update the layer name with the text content of the layer unless you manually edit the layer name in the layers panel. Then it retains the manually entered layer name. How would one go about restoring this auto-updating of the layer name to a layer whose name has been manually edited?
Is this possible at all? I've googled this, and everyone says it's not possible to do this manually, but that it might be possible with scripting. Does anyone know?
I know you can duplicate the layer, then re-enter the text, but that gets a bit tricky if your text has multiple fonts and colors.
Simene, I thought about duplicating the text layer, but in the panel, the text copy gets appended, and future edition of the text does not update it...
BUT! If you duplicate the layer using CMD+J, copy also gets appended, then, if you re-edit that text (selecting, then CMD+enter), the layer name auto updates again. Now, a scripter could use the scriptlistener to find the difference between the duplicate from panel and CMD+J, then update content, delete the original text layer... and it could be
...Solution:
1. Highlight the text layer
2. type [ENTER], [Backspace], [ENTER]
3. It will auto update and keep auto updating.
...var layer0 = app.activeDocument.activeLayer;
var fx = true;
var gr = layer0.grouped;
try { executeAction( charIDToTypeID( "CpFX" ), undefined, DialogModes.NO ); } catch (e) {fx = false;}
var r = new ActionReference();
r.putProperty(charIDToTypeID("Prpr"), stringIDToTypeID("textKey"));
r.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
var textKey = executeActionGet(r).getObjectValue(stringIDToTypeID("textKey"));
var r = new ActionReference();
r.putClass(stringIDT
Copy link to clipboard
Copied
If you have not not closed the document if there is a history state before you changed the layer name you could back up to that point in time. Else I believe its a done deal. You would need to create a new text later to match the existing one.
Copy link to clipboard
Copied
You can try following Script, Tomas Sinkunas do the most of the works, a tribute to Master!
// Script Auto-Update the layer's name
// by Du Hui a JS new hand ,
// Most of the following cord was Tomas Sinkunas's works, I write just one line.
(function(){
#target photoshop
// Collect all text layers in the document
var textLayers = getTextLayers(app.activeDocument);
// Loop through all text layers in the document
for (var t = 0, tl = textLayers.length; t < tl ; t ++) {
// get TXTlayer's contents and Assing values to the lyayer's name
textLayers
}
function getTextLayers (doc, layers) {
layers = layers || [];
for (var i = 0, il = doc.layers.length; i < il; i ++) {
if (doc.layers.typename == "LayerSet") {
getTextLayers(doc.layers, layers)
} else {
if (doc.layers.kind == "LayerKind.TEXT") {
layers.push(doc.layers)
}
}
}
return layers
}
})();
Copy link to clipboard
Copied
JJMack: Yeah I thought so
luhuaidan: That's what I have now, renaming the layers to their content. However, it doesn't solve the auto-updating of layername based on text content. Thanks though
Copy link to clipboard
Copied
Simene, I thought about duplicating the text layer, but in the panel, the text copy gets appended, and future edition of the text does not update it...
BUT! If you duplicate the layer using CMD+J, copy also gets appended, then, if you re-edit that text (selecting, then CMD+enter), the layer name auto updates again. Now, a scripter could use the scriptlistener to find the difference between the duplicate from panel and CMD+J, then update content, delete the original text layer... and it could be automated, no?
Copy link to clipboard
Copied
Thank you. I feel relieved that it's been resolved!
Copy link to clipboard
Copied
thank you, thank you, thank you 🙂
Copy link to clipboard
Copied
Solution:
1. Highlight the text layer
2. type [ENTER], [Backspace], [ENTER]
3. It will auto update and keep auto updating.
Copy link to clipboard
Copied
Oh my god, this is exactly what I needed. What a simple solution. Thank you!
Copy link to clipboard
Copied
I know this is very old, but ENTER doesn't seem to do anything after highlighting the layer. So when I then hit Backspace it just deletes the layer. What am I missing?
Copy link to clipboard
Copied
var layer0 = app.activeDocument.activeLayer;
var fx = true;
var gr = layer0.grouped;
try { executeAction( charIDToTypeID( "CpFX" ), undefined, DialogModes.NO ); } catch (e) {fx = false;}
var r = new ActionReference();
r.putProperty(charIDToTypeID("Prpr"), stringIDToTypeID("textKey"));
r.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
var textKey = executeActionGet(r).getObjectValue(stringIDToTypeID("textKey"));
var r = new ActionReference();
r.putClass(stringIDToTypeID( "textLayer"));
var d = new ActionDescriptor();
d.putReference( charIDToTypeID( "null" ), r );
d.putObject( charIDToTypeID( "Usng" ), stringIDToTypeID( "textLayer"), textKey);
executeAction( charIDToTypeID( "Mk " ), d, DialogModes.NO );
var layer1 = app.activeDocument.activeLayer;
if (fx) executeAction( charIDToTypeID( "PaFX" ), undefined, DialogModes.NO );
if (!layer1.grouped && gr) layer1.grouped = gr;
layer0.remove();
app.activeDocument.activeLayer = layer1;
Copy link to clipboard
Copied
I'm here to thank you for your script, but could you make this able to change all text layers in a file? The script will be very useful for us!
Copy link to clipboard
Copied
I'm here to thank you for your script, but could you make this able to change all text layers in a file? The script will be very useful for us!
By @Zipser31550168t845
Here you go:
/*
Reset and Sync All Top Level Text Layer Names to Content.jsx
https://community.adobe.com/t5/photoshop-ecosystem-discussions/restore-photoshop-text-layer-name-auto-updating/td-p/8835798
v1.0, 13th March 2024, Stephen Marsh
*/
#target photoshop
function main() {
// Hack to ensure that a layer is selected
activeDocument.artLayers.add();
activeDocument.activeLayer.remove();
var counter = 0;
// Start Timer
var timeDiff = {
setStartTime: function () {
d = new Date();
time = d.getTime();
},
getDiff: function () {
d = new Date();
t = d.getTime() - time;
time = d.getTime();
return t;
}
};
timeDiff.setStartTime();
// Loop over the text layers
for (var i = 0; i < activeDocument.artLayers.length; i++) {
try {
activeDocument.activeLayer = activeDocument.artLayers[i];
if (app.activeDocument.activeLayer.kind == LayerKind.TEXT) {
resetTextLayer();
counter++;
}
} catch (e) {}
}
alert(counter + " text layers reset!" + "\r" + "Run Time: " + timeDiff.getDiff() / 1000 + " seconds");
}
activeDocument.suspendHistory("Reset all text layers...", "main()");
function resetTextLayer() {
// by r-bin
var layer0 = app.activeDocument.activeLayer;
var fx = true;
var gr = layer0.grouped;
try {
executeAction(charIDToTypeID("CpFX"), undefined, DialogModes.NO);
} catch (e) {
fx = false;
}
var r = new ActionReference();
r.putProperty(charIDToTypeID("Prpr"), stringIDToTypeID("textKey"));
r.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
var textKey = executeActionGet(r).getObjectValue(stringIDToTypeID("textKey"));
var r = new ActionReference();
r.putClass(stringIDToTypeID("textLayer"));
var d = new ActionDescriptor();
d.putReference(charIDToTypeID("null"), r);
d.putObject(charIDToTypeID("Usng"), stringIDToTypeID("textLayer"), textKey);
executeAction(charIDToTypeID("Mk "), d, DialogModes.NO);
var layer1 = app.activeDocument.activeLayer;
if (fx) executeAction(charIDToTypeID("PaFX"), undefined, DialogModes.NO);
if (!layer1.grouped && gr) layer1.grouped = gr;
layer0.remove();
app.activeDocument.activeLayer = layer1;
}
Copy link to clipboard
Copied
@Zipser31550168t845 – thanks for the upvote, your bump made me realise that the previous script only reset the names of root/top-level text layers, not text layers in groups/nested groups.
The following script processes root/top-level text layers and text layers inside groups/nested groups:
/*
Reset and Sync All Top Level Text Layer Names to Content Including Groups.jsx
v1.0, 10th June 2024, Stephen Marsh
https://community.adobe.com/t5/photoshop-ecosystem-discussions/restore-photoshop-text-layer-name-auto-updating/m-p/14485769
*/
#target photoshop
var counter = 0;
// Start Timer
var timeDiff = {
setStartTime: function () {
d = new Date();
time = d.getTime();
},
getDiff: function () {
d = new Date();
t = d.getTime() - time;
time = d.getTime();
return t;
}
};
timeDiff.setStartTime();
if (!documents.length) {
alert('There are no documents open!');
} else {
processAllLayersAndSets(app.activeDocument);
alert(counter + " text layers reset!" + "\r" + "Run Time: " + timeDiff.getDiff() / 1000 + " seconds");
}
function processAllLayersAndSets(obj) {
// Process Layers
for (var i = obj.artLayers.length - 1; 0 <= i; i--) {
app.activeDocument.activeLayer = obj.artLayers[i];
if (app.activeDocument.activeLayer.kind == LayerKind.TEXT) {
resetTextLayer();
}
}
// Process Layer Set Layers
for (var j = obj.layerSets.length - 1; 0 <= j; j--) {
processAllLayersAndSets(obj.layerSets[j]);
}
counter++;
}
function resetTextLayer() {
// by r-bin
var layer0 = app.activeDocument.activeLayer;
var fx = true;
var gr = layer0.grouped;
try {
executeAction(charIDToTypeID("CpFX"), undefined, DialogModes.NO);
} catch (e) {
fx = false;
}
var r = new ActionReference();
r.putProperty(charIDToTypeID("Prpr"), stringIDToTypeID("textKey"));
r.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
var textKey = executeActionGet(r).getObjectValue(stringIDToTypeID("textKey"));
var r = new ActionReference();
r.putClass(stringIDToTypeID("textLayer"));
var d = new ActionDescriptor();
d.putReference(charIDToTypeID("null"), r);
d.putObject(charIDToTypeID("Usng"), stringIDToTypeID("textLayer"), textKey);
executeAction(charIDToTypeID("Mk "), d, DialogModes.NO);
var layer1 = app.activeDocument.activeLayer;
if (fx) executeAction(charIDToTypeID("PaFX"), undefined, DialogModes.NO);
if (!layer1.grouped && gr) layer1.grouped = gr;
layer0.remove();
app.activeDocument.activeLayer = layer1;
}
Copy link to clipboard
Copied
thank you Sir for your greatly kindness! I was laid off for 2 months so haven't got a chance trying your script and got you wait, but I will share it to my old colleague 😄 Thanks again for your big help!