InDesign 在多个文档中搜索文件名
InDesign search filename on multiple documents
我正在尝试在JavaScript中制作脚本,但是我在这方面不是很有经验,所以我在这里寻求帮助。
基本上,在我工作的地方,我每天都有大量 .indd 文件,其中包含许多不同名称和编号的不同图像。
当有人想知道某个图像在哪个文档中时,我需要手动搜索每个图像。
我正在尝试编写一个工作脚本,但没有任何运气。
我正在寻找的是一个脚本,它可以让你 select 一个文件夹,让你键入要搜索的文件名的名称(或部分名称),搜索文件夹中的所有文档而无需全部打开一次搜索文件(出于性能原因,因为文件很多),如果找到具有该名称的文件,则会向您发出警报。
我已将在各个站点上找到的各种脚本合并在一起,但由于某些未知原因它不起作用。
代码如下
app.scriptPreferences.enableRedraw = false;
var Directory = Folder.selectDialog ("Seleziona una cartella");
if (!Directory) {
exit();
}
var Documents = Directory.getFiles();
var Dialwindow = new Window("dialog");
Dialwindow.text = "Search";
Dialwindow.orientation = "column";
var Textbar = Dialwindow.add('edittext');
Textbar.preferredSize.width = 150;
Textbar.active = true
var Buttons = Dialwindow.add("group", undefined);
Buttons.orientation = "row";
var Search = Buttons.add("button", undefined, undefined);
Search.text = "Search";
Search.onClick = function() {
Dialwindow.close();
}
var Exit = Buttons.add("button", undefined, undefined);
Exit.text = "Exit";
Exit.onClick = function() {
// So far, so good, now I'm looking for a code that stops the script completely, as at the moment clicking on Search or Exit gives the same result
Dialwindow.close();
}
Dialwindow.show();
for (var i = 0; i < Documents.length; i++) {
// Now I think it begins the part that gives me problem
app.open(Documents[i]);
// As far as I understand this opens every indd files one by one
Collegamenti = app.activeDocument.links;
Result = Textbar.text;
// This script was found on a site. Normally it works, but merging it doesn't
var Array = new Array();
for(var i=0; i < Collegamenti.length; i++) {
var Nome = Collegamenti[i].name;
Nome = Nome.toLowerCase();
if(Nome.indexOf(Result.toLowerCase()) != -1)Array.push(Collegamenti[i]);
}
// I'm not sure if this is written correctly
if (Array.length= 1) {
alert("You can find the image " + Result + " in this file " + app.activeDocument.name.replace(/.[^.]+$/,''));
app.activeDocument.close(SaveOptions.NO);
}
else {
app.activeDocument.close(SaveOptions.NO);
}
}
所以这个脚本应该让你 select 一个文件夹,创建一个带有文本栏的对话框 window,搜索文件夹中的文档,如果找到具有该名称的图像会触发警告,否则关闭文档。
感谢任何可以解释错误或提出建议的人 improvements/corrections。
如果由于我的英语不好有什么不清楚的地方,请问,我会尽量说得更清楚。
编辑
感谢 Yuri 的快速回答,我从你的代码中学到了一些新东西(比如我不知道的“while() {}”和“.shift”部分)。
不幸的是,在我工作的地方,滚动所有 txt 文件来查找我正在搜索的内容并不是很实际(因为有很多 indd 文件),即使您的脚本使我免于浪费大量时间。
我很抱歉,但我可能不是很清楚,因为我的目的是了解原始代码有什么问题,所以我可以学习而不是拥有一些现成的代码。
我不明白的部分是:
for (var i = 0; i < Documents.length; i++) {
app.open(Documents[i]);
这会打开所有的文档,一个一个的,基本上是正确的,但是我不能使用app.activeDocument.links;因为没有活动文档。
有一种方法可以在上面的代码中使用变量而不是 app.activeDocument.links 吗?
我尝试使用“while (Documents.length) {var Shift = Documents.shift();var Doc = app.open(Shift);”但出于同样的原因,我不知道如何继续下一个代码。
另一件事是:
var Array = new Array();
var Links = app.activeDocument.links
for(var i=0; i < Links.length; i++) {
var Name = Links[i].name;
Name = Name.toLowerCase();
if(Name.indexOf(Textbar.text.toLowerCase()) != -1)Array.push(Links[i]);
}
它适用于所有打开的文档,但我不知道如何将它与“app.open(Documents[i]);”一起使用因为没有打开活动文档。
还有一种方法可以使用 Button.onClick = function() {} 停止脚本?我试过 exit();但它不起作用。
EDIT2
感谢 Yuri,这是最终代码:
app.scriptPreferences.enableRedraw = false;
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.NEVER_INTERACT;
var folder = Folder.selectDialog ("Select a folder");
if (!folder) exit();
var files = folder.getFiles('*.indd');
if (files.length == 0) { alert("The folder doesn\'t contain any indd files"); exit() }
var name = prompt("Write a file name:");
if (name == null) { alert("Empty textbar"); exit() }
name = name.toLowerCase();
var total = [];
while (files.length) {
var doc = app.open(files.shift());
var links = doc.links.everyItem().getElements();
if (links.length == 0) { alert("No links are present in document\r''" + doc.name.replace(/\.[^\.]+$/, '') + "''");}
var find = [];
while (links.length) {
var link = links.shift();
if (link.name.toLowerCase().indexOf(name) > -1) {find.push(link); total.push(link);}}
if (find.length > 0) { alert("The link ''" + name + "'' is\ron ''" + doc.name.replace(/\.[^\.]+$/, '') + "''");}
doc.close();}
alert("Done\r" + total.length + " links found");
给你:
var file_prefs = 'find_links.json';
var prefs = load_prefs();
main();
function main() {
// get all indd files from the folder
var folder = get_folder();
prefs.folder = folder.fullName;
var files = get_files(folder);
if (files.length == 0) { alert('The folder doesn\'t contain any indd files'); exit() }
// get the link name to search for
var name = prompt("Write a file name:", prefs.name);
if (name == null) exit();
prefs.name = name;
var report = ['Folder: ' + folder.fsName];
report.push(['Search for: ' + name]);
name = name.toLowerCase();
// search the name among of the links of every indd document
while (files.length) {
var doc = app.open(files.shift());
report.push('\n' + doc.name);
var links = doc.links.everyItem().getElements();
while (links.length) {
var link = links.shift();
if (link.name.toLowerCase().indexOf(name) > -1)
report.push(link.filePath);
}
doc.close();
}
// save the report in a text file and open the file
var report_file = File(folder + '/report.txt');
report_file.encoding = 'utf-8';
report_file.open('w');
report_file.write(report.join('\n'));
report_file.close();
if (report_file.exists) report_file.execute();
}
save_prefs();
// ----------------------------------------------------------------------------
function load_prefs() {
var file = File(Folder.temp + '/' + file_prefs);
if (!file.exists) return { folder: '', name: '' }
return $.evalFile(file);
}
function save_prefs() {
var file = File(Folder.temp + '/' + file_prefs);
file.encoding = 'utf-8';
file.open('w');
file.write(prefs.toSource());
}
function get_folder() {
if (prefs.folder != '') { var folder = Folder(prefs.folder) }
else { var folder = new Folder() }
return folder.selectDlg();
}
function get_files(folder) {
var files = folder.getFiles('*.indd');
files = files.sort(sortFileNames);
return files;
}
// additional function to correct sorting
// https://community.adobe.com/t5/indesign-discussions/help-tweaking-indesign-script-to-alphabetize-imagecatalog-jsx/td-p/10812327
function sortFileNames( a,b ) {
a = a.name;
b = b.name;
var myRegExp = new RegExp('^\d+');
var aObj = {num: a.match(myRegExp) != null ? a.match(myRegExp)[0] : '_', string: a.replace(/^\d+/, '')};
var bObj = {num: b.match(myRegExp) != null ? b.match(myRegExp)[0] : '_', string: b.replace(/^\d+/, '')};
// a and b are fully numeric :
if (aObj.string =='' && bObj.string == '') return a - b;
// the numeric parts of a and b are equal :
if (aObj.num == bObj.num ) return aObj.string.toLowerCase() > bObj.string.toLowerCase();
// the numeric part of a is greater than the numeric part of b :
if (aObj.num > bObj.num ) return 1 ;
};
脚本询问文件夹和文件名(或部分名称),打开给定文件夹中的所有 indd 文件,并在每个 indd 文件的链接中找到给定的名称。然后它将报告保存在文件 'report.txt' 中(到同一文件夹中)并打开 txt 文件。
由于您的代码包含太多错误,因此很难逐一解释。我已尝试修复错误并或多或少地保持您的算法完好无损。这是工作代码:
var directory = Folder.selectDialog("Seleziona una cartella");
if (!directory) exit();
// dialog window -------------------------------------------------------
var dialwindow = new Window("dialog", "Search");
var textbar = dialwindow.add('edittext');
textbar.preferredSize.width = 150;
textbar.active = true
var buttons = dialwindow.add("group", undefined);
buttons.orientation = "row";
var search = buttons.add("button", undefined, "Search");
var cancel = buttons.add("button", undefined, "Exit");
dialwindow.defaultElement = search;
dialwindow.cancelElement = cancel;
if (dialwindow.show() != 1) exit();
// main code -----------------------------------------------------------
var result = textbar.text;
var documents = directory.getFiles('*.indd');
for (var i = 0; i < documents.length; i++) {
var doc = app.open(documents[i]);
var links = doc.links;
var arr = [];
for (var j = 0; j < links.length; j++) {
var link_name = links[j].name.toLowerCase();
if (link_name.indexOf(result.toLowerCase()) > -1) {
arr.push(links[j]);
break;
}
}
if (arr.length > 0) {
alert("You can find the image " + result + " in this file " + doc.name.replace(/\.[^\.]+$/, ''));
}
doc.close(SaveOptions.NO);
}
我正在尝试在JavaScript中制作脚本,但是我在这方面不是很有经验,所以我在这里寻求帮助。
基本上,在我工作的地方,我每天都有大量 .indd 文件,其中包含许多不同名称和编号的不同图像。 当有人想知道某个图像在哪个文档中时,我需要手动搜索每个图像。
我正在尝试编写一个工作脚本,但没有任何运气。 我正在寻找的是一个脚本,它可以让你 select 一个文件夹,让你键入要搜索的文件名的名称(或部分名称),搜索文件夹中的所有文档而无需全部打开一次搜索文件(出于性能原因,因为文件很多),如果找到具有该名称的文件,则会向您发出警报。
我已将在各个站点上找到的各种脚本合并在一起,但由于某些未知原因它不起作用。
代码如下
app.scriptPreferences.enableRedraw = false;
var Directory = Folder.selectDialog ("Seleziona una cartella");
if (!Directory) {
exit();
}
var Documents = Directory.getFiles();
var Dialwindow = new Window("dialog");
Dialwindow.text = "Search";
Dialwindow.orientation = "column";
var Textbar = Dialwindow.add('edittext');
Textbar.preferredSize.width = 150;
Textbar.active = true
var Buttons = Dialwindow.add("group", undefined);
Buttons.orientation = "row";
var Search = Buttons.add("button", undefined, undefined);
Search.text = "Search";
Search.onClick = function() {
Dialwindow.close();
}
var Exit = Buttons.add("button", undefined, undefined);
Exit.text = "Exit";
Exit.onClick = function() {
// So far, so good, now I'm looking for a code that stops the script completely, as at the moment clicking on Search or Exit gives the same result
Dialwindow.close();
}
Dialwindow.show();
for (var i = 0; i < Documents.length; i++) {
// Now I think it begins the part that gives me problem
app.open(Documents[i]);
// As far as I understand this opens every indd files one by one
Collegamenti = app.activeDocument.links;
Result = Textbar.text;
// This script was found on a site. Normally it works, but merging it doesn't
var Array = new Array();
for(var i=0; i < Collegamenti.length; i++) {
var Nome = Collegamenti[i].name;
Nome = Nome.toLowerCase();
if(Nome.indexOf(Result.toLowerCase()) != -1)Array.push(Collegamenti[i]);
}
// I'm not sure if this is written correctly
if (Array.length= 1) {
alert("You can find the image " + Result + " in this file " + app.activeDocument.name.replace(/.[^.]+$/,''));
app.activeDocument.close(SaveOptions.NO);
}
else {
app.activeDocument.close(SaveOptions.NO);
}
}
所以这个脚本应该让你 select 一个文件夹,创建一个带有文本栏的对话框 window,搜索文件夹中的文档,如果找到具有该名称的图像会触发警告,否则关闭文档。
感谢任何可以解释错误或提出建议的人 improvements/corrections。 如果由于我的英语不好有什么不清楚的地方,请问,我会尽量说得更清楚。
编辑
感谢 Yuri 的快速回答,我从你的代码中学到了一些新东西(比如我不知道的“while() {}”和“.shift”部分)。 不幸的是,在我工作的地方,滚动所有 txt 文件来查找我正在搜索的内容并不是很实际(因为有很多 indd 文件),即使您的脚本使我免于浪费大量时间。 我很抱歉,但我可能不是很清楚,因为我的目的是了解原始代码有什么问题,所以我可以学习而不是拥有一些现成的代码。 我不明白的部分是:
for (var i = 0; i < Documents.length; i++) {
app.open(Documents[i]);
这会打开所有的文档,一个一个的,基本上是正确的,但是我不能使用app.activeDocument.links;因为没有活动文档。 有一种方法可以在上面的代码中使用变量而不是 app.activeDocument.links 吗? 我尝试使用“while (Documents.length) {var Shift = Documents.shift();var Doc = app.open(Shift);”但出于同样的原因,我不知道如何继续下一个代码。 另一件事是:
var Array = new Array();
var Links = app.activeDocument.links
for(var i=0; i < Links.length; i++) {
var Name = Links[i].name;
Name = Name.toLowerCase();
if(Name.indexOf(Textbar.text.toLowerCase()) != -1)Array.push(Links[i]);
}
它适用于所有打开的文档,但我不知道如何将它与“app.open(Documents[i]);”一起使用因为没有打开活动文档。 还有一种方法可以使用 Button.onClick = function() {} 停止脚本?我试过 exit();但它不起作用。
EDIT2
感谢 Yuri,这是最终代码:
app.scriptPreferences.enableRedraw = false;
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.NEVER_INTERACT;
var folder = Folder.selectDialog ("Select a folder");
if (!folder) exit();
var files = folder.getFiles('*.indd');
if (files.length == 0) { alert("The folder doesn\'t contain any indd files"); exit() }
var name = prompt("Write a file name:");
if (name == null) { alert("Empty textbar"); exit() }
name = name.toLowerCase();
var total = [];
while (files.length) {
var doc = app.open(files.shift());
var links = doc.links.everyItem().getElements();
if (links.length == 0) { alert("No links are present in document\r''" + doc.name.replace(/\.[^\.]+$/, '') + "''");}
var find = [];
while (links.length) {
var link = links.shift();
if (link.name.toLowerCase().indexOf(name) > -1) {find.push(link); total.push(link);}}
if (find.length > 0) { alert("The link ''" + name + "'' is\ron ''" + doc.name.replace(/\.[^\.]+$/, '') + "''");}
doc.close();}
alert("Done\r" + total.length + " links found");
给你:
var file_prefs = 'find_links.json';
var prefs = load_prefs();
main();
function main() {
// get all indd files from the folder
var folder = get_folder();
prefs.folder = folder.fullName;
var files = get_files(folder);
if (files.length == 0) { alert('The folder doesn\'t contain any indd files'); exit() }
// get the link name to search for
var name = prompt("Write a file name:", prefs.name);
if (name == null) exit();
prefs.name = name;
var report = ['Folder: ' + folder.fsName];
report.push(['Search for: ' + name]);
name = name.toLowerCase();
// search the name among of the links of every indd document
while (files.length) {
var doc = app.open(files.shift());
report.push('\n' + doc.name);
var links = doc.links.everyItem().getElements();
while (links.length) {
var link = links.shift();
if (link.name.toLowerCase().indexOf(name) > -1)
report.push(link.filePath);
}
doc.close();
}
// save the report in a text file and open the file
var report_file = File(folder + '/report.txt');
report_file.encoding = 'utf-8';
report_file.open('w');
report_file.write(report.join('\n'));
report_file.close();
if (report_file.exists) report_file.execute();
}
save_prefs();
// ----------------------------------------------------------------------------
function load_prefs() {
var file = File(Folder.temp + '/' + file_prefs);
if (!file.exists) return { folder: '', name: '' }
return $.evalFile(file);
}
function save_prefs() {
var file = File(Folder.temp + '/' + file_prefs);
file.encoding = 'utf-8';
file.open('w');
file.write(prefs.toSource());
}
function get_folder() {
if (prefs.folder != '') { var folder = Folder(prefs.folder) }
else { var folder = new Folder() }
return folder.selectDlg();
}
function get_files(folder) {
var files = folder.getFiles('*.indd');
files = files.sort(sortFileNames);
return files;
}
// additional function to correct sorting
// https://community.adobe.com/t5/indesign-discussions/help-tweaking-indesign-script-to-alphabetize-imagecatalog-jsx/td-p/10812327
function sortFileNames( a,b ) {
a = a.name;
b = b.name;
var myRegExp = new RegExp('^\d+');
var aObj = {num: a.match(myRegExp) != null ? a.match(myRegExp)[0] : '_', string: a.replace(/^\d+/, '')};
var bObj = {num: b.match(myRegExp) != null ? b.match(myRegExp)[0] : '_', string: b.replace(/^\d+/, '')};
// a and b are fully numeric :
if (aObj.string =='' && bObj.string == '') return a - b;
// the numeric parts of a and b are equal :
if (aObj.num == bObj.num ) return aObj.string.toLowerCase() > bObj.string.toLowerCase();
// the numeric part of a is greater than the numeric part of b :
if (aObj.num > bObj.num ) return 1 ;
};
脚本询问文件夹和文件名(或部分名称),打开给定文件夹中的所有 indd 文件,并在每个 indd 文件的链接中找到给定的名称。然后它将报告保存在文件 'report.txt' 中(到同一文件夹中)并打开 txt 文件。
由于您的代码包含太多错误,因此很难逐一解释。我已尝试修复错误并或多或少地保持您的算法完好无损。这是工作代码:
var directory = Folder.selectDialog("Seleziona una cartella");
if (!directory) exit();
// dialog window -------------------------------------------------------
var dialwindow = new Window("dialog", "Search");
var textbar = dialwindow.add('edittext');
textbar.preferredSize.width = 150;
textbar.active = true
var buttons = dialwindow.add("group", undefined);
buttons.orientation = "row";
var search = buttons.add("button", undefined, "Search");
var cancel = buttons.add("button", undefined, "Exit");
dialwindow.defaultElement = search;
dialwindow.cancelElement = cancel;
if (dialwindow.show() != 1) exit();
// main code -----------------------------------------------------------
var result = textbar.text;
var documents = directory.getFiles('*.indd');
for (var i = 0; i < documents.length; i++) {
var doc = app.open(documents[i]);
var links = doc.links;
var arr = [];
for (var j = 0; j < links.length; j++) {
var link_name = links[j].name.toLowerCase();
if (link_name.indexOf(result.toLowerCase()) > -1) {
arr.push(links[j]);
break;
}
}
if (arr.length > 0) {
alert("You can find the image " + result + " in this file " + doc.name.replace(/\.[^\.]+$/, ''));
}
doc.close(SaveOptions.NO);
}