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);
}