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

hulk1776

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

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 137
Реакции
10 835
Нельзя ли его "зашить" в тело шаблона 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

20 лет на форуме
Сообщения
1 989
Реакции
1 213
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

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

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

_MBK_

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

hulk1776

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

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 137
Реакции
10 835

hulk1776

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

Разумеется

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

_MBK_

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

hulk1776

Топикстартер
15 лет на форуме
Сообщения
725
Реакции
21
Не совсем понял суть вашей проблемы
А что у вас было в 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 500
Реакции
2 168
Не разобрался как передать в var myDoc = myEvent.target; открываемый файл шаблона верстки. 2 часа разбирательств и тестирований закончились зацикливанием с открытием кучи копий). На данном этапе проще присвоить нужному скрипту быструю клаву. Вот если бы автовыполнение привязать к конкретному файлу, тогда было бы удобнее (а то надо на каждом открываемом/создаваемом файле делать проверку, нет ли в нем "приметы", что это тот файл, где и надо выполнять процедуры). Сложнова-то (((.

Код:
function myScript(myDoc)
{

}

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

    myScript(theEvent.target);

});

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

_MBK_

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

hulk1776

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

hulk1776

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

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

_MBK_

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

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

hulk1776

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

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

Skvoznyak

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

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