Проверьте, авторизовал ли пользователь скрипт, прежде чем пытаться выполнить что-либо, требующее авторизации. - PullRequest
0 голосов
/ 05 марта 2020

У меня есть Google Sheet, который имеет onOpen(e) Простой триггер . Очевидно, что все будет работать нормально, без необходимости авторизации, и покажет пользователю меню.

Когда пользователь щелкнет по пункту меню, он выполнит функцию, требующую авторизации, например, вызовет DriveApp....

В первый раз, когда пользователь щелкает пункт меню, он просит его авторизовать скрипт.

То, что я хотел бы сделать, это перед тем, как GAS попросит пользователя авторизоваться, если необходимо, проверить, нужно ли скрипту авторизоваться, и сделать что-то еще, что не требует авторизации (например, показывать предупреждение ).

Я знаю, что должен использовать getAuthorizationStatus(), но не могу понять, как.

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

function onOpen(e)
{
    var ui = SpreadsheetApp.getUi();
    ui.createMenu("Menu")
        .addItem("One", "one")
        .addItem("Two", "two")
        .addToUi();
}

function one()
{
    var a = ScriptApp.getAuthorizationInfo(ScriptApp.AuthMode.FULL);
    console.log(a.getAuthorizationStatus());
    console.log(a.getAuthorizationUrl());
    var d = DriveApp.getFolders();
}

function two()
{

}

Ответы [ 2 ]

2 голосов
/ 05 марта 2020

Если я правильно понимаю, вы пытаетесь запросить указанную c авторизацию только тогда, когда пользователь вызывает функцию (и), которая требует ее. К сожалению, Apps Script не работает так.

Некоторые функции, такие как onOpen() и onEdit(), могут выполняться без какой-либо авторизации, но вызов любой другой функции вызовет авторизацию , если авторизация требуется где-либо в скрипте . (Даже если код, требующий его, закомментирован.)

Таким образом, даже если вы будете следовать примеру, подобному приведенному в примере здесь , ваш скрипт все равно будет запрашивать авторизацию, когда выбрав пункт меню «Один». В приведенном ниже примере я проверяю авторизацию, но поскольку one() требует авторизации, мне не разрешается вызывать пользовательскую функцию authorizeScript() до после авторизации скрипта.

function onOpen(e) {
  var menu = SpreadsheetApp.getUi().createMenu("Menu");
  if (e && e.authMode == ScriptApp.AuthMode.LIMITED) { // Unauthorized
    menu.addItem("Authorize", "authorizeScript");
  } else { // Authorized
    menu.addItem("One", "one");;
  }
  menu.addToUi();
}

function authorizeScript() {
   console.log("authorizeScript");  // No auth required
}

function one() {
  var d = DriveApp.getFolders(); // Auth required
}

Обратите также внимание, что для проверки статуса авторизации я использую описанный объект события .

0 голосов
/ 05 марта 2020

Самый простой способ сделать это - создать другой проект без прав доступа:

Инструменты> Редактор скриптов> Новый> Проект:

function onOpen(e) {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Readme!')
    .addItem('Click here!', 'howTo')
    .addToUi();
}

function howTo() {
  SpreadsheetApp.getUi().alert(
    `You would need to authorize this script first!
Our privacy policy is simple.... No data is captured or logged or sent to servers.
Anything that happens happens in your sheet`
  );
}

Еще один Более сложный способ сделать это в одном проекте - ограничить области (пустым массивом) проектом, отредактировав файл манифеста. Но тогда у вас не будет встроенного потока аутентификации. Вам потребуется сложный поток oauth, основанный только на предупреждениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...