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

hulk1776

Топикстартер
12 лет на форуме
Сообщения
641
Реакции
19
При открытии файла надо выполнить скриптик. Тыкать в панель скриптов утомляет (будет утомлять, т.к. скриптик только что добавил). Нельзя ли его "зашить" в тело шаблона indt'a, что бы при открытии шаблона, оно бы само "проигралось"?
 

_MBK_

Пикирующий бомбардировщик
12 лет на форуме
Сообщения
30 207
Реакции
9 912
Нельзя ли его "зашить" в тело шаблона 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

Oleg Butrin

15 лет на форуме
Сообщения
1 883
Реакции
1 123
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
 
});
 

hulk1776

Топикстартер
12 лет на форуме
Сообщения
641
Реакции
19
Спасибо за Listener (помню, как-то уже с ним бился года 2 назад).
Сейчас говорит, что объекта больше нет (надо будет покопаться).
1621495702029.png

Кроме того, стартаповский скрипт будет норовить выполниться при открытии любого документа. Значит придумывать идентификацию: тот ли это документ, где надо предлагать выполнить скрипт.
Вроде были где-то когда-то какие-то варианты с размещением скрипта в некотором скрытом поле документа или в Script Label'ах. Могло такое быть?
 

_MBK_

Пикирующий бомбардировщик
12 лет на форуме
Сообщения
30 207
Реакции
9 912
Сейчас говорит, что объекта больше нет
Раз говорит, значит выполняется, просто аккуратно записать все надо.
Значит придумывать идентификацию: тот ли это документ, где надо предлагать выполнить скрипт.
Разумеется
Вроде были где-то когда-то какие-то варианты с размещением скрипта в некотором скрытом поле документа или в Script Label'ах. Могло такое быть?
Вы, наверное, с акробатом путаете.
Конечно, можно придумать где в документе спрятать хоть плагин, хоть исполняемый модуль, но вызываться он при открытии документа без внешнего скрипта не будет иначе такой код называется "вирус" ;)
 

hulk1776

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

hulk1776

Топикстартер
12 лет на форуме
Сообщения
641
Реакции
19
Раз говорит, значит выполняется, просто аккуратно записать все надо.

Разумеется

Вы, наверное, с акробатом путаете.
Конечно, можно придумать где в документе спрятать хоть плагин, хоть исполняемый модуль, но вызываться он при открытии документа без внешнего скрипта не будет иначе такой код называется "вирус" ;)
Вирус - да. С др. стороны, было бы логично открывать шаблон журнала и автопроставлять напр., даты, месяц, что-то еще. Или открывать шаблон персонального документа и тут просить указать ФИО. А то все это приходится запускать руками (а их [рук] не хватает))
 

_MBK_

Пикирующий бомбардировщик
12 лет на форуме
Сообщения
30 207
Реакции
9 912
Вирус - да. С др. стороны, было бы логично открывать шаблон журнала и автопроставлять напр., даты, месяц, что-то еще. Или открывать шаблон персонального документа и тут просить указать ФИО. А то все это приходится запускать руками (а их [рук] не хватает))
Не вижу идеологической проблемы, если открывать не скрипт из документа, а, наоборот, документ из скрипта ;)
 

hulk1776

Топикстартер
12 лет на форуме
Сообщения
641
Реакции
19
Не совсем понял суть вашей проблемы
А что у вас было в 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, то уже все зацикливается.
 

Skvoznyak

15 лет на форуме
Сообщения
5 020
Реакции
1 968
Не разобрался как передать в var myDoc = myEvent.target; открываемый файл шаблона верстки. 2 часа разбирательств и тестирований закончились зацикливанием с открытием кучи копий). На данном этапе проще присвоить нужному скрипту быструю клаву. Вот если бы автовыполнение привязать к конкретному файлу, тогда было бы удобнее (а то надо на каждом открываемом/создаваемом файле делать проверку, нет ли в нем "приметы", что это тот файл, где и надо выполнять процедуры). Сложнова-то (((.

Код:
function myScript(myDoc)
{

}

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

    myScript(theEvent.target);

});

ну вот так например. только документ это не файл, вообще говоря.
 

_MBK_

Пикирующий бомбардировщик
12 лет на форуме
Сообщения
30 207
Реакции
9 912
А куда проверку на конструктор убрали? По моей ссылке ж специально сказано, что на это надо обратить внимание
Это раз
А два - кто ж в обработчике события открытия файла вызывает его же? Разумеется рекурсия божественна!
 
  • Спасибо
Реакции: Skvoznyak

hulk1776

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

hulk1776

Топикстартер
12 лет на форуме
Сообщения
641
Реакции
19
Код:
function mySnippet(){
var myEventListener = app.eventListeners.add("beforeOpen", myAfterNewHandler);
}

function myAfterNewHandler(myEvent){
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.neverInteract;
}
Предупреждение о потерянных связях не подавляется.
 

_MBK_

Пикирующий бомбардировщик
12 лет на форуме
Сообщения
30 207
Реакции
9 912
Проверку на конструктор убрал, так как она же избыточна (всегда же открывается документ вроде как).
Экий вы упрямый однако
Во всех руководствах пишут, что надо, причем, специально заостряя на этом внимание
// 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

_MBK_

Пикирующий бомбардировщик
12 лет на форуме
Сообщения
30 207
Реакции
9 912
Предупреждение о потерянных связях не подавляется.
Вот этот момент я тоже не совсем понял - вы подавить предупреждение хотите на какое время? Пока ваш обработчик исполняется?????? 'fp' %8 А с чего вы решили что индизайн линки будет проверять именно на пустом участке кода внутри него? '))'
 
  • Спасибо
Реакции: Skvoznyak

hulk1776

Топикстартер
12 лет на форуме
Сообщения
641
Реакции
19
Я может что-то не понимаю (или все))), но что значит "пустой участок кода"?
Код:
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'), то запрос перестал дублироваться. Спасибо)
 
Последнее редактирование:

_MBK_

Пикирующий бомбардировщик
12 лет на форуме
Сообщения
30 207
Реакции
9 912
Вот он хендлер-обработчик. Внутри него прошу "не предупреждать" (до открытия документа). Все равно предупреждает.
Если писать ДО вызова обработчика:
Еще раз поподробнее повторяю:
Конструкция app.scriptPreferences.userInteractionLevel = UserInteractionLevels.neverInteract работает ровно на момент отработки вашего обработчика события "afterOpen"
Разумеется, на этот момент файл уже открыт и линки благополучно проверены, о чем вас индизайн и успел уведомить
Внутри самого обработчика никаких действий (кроме тех которые вы ему сами не назначите) индизайн не производит и устанавливать там эту заглушку бесполезно
 

Skvoznyak

15 лет на форуме
Сообщения
5 020
Реакции
1 968
Вот он хендлер-обработчик. Внутри него прошу "не предупреждать" (до открытия документа). Все равно предупреждает.
Если писать ДО вызова обработчика:

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