Я пытаюсь сделать скрипт на JavaScript, но у меня нет большого опыта в этой области, поэтому я здесь, чтобы обратиться за помощью.
По сути, там, где я работаю, у меня есть тонна файлов.indd с множеством разных изображений с разными именами и номерами каждый день. Когда кто-то хочет знать, в каком документе находится определенное изображение, мне нужно вручную искать каждое изображение.
Я пытаюсь собрать рабочий скрипт, но безуспешно. Я ищу сценарий, который позволит вам выбрать папку, ввести имя (или часть имени) имени файла для поиска, выполнить поиск по всем документам в папке, не открывая все файлы одновременно. (из соображений производительности, так как файлов много) и выдает предупреждение, если файл с таким именем найден.
Я объединил различные скрипты, найденные на разных сайтах, но по неизвестной причине это не работает.
Код следующий
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);
}
}
Таким образом, этот сценарий должен позволить вам выбрать папку, создать диалоговое окно с текстовой панелью, выполнить поиск по документам в папке, если изображение с таким именем будет найдено, вызвать предупреждение, в противном случае закрыть документ.
Я благодарю всех, кто может объяснить, что не так, или может предложить улучшения/исправления. Если что-то непонятно из-за моего плохого английского, спрашивайте, я постараюсь быть более понятным.
РЕДАКТИРОВАТЬ
Спасибо, Юрий, за быстрый ответ, я узнал несколько новых вещей из вашего кода (например, части "while() {}" и ".shift", о которых я не знал). К сожалению, там, где я работаю, не очень практично прокручивать весь текстовый файл, чтобы найти то, что я искал (поскольку файлов indd очень много), даже если ваш скрипт спасает меня от потери большого количества времени. Прошу прощения, но я, вероятно, не очень ясно выразился, поскольку моей целью было понять, что не так с исходным кодом, чтобы я мог учиться вместо того, чтобы иметь готовый код. Части, которые я не понимаю, это:
for (var i = 0; i < Documents.length; i++) {
app.open(Documents[i]);
Это открывает все документы один за другим, что по сути правильно, но я не могу использовать app.activeDocument.links; потому что нет активного документа. Есть ли способ использовать переменную вместо app.activeDocument.links с кодом выше? Я пытался использовать "пока (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() {}? Я пробовал выход(); но это не работает.
РЕДАКТИРОВАТЬ2
Спасибо Юрию, это окончательный код:
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();
var find = [];
while (links.length) {
if (links.length == 0) { alert("No links are present in document\r''" + Ciclo.name.replace(/\.[^\.]+$/, '') + "''");}
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 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);
}
Комментариев нет:
Отправить комментарий