批量分配Drive权限时遇报错:Drive.Permissions.create is not a function
解决
Drive.Permissions.create is not a function报错问题 问题根源
你使用了**Google Drive高级服务(Drive Advanced Service)**的API语法,但未在脚本编辑器中启用该服务;或者混淆了基础DriveApp服务与高级Drive服务的调用逻辑,导致触发类型错误。
解决方案
方案1:启用Drive高级服务(适配原代码逻辑)
- 打开Google Apps Script编辑器,点击左侧菜单栏的「服务」
- 点击「添加服务」,找到「Drive API」并选中,点击「添加」
- 确认服务名称为
Drive(默认名称),完成启用
启用后,原代码的Drive.Permissions.create语法即可生效,以下是优化后的代码:
//----- Gestion des éditeurs/commentateurs/lecteurs function partagerFichiersEditeur() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName("ClubUrls"); const data = sheet.getDataRange().getValues(); const dataToBeProcessed = data .filter((row, i) => i !== 0) // 跳过表头行 .map(row => row.map(cell => { try { // 从链接提取Drive文件ID const match = new RegExp("d/(.*)/", "gm").exec(cell); return match ? match[1] : cell; } catch { // 分割并清理邮箱地址 return cell.trim().split(";").map(email => email.trim()).filter(email => email); } }) ); dataToBeProcessed.forEach(rowData => { const fileId = rowData[1]; if (!fileId) return; // 跳过无文件ID的行 try { // 分配编辑权限(第3列) rowData[2]?.forEach(destinataire => { Drive.Permissions.create( { role: "writer", type: "user", emailAddress: destinataire }, fileId, { sendNotificationEmail: false } ); console.log(`已共享编辑权限给 ${destinataire},文件ID: ${fileId}`); }); // 分配编辑权限(第4列) rowData[3]?.forEach(destinataire => { Drive.Permissions.create( { role: "writer", type: "user", emailAddress: destinataire }, fileId, { sendNotificationEmail: false } ); console.log(`已共享编辑权限给 ${destinataire},文件ID: ${fileId}`); }); // 分配阅读权限(第5列) rowData[4]?.forEach(destinataire => { Drive.Permissions.create( { role: "reader", type: "user", emailAddress: destinataire }, fileId, { sendNotificationEmail: false } ); console.log(`已共享阅读权限给 ${destinataire},文件ID: ${fileId}`); }); // 分配阅读权限(第6列) rowData[5]?.forEach(destinataire => { Drive.Permissions.create( { role: "reader", type: "user", emailAddress: destinataire }, fileId, { sendNotificationEmail: false } ); console.log(`已共享阅读权限给 ${destinataire},文件ID: ${fileId}`); }); // 如需启用评论者权限,取消注释下方代码 /* // 分配评论权限(第8列) rowData[7]?.forEach(destinataire => { Drive.Permissions.create( { role: "commenter", type: "user", emailAddress: destinataire }, fileId, { sendNotificationEmail: false } ); console.log(`已共享评论权限给 ${destinataire},文件ID: ${fileId}`); }); // 分配评论权限(第9列) rowData[8]?.forEach(destinataire => { Drive.Permissions.create( { role: "commenter", type: "user", emailAddress: destinataire }, fileId, { sendNotificationEmail: false } ); console.log(`已共享评论权限给 ${destinataire},文件ID: ${fileId}`); }); */ } catch (e) { console.error(`处理文件ID ${fileId} 时出错:`, e); } }); }
方案2:改用基础DriveApp服务(无需启用高级服务)
DriveApp的原生方法支持控制通知邮件,代码更简洁易维护:
//----- Gestion des éditeurs/commentateurs/lecteurs function partagerFichiersEditeur() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName("ClubUrls"); const data = sheet.getDataRange().getValues(); const dataToBeProcessed = data .filter((row, i) => i !== 0) // 跳过表头行 .map(row => row.map(cell => { try { // 从链接提取Drive文件ID const match = new RegExp("d/(.*)/", "gm").exec(cell); return match ? match[1] : cell; } catch { // 分割并清理邮箱地址 return cell.trim().split(";").map(email => email.trim()).filter(email => email); } }) ); dataToBeProcessed.forEach(rowData => { const fileId = rowData[1]; if (!fileId) return; // 跳过无文件ID的行 try { const file = DriveApp.getFileById(fileId); // 分配编辑权限(第3列) rowData[2]?.forEach(destinataire => { file.addEditor(destinataire, { sendNotificationEmail: false }); console.log(`已共享编辑权限给 ${destinataire},文件ID: ${fileId}`); }); // 分配编辑权限(第4列) rowData[3]?.forEach(destinataire => { file.addEditor(destinataire, { sendNotificationEmail: false }); console.log(`已共享编辑权限给 ${destinataire},文件ID: ${fileId}`); }); // 分配阅读权限(第5列) rowData[4]?.forEach(destinataire => { file.addViewer(destinataire, { sendNotificationEmail: false }); console.log(`已共享阅读权限给 ${destinataire},文件ID: ${fileId}`); }); // 分配阅读权限(第6列) rowData[5]?.forEach(destinataire => { file.addViewer(destinataire, { sendNotificationEmail: false }); console.log(`已共享阅读权限给 ${destinataire},文件ID: ${fileId}`); }); // 如需启用评论者权限,取消注释下方代码 /* // 分配评论权限(第8列) rowData[7]?.forEach(destinataire => { file.addCommenter(destinataire, { sendNotificationEmail: false }); console.log(`已共享评论权限给 ${destinataire},文件ID: ${fileId}`); }); // 分配评论权限(第9列) rowData[8]?.forEach(destinataire => { file.addCommenter(destinataire, { sendNotificationEmail: false }); console.log(`已共享评论权限给 ${destinataire},文件ID: ${fileId}`); }); */ } catch (e) { console.error(`处理文件ID ${fileId} 时出错:`, e); } }); }
代码优化说明
- 简化了原数据处理逻辑,用
filter+map替代冗余操作 - 增加可选链
?.避免空值报错 - 自动清理邮箱地址中的空格与空字符串,减少无效操作
- 用
console.error输出错误,便于调试定位
内容的提问来源于stack exchange,提问作者Nicolas
相关产品推荐
相关产品推荐

