レイヤー内のテキストを検索する

Photoshopで入力した文字を検索したい、という場合に手作業で調べないといけません。MacOS X TigerのSpotlightでも、標準ではレイヤー内のテキストまでは検索してくれません。そこで、スクリプトの出番です。以下のサンプルは開いているドキュメント内にあるテキストレイヤー内にある文字を検索します。
検索で指定できる文字は正規表現のものが使えます。*+.?などを使えますが、普通は用がないでしょう。(一番よく使う*は「頭脳*」のように指定すると頭脳で始まる文字列であれば一致したものとみなします。他の正規表現文字列に関しては以下のページを参照してください)

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


gFlag = false;
// レイヤーセット内にレイヤーが含まれる限り検索(再帰)
function searchLayerText(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;
layName = layObj.artLayers[i].name;
flag = txt.match(srchText);
if (flag != null)
{
alert("レイヤー名「"+layName+"」でテキストが見つかりました");
gFlag = true;
return;
}
}
}
var ns = layObj.layerSets.length;
for (i=0; i<ns; i++)
{
searchLayerText(layObj.layerSets[i])
}
}

srchText = prompt("検索するテキストを入れてください","");
searchLayerText(activeDocument);
if (!gFlag)
{
alert("文字は見つかりませんでした");
}


ドキュメントが1つなら目で見た方が早いでしょう。しかし、ドキュメントが100枚くらいあると、さすがに人間では見落としが発生しますし、見ているだけで疲れてしまいます。
そこで以下のスクリプトは指定したフォルダにあるPSDファイルを開いて文字列を検索し、結果をテキストファイルに書き出してくれます。
書き出すテキストファイルは以下の形式になります。

ファイルのパス:文字列が見つかったレイヤー名

この部分を変更したい場合には

fileObj.write(psdname+" : ");
fileObj.write(layName+CR);

の部分を変えてください。
上がファイルのあるパス、下がレイヤー名になっています。


// レイヤーセット内にレイヤーが含まれる限り検索(再帰)
function searchLayerText(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;
layName = layObj.artLayers[i].name;
flag = txt.match(srchText);
if (flag != null)
{
fileObj.write(psdname+" : ");
fileObj.write(layName+CR);
}
}
}
var ns = layObj.layerSets.length;
for (i=0; i<ns; i++)
{
searchLayerText(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));
searchLayerText(activeDocument);
activeDocument.close(SaveOptions.DONOTSAVECHANGES);
}
}

psdname = "";
CR = String.fromCharCode(13);
srchText = prompt("検索するテキストを入れてください","");
savename = File.saveDialog("保存するファイル名を入れてください");
if (savename)
{
fileObj = new File(savename);
flag = fileObj.open("w");
if (flag == true)
{
fileObj.write("検索した文字:"+srchText+CR);
folderSearch();
fileObj.close();
}else{
alert("ファイルが開けませんでした");
}
}



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