Почему возникает ошибка: Exception: You do not have permission to call SpreadsheetApp.openById?

Это возможно слишком "чайный" вопрос: Есть код:

function AAA1() {
  var s =2,
      s2 =4,
      s3 =5;
 var spreadsheet_id = SpreadsheetApp.getActive().getId();
 var sheet_name = "Лист1";

 return(s+s2+s3);
}

Он рабочий. Результат при вызове функции корректный. Я добавляю еще одну переменную:

var s4 = SpreadsheetApp.openById( spreadsheet_id ).getSheetByName( sheet_name ).getRange(1,1).getValues(); // это строка №7

В Logger.log(s4); результат отображается правильно. Но сам вызов процедуры дает ошибку: Ошибка: Exception: You do not have permission to call SpreadsheetApp.openById. Required permissions: https://www.googleapis.com/auth/spreadsheets (строка 7)


Вопрос: введение в код новой переменной может давать ошибку? Или ошибка в другом?


Ответы (1 шт):

Автор решения: contributorpw

Если коротко, то так сделать нельзя.

Скорее всего проблема в том, что функция вызывается как пользовательская функция.

В сущности, вопрос стоит внимания, потому что он является общим случаем недопонимания процесса.

И так, куда смотреть и что делать.

Способ запуска. От способа запуска зависит многое, т.к. один и тот же код может выполняться по-разному. Называется "смена контекста".

  • Как пользовательская формула (специальный ограниченный контекст)
  • При вызове из редактора (основной контекст)
  • При вызове из UI контейнера (расширенный основной контекст)
  • При вызове из триггера
  • При вызове из неустановленного дополнения
  • При вызове из неразрешенного дополнения
  • При вызове из опубликованного веб-приложения
  • При вызове опубликованного API
  • И еще много чего можно сменить настройками для одного и того же куска (простите) кода.

Распространенной ошибкой является предполагать, что код в редакторе какой-то не такой. На самом деле это уже полноценное приложение. Многие, кто активно использует скрипты, "не парятся" на тему "откуда это запустить", они просто выбирают в редакторе функцию и жмут кнопку запуска.

Вернемся к баранам. При запуске пользовательской формулы контекст кода строго ограничен. Вы не можете вызывать многие методы SpreadsheetApp, например, openById(). См. Custom Functions - Advanced - Using Apps Script services

Интересно, что это не означает, что так делать нельзя. Например, хак описан тут snippets/spreadsheet-get_error_value_formulas. Но это прям надо хорошо вкурить, чтоб оно взлетело.

→ Ссылка