Сценарию приложений необходимо проверить разрешения и запросить открытие

#google-apps-script #google-sheets #oauth-2.0 #permissions

Вопрос:

Есть ли способ проверить разрешения OAuth с помощью простого триггера onOpen() в сценарии приложений?

Мое приложение создает электронные таблицы и делится ими с моими пользователями, и когда они открывают электронную таблицу, мне нужно иметь возможность проверить, разрешили ли они еще необходимые области. Простые триггеры не могут изначально запускать функции, для которых требуются авторизованные области. Но устанавливаемые триггеры могут. Я создал функцию, которая запрашивает у пользователя разрешения, а затем устанавливает необходимые триггеры с этими областями. У меня есть пользовательский пункт меню, который отлично запускает эту функцию, но простой триггер onOpen() не может запустить эту функцию, потому что он запрашивает разрешения областей OAuth. Многие из наших пользователей не поймут, что им нужно запустить эту функцию из меню, чтобы электронная таблица работала.

Моя первоначальная идея состояла в том, чтобы иметь скрытую ячейку где-нибудь в электронной таблице со значением true/false, которое начинается как «ложь». Когда пользователь открывает электронную таблицу, простой триггер onOpen() :

  • проверяет значение этой ячейки
  • если это ложь, то появится предупреждение пользовательского интерфейса для пользователя.

В предупреждении им предлагается использовать пользовательское меню, добавленное onOpen (), которое будет запускать функцию, которая будет:

  • запросите у пользователя разрешения
  • добавьте устанавливаемые триггеры onOpen и onEdit для этого пользователя, чтобы остальная часть моего приложения работала для этого пользователя, когда он взаимодействует с электронной таблицей.
  • измените значение скрытой ячейки на «true», чтобы простой триггер onOpen() не продолжал запрашивать пользователя.

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

Моя вторая идея состояла в том, чтобы вместо того, чтобы использовать эту скрытую ячейку в качестве значения true/false, сделать ее списком учетных записей gmail пользователя, которые предоставили разрешения (доступ через Session.getActiveUser().getEmail() ). Но для того, чтобы получить электронную почту текущего пользователя, мне нужна область OAuth! Таким образом, простой триггер onOpen() даже не может проверить, является ли текущий пользователь новым пользователем или нет…

Есть ли другой способ проверить, авторизовал ли активный пользователь области OAuth, необходимые для простого триггера onOpen ()?

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

Ответ №1:

Вы можете использовать ScriptApp.getAuthorizationInfo()

 if (ScriptApp.getAuthorizationInfo(ScriptApp.AuthMode.FULL).getAuthorizationStatus() == ScriptApp.AuthorizationStatus.NOT_REQUIRED) {
    // user has authorized the OAuth scopes
  }
 

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

1. Спасибо Горанку за этот метод, но он, похоже, работает только в пределах установленного триггера. Если он запускается установленным триггером, то он правильно указывает, предоставил ли активный пользователь авторизацию для требуемых областей. Однако, если он используется в простом триггере, таком как onOpen (), он всегда отображает статус авторизации по мере НЕОБХОДИМОСТИ, даже после того, как пользователь авторизовал все области.

2. это верно. Простой onOpen не может выполнять некоторые операции, вам необходимо использовать устанавливаемый onOpen