Передача Google-таблицы другому владельцу не всегда переносит полномочия автоматизации. Скрипт, привязанный проект, устанавливаемые триггеры, OAuth-разрешения и развертывание web app могут принадлежать разным учетным записям.

Нужно составить карту владельцев: файл Sheets, проект Apps Script или Cloud Project, триггеры, подключенные ресурсы и развертывания. Затем восстановить разрешения и пересоздать только те объекты, которые действительно исполняются от прежнего владельца.

Что проверить в первую очередь

Сначала зафиксируйте наблюдаемое поведение и не меняйте сразу несколько настроек. Важны точное время сбоя, адрес или сценарий, ожидаемый результат и последнее известное рабочее состояние. Так можно отличить причину от случайного совпадения и сохранить возможность быстрого отката.

  • Уточните, скрипт привязан к таблице или является отдельным проектом.
  • Проверьте владельца файла, проекта, shared drive и связанного Google Cloud Project.
  • Откройте раздел триггеров под старой и новой учетной записью.
  • Определите, от чьего имени выполняется web app и какие OAuth scopes использует.

Почему возникает проблема

У подобных сбоев редко бывает одна универсальная причина. На итог одновременно влияют конфигурация приложения, окружение, данные, кеш, права и внешние сервисы. Проверка должна идти от внешнего симптома к конкретному уровню, на котором впервые появляется неверное состояние.

  • Installable trigger создан прежним владельцем и выполняется с его разрешениями.
  • Новый владелец файла не выдал OAuth-согласие скрипту на нужные scopes.
  • Скрипт открывает другой файл по ID, к которому новая учетная запись не имеет доступа.
  • Web app развернут старым аккаунтом и продолжает исполняться от его имени.
  • Файл перенесен в shared drive, где правила владения и доступа отличаются.

Пошаговая диагностика

Диагностику проводите на копии или в контролируемое время. Перед изменениями сохраните конфигурацию, данные и журналы. Каждый шаг должен отвечать на один вопрос и оставлять измеримый результат: код ответа, запись в логе, состояние процесса, значение поля или воспроизводимый тест.

  • Запустите проблемную функцию вручную под новой учетной записью и зафиксируйте точную ошибку.
  • Проверьте Executions: функцию, инициатора, тип запуска и stack trace.
  • Выведите IDs используемых файлов и проверьте доступ к каждому без публикации содержимого.
  • Сравните список триггеров и развертываний у обеих учетных записей.
  • Проверьте манифест appsscript.json, scopes и привязанный Cloud Project.

Что не переносится вместе с таблицей автоматически

Доступ редактора к таблице не равен праву выполнять все действия скрипта. Некоторые сущности персональны для создателя.

  • Устанавливаемые триггеры принадлежат пользователю, который их создал, и обычно требуют пересоздания.
  • OAuth grants выдаются каждой учетной записи отдельно и могут быть ограничены администратором Workspace.
  • Развертывание web app имеет собственные параметры execute as и who has access.
  • Связанный Cloud Project, секреты и API могут остаться под управлением старой организации.
  • Доступ к внешним таблицам, папкам и почте нужно проверять отдельно.

Как исправить проблему

Исправление лучше разбить на небольшие обратимые изменения. После каждого шага повторяйте исходный сценарий и проверяйте соседние функции. Если правка касается данных, сначала выполните ее на ограниченной выборке и сохраните журнал затронутых записей.

  • Авторизуйте проект под новой учетной записью с минимально нужными scopes.
  • Удалите устаревшие триггеры после проверки и создайте новые от нужного технического владельца.
  • Передайте или переопубликуйте web app с согласованным режимом исполнения.
  • Выдайте доступ к зависимым файлам и папкам через группы или shared drive.
  • Для критичной автоматизации используйте управляемую техническую учетную запись и документированную передачу.

Безопасный порядок внедрения

  • Сохраните резервную копию затрагиваемых файлов, базы и конфигурации, а также заранее опишите способ отката.
  • Воспроизведите сбой на тестовой записи, учетной записи или отдельном окружении без реальных платежей и рассылок.
  • Вносите по одному логическому изменению, фиксируя его в системе контроля версий или журнале работ.
  • Не отключайте права, проверку входных данных и защитные механизмы только ради исчезновения сообщения об ошибке.
  • После выкладки контролируйте логи, метрики и ключевой пользовательский сценарий, а не только открытие одной страницы.

Как проверить результат

Успешный разовый тест еще не доказывает исправление. Нужны повторный запуск, крайние случаи и проверка после очистки кеша, перезапуска процесса или новой сессии. Для критичных сценариев полезно сохранить автоматический тест или хотя бы короткий регрессионный чек-лист.

  • Ручной запуск и каждый тип триггера завершаются успешно под ожидаемым исполнителем.
  • Executions не показывают permission denied и обращения к недоступным файлам.
  • Web app работает для разрешенных пользователей после нового развертывания.
  • Отключение старой учетной записи не останавливает автоматизацию.

Типичные ошибки при исправлении

  • Передавать пароль от личного Google-аккаунта вместо передачи ресурсов и ролей.
  • Создавать дубли триггеров и получать двойные письма или записи.
  • Запрашивать полный Drive scope, когда достаточно доступа к отдельным файлам.
  • Удалять старое развертывание до проверки нового URL и клиентов.

Как предотвратить повторение

Профилактика строится вокруг наблюдаемости и воспроизводимости: понятных конфигураций, контролируемых релизов, журналов без секретов и тестов на реальные сценарии. Важно не просто убрать текущий симптом, а сделать следующий похожий сбой заметным раньше пользователя.

  • Ведите реестр файлов, проектов, триггеров, владельцев и внешних зависимостей.
  • Используйте группы и shared drive там, где это поддерживается политикой Workspace.
  • Документируйте OAuth scopes и процедуру смены технического владельца.
  • Добавьте уведомление о сбоях Executions и регулярную проверку триггеров.

Что подготовить для разбора

  • Краткое описание ожидаемого и фактического поведения без паролей, токенов и персональных данных.
  • Точное время и последовательность действий, после которых появляется проблема.
  • Версии приложения, окружения и зависимостей, а также перечень последних изменений.
  • Фрагменты журналов с контекстом до и после ошибки; секреты в них необходимо скрыть.
  • Описание уже выполненных проверок и способ безопасно повторить проблему.

Частые вопросы

Почему простой onEdit работает, а триггер по времени нет?

Простой триггер запускается в другом контексте, а устанавливаемый принадлежит создателю и использует его разрешения. Их нужно проверять отдельно.

Можно ли просто скопировать таблицу?

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

Когда нужна помощь специалиста

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