如何通过Google AppScript获取GDrive中已打标签的文件
实现结论
别折腾searchFiles()的q查询参数了,不管是AppScript内置的DriveApp简易服务,还是原生Drive v3 API,目前都没有开放Labels维度的查询过滤能力,没法在拉取文件列表的阶段直接筛选出带标签/不带标签的文件,只能先拉取全量文件、显式请求标签字段,再在代码逻辑里自行判断。
具体实现步骤
1. 添加高级Drive服务(v3版本)
内置的DriveApp没封装标签相关的返回字段,必须手动启用高级服务对接最新版Drive API:
- 打开AppScript编辑器,在左侧侧边栏找到「服务」分类,点击旁边的+号按钮
- 在弹出的服务列表里选「Drive API」,版本选v3,点击添加完成授权
- 仅做标签识别的话,给脚本开
https://www.googleapis.com/auth/drive.readonly只读权限就够,不需要编辑权限。
2. 遍历文件时强制请求labelInfo字段
标签信息不属于文件默认返回的字段,必须在接口请求的fields参数里明确声明要拿labelInfo,否则返回结果里不会带任何标签相关数据,参考代码如下:
function scanAllFilesLabelStatus() { const resultList = []; let pageToken = null; do { // 分页拉取文件,不要在q参数里加标签相关筛选条件,加了也会报错 const res = Drive.Files.list({ pageSize: 100, pageToken: pageToken, fields: "nextPageToken, files(id, name, webViewLink, mimeType, labelInfo)" }); if (res.files && res.files.length > 0) { res.files.forEach(file => { const labelList = file.labelInfo?.labels ? Object.keys(file.labelInfo.labels) : []; resultList.push({ fileName: file.name, fileId: file.id, fileUrl: file.webViewLink, hasLabel: labelList.length > 0, labelDetail: file.labelInfo?.labels || {} }); }); } pageToken = res.nextPageToken; } while (pageToken); // 这里可以自己加逻辑,把结果写入表格、输出日志都可以 console.log(`扫描完成,共统计${resultList.length}个文件,其中已打标签文件${resultList.filter(i => i.hasLabel).length}个`); return resultList; }
踩坑提醒
- 权限要求和你了解的一致:Labels是GWS商业/企业版独有的功能,非管理员账号只能识别自己有权限访问、且有权限查看对应标签的文件;如果要扫全域所有文件,必须找企业管理员在后台给脚本开全域Drive数据访问权限。
- 别用Drive v2版本API:v2返回的
labels字段是老版Drive的分类标记,和现在的结构化Labels完全不是一套东西,用了会判断错。 - 如果盘里文件总量超过10万,建议每次扫完把结果存到Sheets或者BigQuery里做增量更新,别每次全量扫,很容易打满API配额。
内容的提问来源于stack exchange,提问作者Najmlll
相关产品推荐
相关产品推荐

