Как воспроизвести У вас нет доступа для выполнения этого действия в onOpen, которое создает только меню

Tl; Dr Мы с партнером опубликовали надстройку Google Sheets, которая «только случайным образом» бросает «У вас нет доступа для выполнения этого действия» при открытии электронной таблицы. Функция onOpen не требует авторизации для выполнения.

Есть ли способ воспроизвести / отладить эту ошибку?


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

файл Addon.gs

function onOpen(e) {
  SpreadsheetApp.getUi().createAddonMenu()
  .addItem('Menu item 1', 'doSomething1')
  .addItem('Menu item 2', 'doSomething2')
  .addToUi()
}

function doSomething1(){
  SpreadsheetApp.getUi().alert('Something 1');
}

function doSomething2(){
  SpreadsheetApp.getUi().alert('Something 2');
}

Вчера журналы Stackdriver показывают следующую ошибку

У вас нет доступа для выполнения этого действия. Попросите владельца этого объекта предоставить вам доступ. в onOpen (аддон: 109)

где строка 109 - .addToUi().

Такая же ошибка возникала и в предыдущих версиях нашего дополнения.

Функция onOpen не претерпела изменений в этих версиях (14, 18, 20).

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

Дополнительные сведения о надстройке, которую, как мне кажется, я не включил в "mcve"

Дополнение имеет

  • несколько файлов, как .gs, так и .html
  • используйте одну известную библиотеку (cUseful от Брюса Макферсона)
  • использовать расширенные сервисы (Admin Directory и Google Classroom)
  • appsscript.json настраивается, требуемые области oAuth соответствуют областям, установленным на странице согласия OAuth и странице настроек G Suite Marketplace.
  • имеет var операторы в Global Scope для назначения литералов (большинство из них присваивают имена листов и чисел переменным) и пространства имен, которые будут вызываться позже из кода на стороне клиента с боковой панели.

Я обнаружил, что у Stack Overflow есть несколько вопросов о сообщении об ошибке «У вас нет доступа для выполнения этого действия», но ни один из них не касается функции onOpen без операторов, требующих авторизации для выполнения.

Я не думаю, что этот вопрос связан с ошибкой в ​​нескольких учетных записях, поскольку она возникает, когда функция, требующая авторизации, вызывается из клиентского кода с использованием google.script.run, но в этом случае ошибка возникает, когда добавление электронной таблицы добавляет addToUi() метод, не требующий авторизации для выполнения.


Я сделал небольшой вариант предыдущего кода для регистрации открытого объекта события.

function onOpen(e) {
  console.info(e);
  SpreadsheetApp.getUi().createAddonMenu()
  .addItem('Menu item 1', 'doSomething1')
  .addItem('Menu item 2', 'doSomething2')
  .addToUi()
}

function doSomething1(){
  SpreadsheetApp.getUi().alert('Something 1');
}

function doSomething2(){
  SpreadsheetApp.getUi().alert('Something 2');
}

Затем я создал новую электронную таблицу, использовал ее для тестирования в качестве дополнения, установленного на включенное (AuthMode = LIMITED), затем я поделился таблицей с кем-либо, у кого есть ссылка на редактирование, и открыл электронную таблицу с помощью Chrome в режиме инкогнито, но меню не был показан, и на странице выполнения скрипта нет записи в журнале

Я заменил проект по умолчанию на проект Google Cloud Standard, чтобы иметь возможность использовать ведение журнала Stackdriver. Это то, что регистрируется, когда анонимный пользователь обращается к электронной таблице.

К сожалению, при чтении из хранилища произошла ошибка сервера. Код ошибки PERMISSION_DENIED.

Из-за указанной выше ошибки я создал ограниченный скрипт, который показывает некоторые «неопределенные» сообщения. Каждое из этих сообщений соответствует элементу на странице Executions скрипта с Type = Editor. Любопытно то, что я не запускал скрипт из редактора.

Если вы хотите помочь, автоматически регистрируя открытие события open

использовать этой ссылке в запуск как надстройка в включенном режиме

используйте эту другую ссылку для запуска как ограниченного сценария (другой проект сценария , тот же проект Google Cloud)


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

Связанный вопрос: JavaScript в приложениях Google не работает для анонимных пользователей?
Связанная проблема событие onOpen не запускается для анонимных пользователей в новых таблицах


Я сделал еще одну попытку,

  1. Я немного изменил код, включив в него чтение локали при открытии и использование этого значения для динамического меню.
function onOpen(e) {
  var locale = SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetLocale();
  var menu = SpreadsheetApp.getUi().createAddonMenu();
  if( locale !== 'en_US' ){
    menu.addItem( 'Change to en_US', 'changeToUS' )
  } else {
    menu.addItem( 'Change to es_ES', 'changeToES' )
  }
  menu.addToUi();
}

function changeToUS(){
  console.info( 'Changing to en_US' );
  SpreadsheetApp.getActiveSpreadsheet().setSpreadsheetLocale( 'en_US' );
  console.info( 'Changed to en_US' );
}

function changeToES(){
  console.info( 'Changing to es_ES' );
  SpreadsheetApp.getActiveSpreadsheet().setSpreadsheetLocale( 'es_ES' );
  console.info( 'Changed to es_ES' );
}
  1. Отключить новую среду выполнения скриптов приложений на базе Chrome V8

  1. Поделитесь таблицей с кем угодно, у кого есть ссылка
  2. Откройте электронную таблицу с другой учетной записью, в которую вошли несколько учетных записей. Эта учетная запись является учетной записью по умолчанию.

    На следующем экране показано, что есть анонимный пользователь, просматривающий электронную таблицу.

  1. Используя другую учетную запись, нажмите «Дополнения»> Имя проекта сценария> Изменить на en_US. Это показало неуловимое сообщение об ошибке на экране пользователя.

  1. Но ошибка не отображалась на странице выполнения скрипта.

  1. Поэтому я добавил проект Google Cloud Standard, обновил электронную таблицу, использовав другую учетную запись, но теперь вместо того, чтобы показывать ошибку, было показано предупреждение о том, что код небезопасен, я продолжаю авторизовать скрипт. Затем я снова нажимаю на меню, и на этот раз скрипт был выполнен.

  2. Затем я удалил авторизацию скрипта, открыл таблицу со второй учетной записью, без ошибок, но после обновления вкладки из-за изменения местоположения электронная таблица была открыта с учетной записью по умолчанию, а не с учетной записью, используемой для щелчка по меню.


Пока что кажется, что я должен выполнить «всю энчиладу» (опубликовать как дополнение), чтобы иметь возможность воспроизвести ошибку.


person Rubén    schedule 22.05.2020    source источник
comment
Позвольте нам продолжить это обсуждение в чате.   -  person Rubén    schedule 23.05.2020


Ответы (1)


Я прочитал беседу и немного исследовал, и думаю, вам следует связаться с G Suite Support по вопросу авторизации надстройки. Однако проблема Anonymous users are not able the run triggers - это предполагаемое поведение. Это был более свежий запрос функции с просьбой реализовать это.

person Community    schedule 25.05.2020
comment
Фактически они могут запускать триггеры в ES5. Но они не могут добавлять пункты меню или использовать пользовательский интерфейс для чего-либо. - person TheMaster; 25.05.2020
comment
Спасибо, Джескаллас. Служба поддержки G Suite не отвечает на вопросы о скрипте Google Apps, которые я уже задавал им в прошлом по другим вопросам, связанным с аккаунтами Google Apps Script и G Suite. - person Rubén; 25.05.2020