[ID CC-CC2022] Нет ли возможности автозапуска скрипта при открытии файла?

  • Автор темы Автор темы hulk1776
  • Дата начала Дата начала

hulk1776

Топикстартер
15 лет на форуме
Сообщения
738
Реакции
21
При открытии файла надо выполнить скриптик. Тыкать в панель скриптов утомляет (будет утомлять, т.к. скриптик только что добавил). Нельзя ли его "зашить" в тело шаблона indt'a, что бы при открытии шаблона, оно бы само "проигралось"?
 
Нельзя ли его "зашить" в тело шаблона indt'a, что бы при открытии шаблона, оно бы само "проигралось"?
Как макросы в кореле или экселе - нельзя.
Решение вашей проблемы выглядит так:
Итак, то, что вы хотите, называется прослушивателем событий. (См. раздел "Working with event listeners" в руководстве по написанию сценариев InDesign .)

Сохраните файл .jsx в папке "startup scripts". (На Mac он находится в /Applications/Adobe InDesign CS6/Scripts/startup scripts/.)

#targetengine "session"

app.addEventListener('afterOpen', function(myEvent) {
// afterOpen fires twice: once when the document opens
// and once when the window loads. Choose one,
// ignore the other.
// See: Adobe Support Community
if (myEvent.target.constructor.name !== 'Document') {
return;
}

var myDoc = myEvent.target;
// Continue on with your code from here
}
 
  • Спасибо
Реакции: Gad
JavaScript:
app.addEventListener('afterOpen', function(theEvent) {
    if (theEvent.target.constructor.name !== 'Document') {
        return;
    }

    // Do what you want to do
    // And go where you're going to
    // Think for yourself
 
});
 
Спасибо за Listener (помню, как-то уже с ним бился года 2 назад).
Сейчас говорит, что объекта больше нет (надо будет покопаться).
1621495702029.png

Кроме того, стартаповский скрипт будет норовить выполниться при открытии любого документа. Значит придумывать идентификацию: тот ли это документ, где надо предлагать выполнить скрипт.
Вроде были где-то когда-то какие-то варианты с размещением скрипта в некотором скрытом поле документа или в Script Label'ах. Могло такое быть?
 
Сейчас говорит, что объекта больше нет
Раз говорит, значит выполняется, просто аккуратно записать все надо.
Значит придумывать идентификацию: тот ли это документ, где надо предлагать выполнить скрипт.
Разумеется
Вроде были где-то когда-то какие-то варианты с размещением скрипта в некотором скрытом поле документа или в Script Label'ах. Могло такое быть?
Вы, наверное, с акробатом путаете.
Конечно, можно придумать где в документе спрятать хоть плагин, хоть исполняемый модуль, но вызываться он при открытии документа без внешнего скрипта не будет иначе такой код называется "вирус" ;)
 
Как макросы в кореле или экселе - нельзя.
Решение вашей проблемы выглядит так:
Не разобрался как передать в var myDoc = myEvent.target; открываемый файл шаблона верстки. 2 часа разбирательств и тестирований закончились зацикливанием с открытием кучи копий). На данном этапе проще присвоить нужному скрипту быструю клаву. Вот если бы автовыполнение привязать к конкретному файлу, тогда было бы удобнее (а то надо на каждом открываемом/создаваемом файле делать проверку, нет ли в нем "приметы", что это тот файл, где и надо выполнять процедуры). Сложнова-то (((.
 
Раз говорит, значит выполняется, просто аккуратно записать все надо.

Разумеется

Вы, наверное, с акробатом путаете.
Конечно, можно придумать где в документе спрятать хоть плагин, хоть исполняемый модуль, но вызываться он при открытии документа без внешнего скрипта не будет иначе такой код называется "вирус" ;)
Вирус - да. С др. стороны, было бы логично открывать шаблон журнала и автопроставлять напр., даты, месяц, что-то еще. Или открывать шаблон персонального документа и тут просить указать ФИО. А то все это приходится запускать руками (а их [рук] не хватает))
 
Вирус - да. С др. стороны, было бы логично открывать шаблон журнала и автопроставлять напр., даты, месяц, что-то еще. Или открывать шаблон персонального документа и тут просить указать ФИО. А то все это приходится запускать руками (а их [рук] не хватает))
Не вижу идеологической проблемы, если открывать не скрипт из документа, а, наоборот, документ из скрипта ;)
 
Не совсем понял суть вашей проблемы
А что у вас было в myEvent.target?
Было так:
Код:
function myAfterNewHandler(myEvent){
    //var myDocument = myEvent.parent;
    ///alert("Работает!");
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.neverInteract; // чтобы не спрашивало о data-файле
var aD = myEvent.target;
//~ var aD = app.open(File("d:/Work/mDoc.indt"));
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll; // чтобы открть диалог
если aD поменять с target на open, то уже все зацикливается.
 
Не разобрался как передать в var myDoc = myEvent.target; открываемый файл шаблона верстки. 2 часа разбирательств и тестирований закончились зацикливанием с открытием кучи копий). На данном этапе проще присвоить нужному скрипту быструю клаву. Вот если бы автовыполнение привязать к конкретному файлу, тогда было бы удобнее (а то надо на каждом открываемом/создаваемом файле делать проверку, нет ли в нем "приметы", что это тот файл, где и надо выполнять процедуры). Сложнова-то (((.

Код:
function myScript(myDoc)
{

}

app.addEventListener('afterOpen', function(theEvent) {
    if (theEvent.target.constructor.name !== 'Document') {
        return;
    }

    myScript(theEvent.target);

});

ну вот так например. только документ это не файл, вообще говоря.
 
А куда проверку на конструктор убрали? По моей ссылке ж специально сказано, что на это надо обратить внимание
Это раз
А два - кто ж в обработчике события открытия файла вызывает его же? Разумеется рекурсия божественна!
 
  • Спасибо
Реакции: Skvoznyak
А куда проверку на конструктор убрали? По моей ссылке ж специально сказано, что на это надо обратить внимание
Это раз
А два - кто ж в обработчике события открытия файла вызывает его же? Разумеется рекурсия божественна!
Проверку на конструктор убрал, так как она же избыточна (всегда же открывается документ вроде как). По ссылке попал на общую коммюнити и там сразу не найти, где разъясняется про этот момент. Не могу задавить начальный диалог (предупреждение об устаревших связях)
Код:
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.neverInteract; // чтобы не спрашивало о data-файле
var myEventListener = app.eventListeners.add("afterOpen", myAfterNewHandler);
Куда эту строку не ставь, все равно предупреждает... наверное надо делать отдельного слушателя (before open) для подавления диалога. И потом дважды выскакивает диалог с выбором моих параметров. То есть пытается выполняться два раза.
 
Код:
function mySnippet(){
var myEventListener = app.eventListeners.add("beforeOpen", myAfterNewHandler);
}

function myAfterNewHandler(myEvent){
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.neverInteract;
}
Предупреждение о потерянных связях не подавляется.
 
Проверку на конструктор убрал, так как она же избыточна (всегда же открывается документ вроде как).
Экий вы упрямый однако
Во всех руководствах пишут, что надо, причем, специально заостряя на этом внимание
// afterOpen fires twice: once when the document opens
// and once when the window loads. Choose one,
// ignore the other.
// See: Adobe Support Community

if (myEvent.target.constructor.name !== 'Document') {
return;
}
а вы "убрал потому что избыточна" а потом жалуетесь на
1621509468204.png
 
  • Спасибо
Реакции: hulk1776
Предупреждение о потерянных связях не подавляется.
Вот этот момент я тоже не совсем понял - вы подавить предупреждение хотите на какое время? Пока ваш обработчик исполняется?????? 'fp' %8 А с чего вы решили что индизайн линки будет проверять именно на пустом участке кода внутри него? '))'
 
  • Спасибо
Реакции: Skvoznyak
Я может что-то не понимаю (или все))), но что значит "пустой участок кода"?
Код:
function myAfterOpenHandler(myEvent){
if (myEvent.target.constructor.name !== 'Document') {
return;
}  
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.neverInteract;
var aD = myEvent.target;
Вот он хендлер-обработчик. Внутри него прошу "не предупреждать" (до открытия документа). Все равно предупреждает.
Если писать ДО вызова обработчика:
Код:
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.neverInteract;
var myEventListener = app.eventListeners.add("afterOpen", myAfterOpenHandler);
все равно предупреждает. Где же надо дать инструкцию neverInteract?
Кстати, когда вернул проверку if (myEvent.target.constructor.name !== 'Document'), то запрос перестал дублироваться. Спасибо)
 
Последнее редактирование:
Вот он хендлер-обработчик. Внутри него прошу "не предупреждать" (до открытия документа). Все равно предупреждает.
Если писать ДО вызова обработчика:
Еще раз поподробнее повторяю:
Конструкция app.scriptPreferences.userInteractionLevel = UserInteractionLevels.neverInteract работает ровно на момент отработки вашего обработчика события "afterOpen"
Разумеется, на этот момент файл уже открыт и линки благополучно проверены, о чем вас индизайн и успел уведомить
Внутри самого обработчика никаких действий (кроме тех которые вы ему сами не назначите) индизайн не производит и устанавливать там эту заглушку бесполезно
 
Вот он хендлер-обработчик. Внутри него прошу "не предупреждать" (до открытия документа). Все равно предупреждает.
Если писать ДО вызова обработчика:

вы прикалываетесь что ли? у вас обработчик события "после открытия". открытие документа уже произошло.
 
  • Спасибо
Реакции: hulk1776