Skip to main content
simene49649793
Known Participant
February 7, 2017
Answered

Restore Photoshop Text Layer Name Auto-Updating

  • February 7, 2017
  • 4 replies
  • 9052 views

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.

Correct answer 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;

4 replies

r-binCorrect answer
Legend
February 13, 2018

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;

Known Participant
March 13, 2024

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!

Stephen Marsh
Community Expert
Community Expert
March 13, 2024
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;
}

 

Inspiring
February 12, 2018

Solution:

1. Highlight the text layer

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

3. It will auto update and keep auto updating.

nicazuela
Participant
October 15, 2020

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

February 8, 2017

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 

    } 

})();

simene49649793
Known Participant
February 8, 2017

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

PECourtejoie
Community Expert
Community Expert
February 9, 2017

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?

JJMack
Community Expert
Community Expert
February 7, 2017

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.

JJMack