Skip to main content
simene49649793
Known Participant
December 2, 2017
Answered

Replace text in text layers

  • December 2, 2017
  • 2 replies
  • 1542 views

I found a function from c.pfaffenbichler here on the forum, which will search/replace text. The script works great if you have a flat document, but as soon as you create a group the script won't work anymore.

Here's the function:

function replaceText (searchText, replaceWith)

{

    var actionDes1 = new ActionDescriptor();

    var actionRef = new ActionReference();

    actionRef.putProperty( charIDToTypeID( "Prpr" ), stringIDToTypeID("replace") );

    actionRef.putEnumerated( charIDToTypeID( "TxLr" ), charIDToTypeID( "Ordn" ), charIDToTypeID( "Al  " ) );

    actionDes1.putReference( charIDToTypeID( "null" ), actionRef );

    var actionDes2 = new ActionDescriptor();

    actionDes2.putString( stringIDToTypeID( "find" ), searchText );

    actionDes2.putString( stringIDToTypeID("replace"), replaceWith );

    actionDes2.putBoolean( stringIDToTypeID( "checkAll" ), false );

    actionDes2.putBoolean( charIDToTypeID( "Fwd " ), true );

    actionDes2.putBoolean( stringIDToTypeID( "caseSensitive" ), false );

    actionDes2.putBoolean( stringIDToTypeID( "wholeWord" ), false );

    actionDes2.putBoolean( stringIDToTypeID( "ignoreAccents" ), true );

    actionDes1.putObject( charIDToTypeID( "Usng" ), stringIDToTypeID( "findReplace" ), actionDes2 );

    executeAction( stringIDToTypeID("replace"), actionDes1, DialogModes.NO );

};

replaceText ("test", "replaceWithStuff")

Here's the error I get:

---------------------------

Error

---------------------------

Error 8800: General Photoshop error occurred. This functionality may not be available in this version of Photoshop.

- The object "in contents of all text layer" is not currently available.

Line: 21

->      executeAction( stringIDToTypeID("replace"), actionDes1, DialogModes.NO );

---------------------------

OK  

---------------------------

Does anyone know how to work around this problem? I've tried a try/catch, the only thing that does is to suppress the error, but it won't replace the text 😕😕

This topic has been closed for replies.
Correct answer Jarda Bereza

I think we need adjust reference:

actionRef.putEnumerated( charIDToTypeID( "TxLr" ), charIDToTypeID( "Ordn" ), charIDToTypeID( "Al  " ) );

It should change all layers in document with layer kind "text"

So I would try this:

actionRef.putEnumerated( charIDToTypeID( "TxLr" ), charIDToTypeID( "Ordn" ), charIDToTypeID( "Trgt" ) );

This should change only all selected layers with kind "text". So it's up to you how you select only desired layers.

(not tested)

2 replies

Legend
December 2, 2017

In order for your function to work you must stand on the text layer, regardless of whether the layer is in a group or not.

You can temporarily create a text layer,, call a function and then delete the temporary layer.

var layer0 = app.activeDocument.activeLayer;

var layer =  app.activeDocument.artLayers.add();

layer.kind = LayerKind.TEXT;

replaceText ("test", "replaceWithStuff") 

layer.remove();

app.activeDocument.activeLayer = layer0;

But in order for the replacement to be in all layers, you need to change the string in the function

actionDes2.putBoolean( stringIDToTypeID( "checkAll" ), false ); 

on this

actionDes2.putBoolean( stringIDToTypeID( "checkAll" ), true ); 

simene49649793
Known Participant
December 3, 2017

Thank you so much both of you, combining your input gives me exactly what I wanted

Jarda Bereza
Jarda BerezaCorrect answer
Inspiring
December 2, 2017

I think we need adjust reference:

actionRef.putEnumerated( charIDToTypeID( "TxLr" ), charIDToTypeID( "Ordn" ), charIDToTypeID( "Al  " ) );

It should change all layers in document with layer kind "text"

So I would try this:

actionRef.putEnumerated( charIDToTypeID( "TxLr" ), charIDToTypeID( "Ordn" ), charIDToTypeID( "Trgt" ) );

This should change only all selected layers with kind "text". So it's up to you how you select only desired layers.

(not tested)