Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Как запустить скрипт одной таблицы при редактир. другой? - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин  
Как запустить скрипт одной таблицы при редактир. другой?
dimaoaoao Дата: Суббота, 15.07.2023, 09:55 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 3
Репутация: 0 ±
Замечаний: 0% ±

2007
Я хочу чтобы триггер срабатывал при изменении таблицы, а не редактировании её. Поставил триггер, чтобы он срабатывал "при изменении" (а не "при редактировании"). Но он всё равно срабатывает только при редактировании.

Есть 2 таблицы: Таблица1 и Таблица2.
В Таблице1 при внесении значения в ячейку А1 срабатывает скрипт который берёт это значение и вставляет в ячейку А1 Таблицы2 (установлен триггер "при редактировании", соответственно внося данные в А1, они сразу попадают в Таблицу2 - здесь проблем нет)
В Таблице2 прописан скрипт который вводит в ячейку А10 настоящие дату и время. Установлен триггер "при изменении". Соответственно, я хочу, чтобы каждый раз изменяя в Таблице1 значение А1, оно менялось в А1 Таблицы2, и соответственно, в А10 Таблицы 2 сразу обновлялось время. Значение А1 в Таблице2 меняется, но в А10 значение поменяется только если что-то отредактировать в самой Таблице2.

Скажите, возможно ли что-то придумать? Это мне необходимо, чтобы спрятать код в аппс скрипте Таблицы2. То есть Таблица1 - это для всех, с доступом к редактированию. Пользователи вносят информацию и она меняется в Таблице2 и там же срабатывают свои скрипты, которые не видны в Таблице1 и далее передаются снова в Таблицу1. Возможно ли решить эту задачу через триггеры или может быть есть более простое решение?
Спасибо большое, и заранее благодарю за любую помощь и комментарии)

Таблица1
https://docs.google.com/spreads....t#gid=0
Таблица2
https://docs.google.com/spreads....t#gid=0


Сообщение отредактировал dimaoaoao - Суббота, 15.07.2023, 10:56
 
Ответить
СообщениеЯ хочу чтобы триггер срабатывал при изменении таблицы, а не редактировании её. Поставил триггер, чтобы он срабатывал "при изменении" (а не "при редактировании"). Но он всё равно срабатывает только при редактировании.

Есть 2 таблицы: Таблица1 и Таблица2.
В Таблице1 при внесении значения в ячейку А1 срабатывает скрипт который берёт это значение и вставляет в ячейку А1 Таблицы2 (установлен триггер "при редактировании", соответственно внося данные в А1, они сразу попадают в Таблицу2 - здесь проблем нет)
В Таблице2 прописан скрипт который вводит в ячейку А10 настоящие дату и время. Установлен триггер "при изменении". Соответственно, я хочу, чтобы каждый раз изменяя в Таблице1 значение А1, оно менялось в А1 Таблицы2, и соответственно, в А10 Таблицы 2 сразу обновлялось время. Значение А1 в Таблице2 меняется, но в А10 значение поменяется только если что-то отредактировать в самой Таблице2.

Скажите, возможно ли что-то придумать? Это мне необходимо, чтобы спрятать код в аппс скрипте Таблицы2. То есть Таблица1 - это для всех, с доступом к редактированию. Пользователи вносят информацию и она меняется в Таблице2 и там же срабатывают свои скрипты, которые не видны в Таблице1 и далее передаются снова в Таблицу1. Возможно ли решить эту задачу через триггеры или может быть есть более простое решение?
Спасибо большое, и заранее благодарю за любую помощь и комментарии)

Таблица1
https://docs.google.com/spreads....t#gid=0
Таблица2
https://docs.google.com/spreads....t#gid=0

Автор - dimaoaoao
Дата добавления - 15.07.2023 в 09:55
Gustav Дата: Воскресенье, 16.07.2023, 21:01 | Сообщение № 2
Группа: Админы
Ранг: Участник клуба
Сообщений: 2808
Репутация: 1184 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Установлен триггер "при изменении".

Триггер с типом "при изменении", конечно, наверное, неплохо, что реагирует на вносимые пользователем изменения (т.е. ведет себя еще и как триггер "при реадктировании"), но исторически он был запланирован как триггер, реагирующий на изменения СТРУКТУРЫ самой таблицы, т.е. срабатывал, например, на добавление строки или удаление столбца.

Никакой триггер не реагирует на автоматические (неручные) изменения значений в ячейках таблицы (например, в результате пересчёта формул). Пока , во всяком случае, подобного триггера в Таблицах Google нет, так что не стройте иллюзии на этот счёт.

Можно предложить грубую эмуляцию такого триггера через триггер по времени. Пишите функцию, которая запускается, скажем, раз в минуту и проверяет содержимое контрольных ячеек - и если они изменились, то что-то, Вами запланированное, выполняется. Но тут надо иметь в виду, что суммарное триггерное время, отводимое на пользовательский аккаунт в сутки, составляет всего 90 минут (за превышение - штраф типа отключения на следующие сутки). Так что если анализ или реакция будут ощутимы по времени, то нужно будет урежать частоту запусков (раз в 5-10 минут или еще реже), либо конструировать какой-то иной способ реагирования (например, кнопкой пользователя или через пункт меню).

(...чуть позже напишу как запустить скрипт из другой таблицы...)


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
Установлен триггер "при изменении".

Триггер с типом "при изменении", конечно, наверное, неплохо, что реагирует на вносимые пользователем изменения (т.е. ведет себя еще и как триггер "при реадктировании"), но исторически он был запланирован как триггер, реагирующий на изменения СТРУКТУРЫ самой таблицы, т.е. срабатывал, например, на добавление строки или удаление столбца.

Никакой триггер не реагирует на автоматические (неручные) изменения значений в ячейках таблицы (например, в результате пересчёта формул). Пока , во всяком случае, подобного триггера в Таблицах Google нет, так что не стройте иллюзии на этот счёт.

Можно предложить грубую эмуляцию такого триггера через триггер по времени. Пишите функцию, которая запускается, скажем, раз в минуту и проверяет содержимое контрольных ячеек - и если они изменились, то что-то, Вами запланированное, выполняется. Но тут надо иметь в виду, что суммарное триггерное время, отводимое на пользовательский аккаунт в сутки, составляет всего 90 минут (за превышение - штраф типа отключения на следующие сутки). Так что если анализ или реакция будут ощутимы по времени, то нужно будет урежать частоту запусков (раз в 5-10 минут или еще реже), либо конструировать какой-то иной способ реагирования (например, кнопкой пользователя или через пункт меню).

(...чуть позже напишу как запустить скрипт из другой таблицы...)

Автор - Gustav
Дата добавления - 16.07.2023 в 21:01
Gustav Дата: Воскресенье, 16.07.2023, 21:27 | Сообщение № 3
Группа: Админы
Ранг: Участник клуба
Сообщений: 2808
Репутация: 1184 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
спрятать код в аппс скрипте Таблицы2. То есть Таблица1 - это для всех, с доступом к редактированию. Пользователи вносят информацию и она меняется в Таблице2 и там же срабатывают свои скрипты, которые не видны в Таблице1

Итак, как запустить в Таблице 1 скрипт из Таблицы 2? Очень просто, нужно подключить скрипты Таблицы 2 как внешнюю библиотеку для скриптов Таблицы 1. Для этого:
1. Находясь в редакторе скриптов в Таблице 2, идёте в "Настройки проекта" (самая последняя "шестеренка" слева).
2. В "Настройках" находите поле "Идентификатор скрипта" и жмете на ее кнопку ОК справа от значка копирования - для копирования идентификатора.
3. Переходите в Таблицу 1, в ее редактор скриптов и жмёте на "+" справа от слова "Библиотеки".
4. В открывшемся диалоге "Добавление библиотеки" делаете вставку в поле "Идентификатор скрипта" и нажимаете на кнопку "Найти".
5. После нахождения библиотеки и появления двух новых полей ниже, заполняете поле "Идентификатор" придуманным именем библиотеки, например, "codeOfTable2" и жмете кнопку "Добавить".

Далее в своем коде вставляете этот идентификатор codeOfTable2 и набираете точку для отображения списка функций из библиотеки, т.е. из Таблицы 2. Итого вызов функции dd из Таблицы 2 в коде Таблицы 1 будет выглядеть так:
[vba]
Код
сodeOfTable2.dd();
[/vba]


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
спрятать код в аппс скрипте Таблицы2. То есть Таблица1 - это для всех, с доступом к редактированию. Пользователи вносят информацию и она меняется в Таблице2 и там же срабатывают свои скрипты, которые не видны в Таблице1

Итак, как запустить в Таблице 1 скрипт из Таблицы 2? Очень просто, нужно подключить скрипты Таблицы 2 как внешнюю библиотеку для скриптов Таблицы 1. Для этого:
1. Находясь в редакторе скриптов в Таблице 2, идёте в "Настройки проекта" (самая последняя "шестеренка" слева).
2. В "Настройках" находите поле "Идентификатор скрипта" и жмете на ее кнопку ОК справа от значка копирования - для копирования идентификатора.
3. Переходите в Таблицу 1, в ее редактор скриптов и жмёте на "+" справа от слова "Библиотеки".
4. В открывшемся диалоге "Добавление библиотеки" делаете вставку в поле "Идентификатор скрипта" и нажимаете на кнопку "Найти".
5. После нахождения библиотеки и появления двух новых полей ниже, заполняете поле "Идентификатор" придуманным именем библиотеки, например, "codeOfTable2" и жмете кнопку "Добавить".

Далее в своем коде вставляете этот идентификатор codeOfTable2 и набираете точку для отображения списка функций из библиотеки, т.е. из Таблицы 2. Итого вызов функции dd из Таблицы 2 в коде Таблицы 1 будет выглядеть так:
[vba]
Код
сodeOfTable2.dd();
[/vba]

Автор - Gustav
Дата добавления - 16.07.2023 в 21:27
dimaoaoao Дата: Вторник, 25.07.2023, 23:12 | Сообщение № 4
Группа: Пользователи
Ранг: Прохожий
Сообщений: 3
Репутация: 0 ±
Замечаний: 0% ±

2007
Gustav, спасибо за такой подробный ответ!

Триггер с типом "при изменении", конечно, наверное, неплохо, что реагирует на вносимые пользователем изменения (т.е. ведет себя еще и как триггер "при реадктировании"), но исторически он был запланирован как триггер, реагирующий на изменения СТРУКТУРЫ самой таблицы, т.е. срабатывал, например, на добавление строки или удаление столбца.


дописал скрипт, который помимо переноса слова в другую таблицу вставляет дополнительную строчку в другую таблицу (изменяет структуру), но снова ничего не вышло и данное изменение триггер не заметил.

Никакой триггер не реагирует на автоматические (неручные) изменения значений в ячейках таблицы


да, именно так(

Итак, как запустить в Таблице 1 скрипт из Таблицы 2? Очень просто, нужно подключить скрипты Таблицы 2 как внешнюю библиотеку для скриптов Таблицы 1. Для этого:


Спасибо, всё получилось! Интересный способ. Если предоставить доступ другому человеку к таблице с таким кодом, он сможет скопировать вместе со скриптом и приложенной библиотекой. Он также сможет запускать скрипт таблицы2 из своей копии, но как я понимаю, никак не сможет увидеть этот скрипт (или как-то можно?)
...
Нашёл ещё один интересный способ решения этой проблемы, в случае, если задача состоит только в том, чтобы пользователь, которому дали доступ к редактированию таблицы, не мог видеть код скрипта. В этом случае таблицу2 создавать не обязательно. Можно создать скрипт отдельно от таблицы, подробности для интересующихся здесь - https://www.youtube.com/watch?v=BK9sWR0I6Ys (скрипт в контейнере). Можно в этом же скрипте (который никак не виден в таблице) прописать триггер onEdit и его реакцию на редактирование Вашей таблицы:

[vba]
Код
function createSpreadsheetEditTrigger() {
var ss = SpreadsheetApp.openById('ID Вашей таблицы');
ScriptApp.newTrigger('название функции')
.forSpreadsheet(ss)
.onEdit()
.create();
[/vba]


Сообщение отредактировал Serge_007 - Среда, 26.07.2023, 08:56
 
Ответить
СообщениеGustav, спасибо за такой подробный ответ!

Триггер с типом "при изменении", конечно, наверное, неплохо, что реагирует на вносимые пользователем изменения (т.е. ведет себя еще и как триггер "при реадктировании"), но исторически он был запланирован как триггер, реагирующий на изменения СТРУКТУРЫ самой таблицы, т.е. срабатывал, например, на добавление строки или удаление столбца.


дописал скрипт, который помимо переноса слова в другую таблицу вставляет дополнительную строчку в другую таблицу (изменяет структуру), но снова ничего не вышло и данное изменение триггер не заметил.

Никакой триггер не реагирует на автоматические (неручные) изменения значений в ячейках таблицы


да, именно так(

Итак, как запустить в Таблице 1 скрипт из Таблицы 2? Очень просто, нужно подключить скрипты Таблицы 2 как внешнюю библиотеку для скриптов Таблицы 1. Для этого:


Спасибо, всё получилось! Интересный способ. Если предоставить доступ другому человеку к таблице с таким кодом, он сможет скопировать вместе со скриптом и приложенной библиотекой. Он также сможет запускать скрипт таблицы2 из своей копии, но как я понимаю, никак не сможет увидеть этот скрипт (или как-то можно?)
...
Нашёл ещё один интересный способ решения этой проблемы, в случае, если задача состоит только в том, чтобы пользователь, которому дали доступ к редактированию таблицы, не мог видеть код скрипта. В этом случае таблицу2 создавать не обязательно. Можно создать скрипт отдельно от таблицы, подробности для интересующихся здесь - https://www.youtube.com/watch?v=BK9sWR0I6Ys (скрипт в контейнере). Можно в этом же скрипте (который никак не виден в таблице) прописать триггер onEdit и его реакцию на редактирование Вашей таблицы:

[vba]
Код
function createSpreadsheetEditTrigger() {
var ss = SpreadsheetApp.openById('ID Вашей таблицы');
ScriptApp.newTrigger('название функции')
.forSpreadsheet(ss)
.onEdit()
.create();
[/vba]

Автор - dimaoaoao
Дата добавления - 25.07.2023 в 23:12
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!