google-apps-script - 如何过滤 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);
解决方案
这个答案怎么样?
修改点:
- 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}`;
参考:
推荐阅读
- postgresql - Docker Compose postgres 9.6 初始化数据库
- vue-apollo - Vue Apollo 项目 - 拥有单独的服务是共享状态的好方法吗?
- mysql - 如何修复 SQL 错误 (1248):每个派生表都必须有自己的别名
- python - 当满足 2 个标准时,如何仅总结基于值的值?
- excel - 粘贴另一个工作表中的前导公共子字符串
- javascript - 如何在前端 Web 应用程序中隐藏测验的答案?
- ruby-on-rails - ActiveRecord 在双向线程中选择第一条消息
- excel - 使用 AGGREGATE 函数提取数组中的最大值会引发错误
- python - 显示 subprocess.Popen 的输出,就像在终端中运行一样
- flutter - 如何临时更改 Flutter 小部件中的文本颜色(并返回)?