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!
Copy link to clipboard
Copied
Nice work on this script, it works well! I used it on a large poster that has about 1200 text layers. It found 57 that needed the fix and it took 12.86 minutes to complete. It didn't crash photoshop or freeze. For those who need to use this, be warned that it does turn on all the layers and open/expand all the groups in the layers panel. That wasnt an issue for me in this doc but I know having all the layers turned on could be a little confusing depending on the project. Thanks a bunch for creating this script!
Copy link to clipboard
Copied
/*
Utility Pack Scripts created by David M. Converse ©2018-24
This script renames text layers in an open Photoshop document
Last modifed 7/5/2024
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#target photoshop
renameTextLayers();
function renameTextLayers(){
if(!app.documents.length > 0){
return;
}
var docRef = null;
var vis = true;
var LayerRef = null;
var TextRef = null;
var layerText = '';
try{
docRef = app.activeDocument;
docRef.activeLayer = docRef.artLayers[0];
for(var i = 0; i < docRef.artLayers.length; i++){
LayerRef = docRef.artLayers[i];
vis = true;
if(LayerRef.kind == LayerKind.TEXT){
if(!LayerRef.visible){
vis = false;
}
TextRef = LayerRef.textItem;
layerText = TextRef.contents;
layerText = layerText.replace(/\r$/, '');
layerText = layerText.replace(/,\r/, ', ');
if(layerText.search('\r') == -1){
layerText = layerText.split(' ');
layerText[0] = layerText[0].replace(',', '');
}
else{
layerText = layerText.split('\r');
}
LayerRef.name = layerText[0];
if(vis == false){
LayerRef.visible = false;
}
}
}
}
catch(e){
Window.alert(e + e.line);
}
}