Какие области подходят для выполнения запроса в API скрипта приложений Google Apps?

Я использую API скрипта приложений для запуска функции с учетными данными учетной записи службы. Я добавил все области, необходимые в API ресурсов Rest https://developers.google.com/apps-script/api/reference/rest/v1/scripts/run.

Но когда я запустил этот скрипт ниже, он не удался.

function run(){

 var CREDENTIALS = {
  "private_key": "Your Private key",
  "client_email": "Your Client email",
  "client_id": "Your Client ID",
  "user_email": "Your Email address",
  "api_key": "Your API key"
 };
 var service = getService(CREDENTIALS.client_email,CREDENTIALS.private_key);
  service.reset();
  if (service.hasAccess()) {
    var url = 'https://script.googleapis.com/v1/projects/[SCRIPT ID]:run';
    var body = {
      "function": [FUNCTION NAME]
    };
    var params = {
      headers: {
        Authorization: 'Bearer ' + service.getAccessToken()
      },
      method: 'post',
      playload : JSON.stringify(body),
      contentType: 'application/json',
      muteHttpExceptions: true
    };
    var response = UrlFetchApp.fetch(url, params);
    Logger.log(response);
  }
  else {
    Logger.log(service.getLastError());
  }
}

function getService(email, privateKey) {
  return OAuth2.createService('Service Account')
      // Set the endpoint URL.
      .setTokenUrl('https://oauth2.googleapis.com/token')

      // Set the private key and issuer.
      .setPrivateKey(privateKey)
      .setIssuer(email)

      // Set the name of the user to impersonate. This will only work for
      // Google Apps for Work/EDU accounts whose admin has setup domain-wide
      // delegation:
      // https://developers.google.com/identity/protocols/OAuth2ServiceAccount#delegatingauthority
      .setSubject([USER EMAIL])

      // Set the property store where authorized tokens should be persisted.
      .setPropertyStore(PropertiesService.getScriptProperties())

      // Set the scope. This must match one of the scopes configured during the
      // setup of domain-wide delegation.
      .setScope('https://www.googleapis.com/auth/script.external_request');
}

У меня ошибка 404, и я думаю, что это из списка областей. Поэтому я не могу запустить сценарий, развернутый как исполняемый файл API, с токеном OAuth2.0. Какие области мне следует выбрать для запуска функции через HTTP-запрос?


person yoxCL9    schedule 12.03.2020    source источник
comment
Привет @ yoxCL9, ты уверен, что это правильный URL? Это script.googleapis.com/v1/ скрипты / { scriptId}: запустите, и похоже, что у вас пропущена часть пути /scripts/, отсюда и код ошибки 404. Вы должны были получить 403, если была проблема с аутентификацией   -  person Oleg Valter    schedule 12.03.2020
comment
Привет @OlegValter, плохо, я ранее проверял запрос методом projects.get, и он работает.   -  person yoxCL9    schedule 12.03.2020
comment
Привет @ yoxCL9 - я вижу - хотя это не кажется актуальным, поскольку ответ Танаике подробно описывает фактическую основную проблему (да, как я мог пропустить список учетных записей служб, которые не поддерживаются)   -  person Oleg Valter    schedule 13.03.2020


Ответы (3)


В вашей функции run для объекта params вы должны иметь payload, а не playload.

person TheAddonDepot    schedule 12.03.2020

  • Вы хотите использовать Apps Script API с учетной записью службы.
  • Вы хотите добиться этого с помощью скрипта Google Apps.

Если я правильно понимаю, как насчет этого ответа? Подумайте об этом как об одном из нескольких возможных ответов.

Проблема и решение:

К сожалению, на текущем этапе метод scripts.run в Apps Script API не может использоваться с учетной записью службы. В официальном документе говорится следующее. Об этом, когда я тестировал это, я мог подтвердить, что метод scripts.run в Apps Script API не может использоваться с учетной записью службы.

Предупреждение: API скриптов приложений не работает со служебными аккаунтами.

Из приведенной выше ситуации, как обходной путь, как насчет использования токена доступа, полученного OAuth2? Чтобы использовать Apps Script API с OAuth2, необходимо связать Cloud Platform Project с Google Apps Script Project. Об этом вы можете увидеть, как связать их здесь.

Примечание:

Использованная литература:

Если это было не то направление, которое вам нужно, прошу прощения.

Добавлен:

  • Вы хотите, чтобы несколько пользователей запускали сценарий от имени вашего владельца.

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

1. Подготовить сценарий.

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

function doGet(e) {
  var values = e; // When you want to give the values by requesting, you can use the event object like "e".
  var res = myFunction(values);
  return ContentService.createTextOutput(res);
}
  • В этом случае используется метод GET. Если вы хотите только запустить функцию, вы можете использовать этот сценарий. Если вы хотите запустить функцию, передав большие данные, вы можете использовать doPost() вместо doGet().

2. Разверните веб-приложения.

  1. В редакторе скриптов откройте диалоговое окно, выбрав «Опубликовать» -> «Развернуть как веб-приложение».
  2. Select "Me" for "Execute the app as:".
    • By this, the script is run as the owner.
    • Здесь, когда установлено «Anyone», сценарий запускается от имени каждого пользователя. В этом случае требуется предоставить доступ к сценарию каждому пользователю. И токен доступа должен использоваться. Пожалуйста, будьте осторожны.
  3. Select "Anyone, even anonymous" for "Who has access to the app:".
    • In this case, no access token is required to be request. I think that as the test case, I recommend this setting.
    • Конечно, вы также можете использовать токен доступа. В то время установите для этого параметра значение «Любой».
  4. Нажмите кнопку «Развернуть» как новую «версию проекта».
  5. Automatically open a dialog box of "Authorization required".
    1. Click "Review Permissions".
    2. Выберите собственную учетную запись.
    3. Нажмите «Дополнительно» в разделе «Это приложение не проверено».
    4. Нажмите "Перейти к ### имени проекта ### (небезопасно)"
    5. Нажмите кнопку «Разрешить».
  6. Щелкните "ОК".
  7. Copy the URL of Web Apps. It's like https://script.google.com/macros/s/###/exec.
    • When you modified the Google Apps Script, please redeploy as new version. By this, the modified script is reflected to Web Apps. Please be careful this.

3. Запустите функцию с помощью веб-приложений.

Это пример команды curl для выполнения myFunction с веб-приложениями. Задайте URL своего веб-приложения. При указанных выше настройках веб-приложений каждый пользователь может получить доступ с помощью следующей команды curl.

curl -GL \
  -d "key=value" \
  "https://script.google.com/macros/s/###/exec"
  • Когда key=value используется в качестве параметра запроса, как указано выше, в doGet(e), вы можете получить value, используя e.parameter.key.

Использованная литература:

person Tanaike    schedule 12.03.2020
comment
Извините, я пропустил это предупреждение. Как я могу запустить сценарий с несколькими пользователями, используя учетные данные пользователя-владельца? Спасибо @Tanaike, однако проект скрипта Google Apps уже связан с проектом формы облачной платформы, а имя приложения указано в API и службах ›Учетные данные› Экран согласия OAuth. - person yoxCL9; 12.03.2020
comment
@ yoxCL9 Из вашего вопроса я предложил API скриптов приложений с OAuth2. Но, судя по вашему ответу, когда вы хотите, чтобы пользователи запускали сценарий как владелец, я хотел бы предложить использовать веб-приложения. В этом случае ваша цель может быть достигнута. Для этого я добавил последовательность установки веб-приложений. Не могли бы вы это подтвердить? Если это было не то направление, которое вам нужно, прошу прощения. - person Tanaike; 13.03.2020

Вы можете развернуть сценарий как веб-приложение. Для этого перейдите на Publish > Deploy as web app. Установите в поле Execute the app as: значение Me (youremail). Таким образом, вы можете поделиться скриптом в виде ссылки на браузер, и любой пользователь запустит скрипт с вашими учетными данными.

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

person Jescanellas    schedule 12.03.2020