Apps Script如何按单元格匹配的文件夹ID将表格复制到对应文件夹
错误原因
你代码中getRange(6,5)对应的是E6单元格,你注释里也明确了这里存储的是项目名称,不是合法的Drive文件夹ID,将无效值传入getFolderById方法就会触发该异常。手动填写ID可以正常运行也验证了这一点。
解决方案
你可以根据需求二选一:
方案1:新增列存储对应文件夹ID
如果你可以在表格里提前维护好项目对应的文件夹ID,比如把ID存到F6单元格,直接修改folderId的取值逻辑即可:
function copyDocument() { var ss = SpreadsheetApp.getActiveSpreadsheet(); // 获取当前激活的电子表格 var sstocopy = DriveApp.getFileById(ss.getId()); // 用DriveApp获取当前表格文件 var sheet = ss.getSheetByName("PO"); // 获取名为PO的工作表 var project = sheet.getRange("E6").getValue(); // 获取项目名称,用于生成复制后的文件名 var poNumber = sheet.getRange("C6").getValue(); // 获取PO编号,用于生成复制后的文件名 var folderId = sheet.getRange("F6").getValue(); // 改为从F6单元格取文件夹ID var folder = DriveApp.getFolderById(folderId); // 获取目标文件夹对象 sstocopy.makeCopy('PO ' + project + " (" + poNumber + ")",folder); // 复制表格到目标文件夹 }
方案2:通过项目名称匹配文件夹名称获取目标文件夹
如果你不需要提前维护ID,想直接用E6的项目名称匹配Drive里的文件夹,可使用以下代码,适配你需求里“单元格值匹配文件夹名称”的要求:
function copyDocument() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sstocopy = DriveApp.getFileById(ss.getId()); var sheet = ss.getSheetByName("PO"); var project = sheet.getRange("E6").getValue(); var poNumber = sheet.getRange("C6").getValue(); // 按名称搜索Drive内的文件夹 var folderSearchResults = DriveApp.getFoldersByName(project); // 判断是否找到匹配的文件夹 if (folderSearchResults.hasNext()) { var folder = folderSearchResults.next(); sstocopy.makeCopy('PO ' + project + " (" + poNumber + ")", folder); } else { SpreadsheetApp.getUi().alert("未找到名称为【" + project + "】的对应文件夹,请检查名称是否匹配"); } }
注意事项
- 如果存在多个同名文件夹,方案2默认会取搜索结果里的第一个文件夹,建议给项目名加唯一标识避免重名问题
- 确保当前脚本执行的账号对目标文件夹有编辑权限
- 首次运行需要授权脚本访问Drive和表格的权限
文件夹结构参考

内容的提问来源于stack exchange,提问作者Sessionone
相关产品推荐
相关产品推荐

