如何在Google Apps Script插件中用File Picker缩小Drive权限范围?
Google Docs插件权限与文件导出路径问题
背景需求
开发一款Google Docs插件,需将导出文件保存至当前文档所在的同一文件夹,同时需使用最窄权限范围以通过应用市场审核。
原实现与权限冲突
原版本通过以下代码获取当前文档的父文件夹ID,但该实现需要受限权限范围 https://www.googleapis.com/auth/drive.readonly:
const currentDoc = DocumentApp.getActiveDocument(); const currentDocId = currentDoc.getId(); const currentFolderId = DriveApp.getFileById(currentDocId).getParents().next();
官方推荐使用仅需 https://www.googleapis.com/auth/drive.file 权限的Google Picker API,因此尝试切换至该方案。
Google Picker API尝试的问题
使用File Picker时,希望用户能快速定位到当前文档所在文件夹,但默认弹出的Picker显示最近文件夹,目标文件夹可能不在列表内。审核人员建议通过View的方法优化:
方案1:使用setFileIds预选文档
var docsView = new google.picker.DocsView() .setFileIds(<?= currentDocId ?>);
方案2:使用setParent设置初始文件夹
var docsView = new google.picker.DocsView() .setParent(<?= currentFolderId ?>);
但实际操作中遇到以下问题:
- 仅能获取当前文档ID,获取父文件夹ID需要受限权限
- 用当前文档ID设置
fileIds后,Picker会跳转至“授权”页面显示当前文档;用户选择该文档后,无受限权限时无法通过Drive.Files.get加载文件;即使添加完整Drive权限,也无法获取文件的父文件夹(parents属性为undefined)
Picker回调代码及报错情况:
function pickerCallback(fileId) { // 无受限权限时报错:Error: API call to drive.files.get failed with error: File not found: xxxxx_xxxxx const file = Drive.Files.get(fileId, { supportsAllDrives: true }); DocumentApp.getUi().alert(`Got file "${file.name}"!!`); // 添加完整权限后报错:Error: Cannot read properties of undefined (reading '0') const parent = file.parents[0]; DocumentApp.getUi().alert(`Got parent "${parent.name}"!!`); return true; }
当前可选方案
若要避开受限权限,只能选择以下影响用户体验的方案:
- 将文件保存至用户Drive根文件夹,加剧Drive存储混乱
- 显示默认File Picker,让用户自行查找文件夹,依赖目标文件夹出现在列表顶部
- 其他可行方案?
权限审核相关疑问
- 是否可以申请让插件通过受限权限审核?
- 有没有开发者成功申请过?
- 使用受限权限是否值得?
内容的提问来源于stack exchange,提问作者Dagmar
相关产品推荐
相关产品推荐

