首页 > 解决方案 > 如何过滤 Google Drive API v3 mimeType?

问题描述

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

从目标用户的角度(调用 Google Drive API v3)而不是运行脚本的帐户(调用 DriveApp)搜索 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"
},
...

有任何想法吗?

编辑:

谢谢!问题似乎是“语料库”和“空间”。我习惯于在 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);

标签: google-apps-scriptgoogle-drive-apimime-types

解决方案


这个答案怎么样?

修改点:

  • 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 中的“文件:列表”方法。
  • 如果发生错误,请corpora=domain从下面的 URL 中删除并重新测试。

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

参考:


推荐阅读