如何在 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 批处理请求的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Google Apps 脚本中使用 Cheerio 提取 HTML 表格数据?

Google Apps 脚本在 Javascript 中获取 iFrame 的父 URL

如何将 JSON 文件转换为使用 Google Apps 脚本分隔的新行?

Google Apps 脚本使用 replaceText() 使文本成为可点击的 URL

用于打开 URL 的 Google Apps 脚本

Google Apps脚本传递网址参数Google信息中心