如何在 Google Apps 脚本中使用 UrlFetchApp 发出 Drive API 批处理请求

Posted

技术标签:

【中文标题】如何在 Google Apps 脚本中使用 UrlFetchApp 发出 Drive API 批处理请求【英文标题】:How to make a Drive API batch request with UrlFetchApp in Google Apps Script 【发布时间】:2018-01-17 16:10:56 【问题描述】:

我想知道。我已经阅读了谷歌文档,但我仍然不清楚。我想将下面的代码转换为接受多个文件 ID 的批处理请求。

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】:

这个示例脚本怎么样?当我看到this document 时,我可以发现您要进行批处理请求的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 调用都没有保证顺序。

在我的环境中,我确认这有效。但是,如果这在您的环境中不起作用,请告诉我。我要修改。

【讨论】:

是的,你是对的。我的脚本有效,但问题是我还没有找到如何将其转换为批处理请求,这意味着在每个请求中处理多个文件 ID。我需要处理数百个文件,所以我正在研究批处理作为解决方案。到目前为止,这是我找到的 link,但它不包括如何使用 Google Apps 脚本执行它。 @f k 很抱歉我的误解。我想研究一下。真的很抱歉。 没问题。感谢您尝试提供帮助。如果我找到答案,我也会在这里更新。 @f k 谢谢。我也想在找到它时更新。 @f k 很抱歉我的回复迟了。我更新了我的答案。请确认。

以上是关于如何在 Google Apps 脚本中使用 UrlFetchApp 发出 Drive API 批处理请求的主要内容,如果未能解决你的问题,请参考以下文章