如何过滤 Google Drive API v3 mimeType?

How to filter Google Drive API v3 mimeType?

我编写了一个脚本,使用 DriveApp 读取 Google Drive,SpreadsheetApp 将数据记录到表格中,并使用 Google Drive API v3 + 服务帐户 + OAuth 进行更改代表 G Suite 用户。

从目标用户的角度(调用Google Drive API v3)搜索Google Drive而不是帐户运行脚本(调用驾驶应用程序)。我无法使用过滤器。

查询是使用父文件夹键构建的,mimeType =mimeType != 用于文件夹,并传递到函数中。格式为:

var query = "('GoogleDriveFolderKey01' in parents or 'GoogleDriveFolderKey02' in parents) and trashed = false and mimeType = 'application/vnd.google-apps.folder'"

DriveApp 函数使用:

files = Drive.Files.list({
  q: query,
  maxResults: 100,
  pageToken: pageToken
});

Google Drive API v3 函数使用:

var url = 'https://www.googleapis.com/drive/v3/files/'
var options = {
  'contentType': 'application/json',
  'method'     : 'get',
  'headers'    : { Authorization: 'Bearer ' + service.getAccessToken() },
  'muteHttpExceptions': true,
  'corpora'    : 'domain',
  'q'          : query,
  'spaces'     : 'drive',
  'pageSize'   : 100,
  'pageToken'  : pageToken
};
var response = UrlFetchApp.fetch(url, options);

var resultParsed = JSON.parse(response.getContentText());
files = resultParsed.files
pageToken = resultParsed.pageToken

DriveApp 的结果符合预期,但 Google Drive API v3 结果为:

"files": [
{
  "kind": "drive#file",
  "id": "01abc123_etc",
  "name": "Something something (2021-04-15).pdf",
  "mimeType": "application/pdf"
},
{
  "kind": "drive#file",
  "id": "02ABC4321-qwertyuiop",
  "name": "Super Special Worksheet",
  "mimeType": "application/vnd.google-apps.spreadsheet"
},
{
  "kind": "drive#file",
  "id": "whatever",
  "name": "Copy of V1",
  "mimeType": "application/vnd.google-apps.folder"
},
...

有什么想法吗?

编辑:

谢谢!问题似乎是 'corpus' 和 'space'。我习惯于在 Google AppsScript 中关注:

var options = {
  'contentType': 'application/json',
  'method'     : 'get',
  'headers'    : { Authorization: 'Bearer ' + service.getAccessToken() },
  'muteHttpExceptions': true,
  'pageSize'   : 100
};
url += '?q=' + encodeURIComponent(query);
if ( pageToken.length > 0 ) url += '&pageToken=' + pageToken;
var response = UrlFetchApp.fetch(url, options);

这个答案怎么样?

修改点:

  • Drive API v3中"Files: list"的方法中,使用了corpora, q, space, pageSize, pageToken的值作为查询参数。我认为你的问题的原因是由于这个。
  • 在 GET 方法中,不需要 contentType

修改后的脚本:

当你的脚本修改后,变成如下。

var query = "('GoogleDriveFolderKey01' in parents or 'GoogleDriveFolderKey02' in parents) and trashed = false and mimeType = 'application/vnd.google-apps.folder'"

var url = 'https://www.googleapis.com/drive/v3/files'  // Modified
var options = {  // Modified
  'method'     : 'get',
  'headers'    : { Authorization: 'Bearer ' + service.getAccessToken() },
  'muteHttpExceptions': true,
};
url += `?corpora=domain&q=${encodeURIComponent(query)}&spaces=drive&pageSize=100&pageToken=${pageToken}`;  // Added

var response = UrlFetchApp.fetch(url, options);
var resultParsed = JSON.parse(response.getContentText());
files = resultParsed.files
pageToken = resultParsed.pageToken

注:

  • 此修改脚本假设service.getAccessToken()可用于使用Drive API v3中"Files: list"的方法。
  • 如果出现错误请将corpora=domain从URL中移除并重新测试

    url += `?q=${encodeURIComponent(query)}&spaces=drive&pageSize=100&pageToken=${pageToken}`;
    

参考: