Skip to main content
simene49649793
Known Participant
Feb 7, 2017 2:28 AM UTC
Answered

Restore Photoshop Text Layer Name Auto-Updating

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.

r-binCorrect answer
Legend
Feb 13, 2018 12:46 AM UTC

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;

17 replies

r-binCorrect answer
Legend
Feb 13, 2018 12:46 AM UTC

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;

Translate
Known Participant
Mar 13, 2024 1:46 AM UTC

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!

Translate
Stephen Marsh
Community Expert
Community Expert
Mar 13, 2024 4:29 AM UTC
quote

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;
}

 

Translate
Inspiring
Feb 12, 2018 9:40 PM UTC

Solution:

1. Highlight the text layer

2. type [ENTER], [Backspace], [ENTER]

3. It will auto update and keep auto updating.

Translate
nicazuela
Participant
Oct 15, 2020 9:40 PM UTC

Oh my god, this is exactly what I needed. What a simple solution. Thank you!

Translate
Feb 8, 2017 9:11 AM UTC

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.name =textLayers.textItem.contents; 

    } 

 

    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 

    } 

})();

Translate
simene49649793
Known Participant
Feb 8, 2017 8:00 PM UTC

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

Translate
PECourtejoie
Community Expert
Community Expert
Feb 9, 2017 5:52 PM UTC

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?

Translate
JJMack
Community Expert
Community Expert
Feb 7, 2017 4:11 AM UTC

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.

Translate
JJMack