Как сделать пакетный запрос Drive API с помощью UrlFetchApp в скрипте Google Apps

Я хотел бы знать, как сделать пакетный запрос Drive API с помощью UrlFetchApp в скрипте Google Apps. Я прочитал документацию Google, но она мне до сих пор не ясна. Я хочу преобразовать приведенный ниже код в пакетный запрос, принимающий несколько идентификаторов файлов.

var url = 'https://www.googleapis.com/drive/v2/files/FILEID/permissions';

var data = {
    "role":"owner",
    "type":"user",
    "value": NEWOWNER
  };

var response = UrlFetchApp.fetch(url, {
  headers: {
    Authorization: 'Bearer ' + AUTHORIZATIONTOKEN
  },
  method: 'post',
  contentType: 'application/json',
  payload: JSON.stringify(data),
});
var result = JSON.parse(response.getContentText());

Я пытался с помощью https://www.googleapis.com/drive/v2/files?id=FILEID1&id=FILEID2/permissionsно это, казалось, не работает. Я только что видел описание вложения каждого запроса файла в пакетный запрос, но до сих пор я не нашел пример синтаксиса для правильного выполнения.

Некоторое понимание было бы полезно. Спасибо!

1 ответ

Решение

Как насчет этого примера сценария? Когда я увидел этот документ, я обнаружил, что вызовы API, которые вы хотите сделать пакетным запросом, отправляются с использованием multipart/mixed, Таким образом, я мог бы создать образец скрипта для Google Apps Script следующим образом.

Пример скрипта:

function myFunction() {
  var body = [
    {
      method: "POST",
      endpoint: "https://www.googleapis.com/drive/v3/files/### fileId 1 ###/permissions",
      requestBody: {
       "role": "owner",
       "type": "user",
       "emailAddress": NEWOWNER
      }
    },
    {
      method: "POST",
      endpoint: "https://www.googleapis.com/drive/v3/files/### fileId 2 ###/permissions",
      requestBody: {
       "role": "owner",
       "type": "user",
       "emailAddress": NEWOWNER
      }
    }
  ];

  var boundary = "xxxxxxxxxx";
  var contentId = 0;
  var data = "--" + boundary + "\r\n";
  for (var i in body) {
        data += "Content-Type: application/http\r\n";
        data += "Content-ID: " + ++contentId + "\r\n\r\n";
        data += body[i].method + " " + body[i].endpoint + "\r\n";
        data += body[i].requestBody ? "Content-Type: application/json; charset=utf-8\r\n\r\n" : "\r\n";
        data += body[i].requestBody ? JSON.stringify(body[i].requestBody) + "\r\n" : "";
        data += "--" + boundary + "\r\n";
  }
  var payload = Utilities.newBlob(data).getBytes();
  var options = {
    method: "post",
    contentType: "multipart/mixed; boundary=" + boundary,
    payload: payload,
    headers: {'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()},
    muteHttpExceptions: true,
  };
  var res = UrlFetchApp.fetch("https://www.googleapis.com/batch", options).getContentText();
  Logger.log(res);
}

Замечания:

  • Пожалуйста, измените этот пример сценария для вашей среды.
  • Если вы хотите больше API, пожалуйста, добавьте элементы в массив "body".
  • Предполагается, что вы уже включили Drive API.
  • Drive API можно использовать не более 100 вызовов в одном пакетном запросе. Это ограничение.
  • Для пакетного запроса каждый вызов API не является гарантированным заказом.

В моем окружении я подтвердил, что это работает. Но если это не сработало в вашей среде, пожалуйста, скажите мне. Я хотел бы изменить.

Другие вопросы по тегам