GAS — «У вас нет разрешения на вызов SpreadsheetApp.openById»

#google-apps-script

#google-apps-script

Вопрос:

Один из моих скриптов использует SpreadsheetApp.openById(ID) для получения данных из электронной таблицы. Скрипту были предоставлены разрешения на открытие файла, и пользователь скрипта имеет доступ на запись в файл. Однако иногда скрипт возвращает следующую ошибку :

 You do not have permission to call SpreadsheetApp.openById. Required permissions: https://www.googleapis.com/auth/spreadsheets at [unknown function](Code:11)
  

В других случаях проблем нет, и скрипт работает отлично. Есть идеи / помощь о том, как это исправить?

Пример скрипта :

 var spreadsheet = SpreadsheetApp.openById("1m65QVfk9Xx2zOwUxewdSjWCDK-g_jHj7ETFVFF0rjxY")

function myFunc() {
  sheet = spreadsheet.getActiveSheet()
  prepareHours()
  inputDisplays()
}
  

Ответ №1:

Вы не можете «дать скрипту разрешение на открытие файла», потому что скрипт не является автономным: пользователь выполняет скрипт. Если пользователь, вызывающий выполнение скрипта, делает это способом, который не предоставляет авторизации — например, выполнение простого триггера, такого как функция с именем onOpen или onEdit , — тогда любые вызовы, требующие авторизации, завершатся ошибкой на основе разрешений, подобной той, которой вы делитесь.

Поскольку глобальные переменные вычисляются для каждого экземпляра Apps Script, всегда рекомендуется избегать вызова API / сервисных вызовов в глобальной области. Кроме того, поскольку простые триггеры выполняются для любого пользователя, имеющего разрешение на редактирование документа, рекомендуется избегать использования методов, требующих пользовательских разрешений, в ситуациях с ограниченными AuthMode правами.

  • Простые ограничения запуска
  • Выполняющий пользователь
  • Доступные службы

    Предупреждение: При запуске вашей onOpen(e) функции загружается весь скрипт и выполняются любые глобальные инструкции. Эти инструкции выполняются в том же режиме авторизации, что и onOpen(e) , и завершаются ошибкой, если режим запрещает их. Это предотвращает onOpen(e) запуск. Если в вашем опубликованном дополнении не удается добавить свои пункты меню, загляните в консоль JavaScript браузера, чтобы узнать, была ли выдана ошибка, затем изучите свой скрипт, чтобы узнать, вызывает ли onOpen(e) функция или глобальные переменные службы, которые не разрешены в AuthMode.NONE .

  • AuthMode

Комментарии:

1. Что я имел в виду, предоставляя скрипту разрешение на открытие файла, так это предоставление пользователю , который будет выполнять скрипт, разрешения на открытие / редактирование указанного файла. Спасибо за совет по глобалям, однако я попытаюсь обрезать их вызов и проверить еще раз.

2. Это скрипт on edit или on open? В примере скрипта, которым вы поделились, нет завершающих точек с запятой, поэтому я предполагаю, что это был просто псевдокод

3. @J.G. точки с запятой необязательны из-за ASI JavaScript. Тем не менее, они настоятельно рекомендуются.