求助完善Google Apps Script文件复制函数:无法正确复制图片文件
解决Google Apps Script复制图片文件变为HTML的问题
以下是修正后的完整脚本,能正确复制Drive中的图片(及其他类型文件)到目标文件夹,同时适配400-500个文件的批量处理需求:
function copyImg() { const ss = SpreadsheetApp.getActive(); const fileSheet = ss.getSheetByName("file to copy"); const lr = fileSheet.getLastRow(); // 获取目标文件夹名称 const nameFolder = `${ss.getRange("folder name!A2").getValue()} ${ss.getRange("folder name!B2").getDisplayValue()}`; // 获取目标文件夹(存在则复用,不存在则创建) let folder; const folders = DriveApp.getFoldersByName(nameFolder); if (folders.hasNext()) { folder = folders.next(); } else { folder = DriveApp.createFolder(nameFolder); } // 获取E列的文件ID(从第2行开始,跳过表头) const fileIds = fileSheet.getRange(2, 5, lr - 1).getValues(); // 循环复制每个文件 for (let i = 0; i < fileIds.length; i++) { const fileId = fileIds[i][0].trim(); // 跳过空ID if (!fileId) continue; try { // 根据ID获取源文件并复制到目标文件夹 const sourceFile = DriveApp.getFileById(fileId); sourceFile.makeCopy(sourceFile.getName(), folder); // 每复制20个文件暂停1秒,避免触发谷歌服务配额限制 if (i % 20 === 0 && i !== 0) { Utilities.sleep(1000); } } catch (e) { // 捕获错误并打印,避免单个文件失败导致整个脚本中断 console.log(`复制文件ID ${fileId} 失败: ${e.message}`); } } SpreadsheetApp.getUi().alert(`文件复制完成!共处理 ${fileIds.length} 条记录`); }
关键修正点说明
- 精准获取文件ID范围:从第2行开始读取E列数据,跳过表头,避免空行无效数据
- 正确复制文件:使用
DriveApp.getFileById(fileId).makeCopy()方法,直接复制原文件到目标文件夹,完全保留文件格式(不会把图片转成HTML) - 批量处理优化:加入每20个文件暂停1秒的逻辑,避免触发谷歌服务的调用频率限制(处理400-500个文件时很重要)
- 错误处理:加入try-catch块,单个文件复制失败时不会中断整个脚本,同时打印错误日志方便排查
- 用户反馈:脚本结束后弹出提示框,告知处理完成情况
内容的提问来源于stack exchange,提问作者diblax
相关产品推荐
相关产品推荐

