レイヤー内のテキストを置換する

前回は文字列の検索でしたが、より実用的なもの、となると検索で一致した文字列を置き換えるようなものです。特に対象にテキストレイヤー内の文字を置換する場合に、今回のようなスクリプトは威力を発揮します。
まず、以下のスクリプトは開いているドキュメント内の##1という文字をダイアログで入力した文字に置換するものです。

// レイヤーセット内にレイヤーが含まれる限り置換(再帰)
function replaceLayerText(layObj)
{
var i;
var n = layObj.artLayers.length;
for (i=0; i<n; i++)
{
layType = layObj.artLayers[i].kind;
if (layType == LayerKind.TEXT)
{
txt = layObj.artLayers[i].textItem.contents;
result = txt.replace(/##1/g,repText);
if (result)
{
layObj.artLayers[i].textItem.contents = result;
}
}
}
var ns = layObj.layerSets.length;
for (i=0; i<ns; i++)
{
replaceLayerText(layObj.layerSets[i])
}
}

repText = prompt("置換するテキストを入れてください","");
replaceLayerText(activeDocument);


ドキュメントが100枚ある場合には上記のスクリプトでは役に立ちません。
以下のスクリプトは指定したフォルダにあるPSDファイルを開いて文字列を検索し置換してくれます。


// レイヤーセット内にレイヤーが含まれる限り置換(再帰)
function replaceLayerText(layObj)
{
var i;
var n = layObj.artLayers.length;
for (i=0; i<n; i++)
{
layType = layObj.artLayers[i].kind;
if (layType == LayerKind.TEXT)
{
txt = layObj.artLayers[i].textItem.contents;
result = txt.replace(/##1/g,repText);
if (result)
{
layObj.artLayers[i].textItem.contents = result;
}
}
}
var ns = layObj.layerSets.length;
for (i=0; i<ns; i++)
{
replaceLayerText(layObj.layerSets[i])
}
}

// フォルダ内のPSDファイルを開いて自動的に置換
function folderSearch()
{
folderObj = Folder.selectDialog("PSDファイルがあるフォルダを選択してください");
fileList = folderObj.getFiles("*.psd");
for(fCnt=0; fCnt<fileList.length; fCnt++)
{
psdname = fileList[fCnt].fsName;
open(File(psdname));
replaceLayerText(activeDocument);
activeDocument.close(SaveOptions.SAVECHANGES);
}
}

repText = prompt("置換するテキストを入れてください","");
folderSearch();


このサンプルではテキストレイヤー内の##1という文字列を置換しますが、この##1を別の文字にしたい場合には

result = txt.replace(/##1/g,repText);

の行の##1を変更してください。ただし、ここには正規表現で利用できる文字を指定することになるので注意が必要です。どのような文字列が指定できるかは以下のページを参照してください。

http://www.openspc2.org/reibun/javascript/appendix/regexp.txt
http://www.tohoho-web.com/js/regexp.htm



[サンプルをダウンロード]