Google Apps Script多图上传异常:仅最后一张成功上传至Google Drive
解决Google Drive仅上传最后一张图片的问题
核心问题分析
你的代码存在三个关键问题导致仅最后一张图片上传成功:
- 共用单个FileReader实例:
vFileReader在循环外定义,每次循环调用readAsDataURL会中断前一次的读取操作,且每次循环都会覆盖onload回调,最终只有最后一次的回调会执行。 - 闭包变量绑定问题:循环中使用全局变量
i,当onload异步执行时,循环已经结束,i的值变为2,导致回调中DOM查询逻辑出错(仅最后一次读取未被中断,所以最后一张图能上传)。 - FileExists函数未生效:该函数没有返回值,且
google.script.run是异步调用,你未处理其返回结果,完全起不到文件存在校验的作用。
修复代码
前端HTML/JS代码修复
var myArray = ['antes','depois']; for (let i = 0; i < 2; i++) { // 每次循环创建独立的FileReader实例 const vFileReader = new FileReader(); const fileInput = document.querySelector(`input[id=${myArray[i]}]`); const file = fileInput.files[0]; if (file) { // 异步校验文件是否存在 google.script.run.withSuccessHandler(function(exists) { if (!exists) { vFileReader.onload = function(e) { const vValores = e.target.result.split(','); const vObj = { fileName: file.name, mimeType: file.type, data: vValores[1] }; // 上传图片并处理成功回调 google.script.run.withSuccessHandler(function(resp) { console.log(`上传成功:${resp.name}`, resp.url); }).SubirImagem(vObj); }; vFileReader.readAsDataURL(file); } else { console.log(`文件 ${file.name} 已存在,跳过上传`); } }).FileExists(file.name); } }
修复点说明:
- 用
let声明循环变量i,形成块级作用域,确保回调执行时能获取当前循环的i值。 - 每次循环创建新的
FileReader,避免不同上传任务相互干扰。 - 提前保存当前循环的
file变量,避免回调中重复查询DOM导致的错误。 - 完善
FileExists的异步调用逻辑,根据校验结果决定是否执行上传。
后端GS代码修复
// 替换为你的Google Drive文件夹ID const TARGET_FOLDER_ID = '你的文件夹ID'; function SubirImagem(data) { const myFile = Utilities.newBlob(Utilities.base64Decode(data.data), data.mimeType, data.fileName); const folder = DriveApp.getFolderById(TARGET_FOLDER_ID); const fileAdded = folder.createFile(myFile); return { url: fileAdded.getUrl(), name: data.fileName }; } function FileExists(vArqNome) { const folder = DriveApp.getFolderById(TARGET_FOLDER_ID); // 直接用Drive API提供的方法查询同名文件,返回布尔值 return folder.getFilesByName(vArqNome).hasNext(); }
修复点说明:
- 把文件夹ID提取为常量,避免重复书写和出错。
- 简化
FileExists逻辑:使用getFilesByName方法替代手动遍历,效率更高且逻辑清晰,同时返回布尔值明确表示文件是否存在。 - 原
FileExists中的标签循环属于冗余写法,直接用API方法即可实现需求。
额外提示
- 确保输入框的
id与myArray中的antes、depois完全匹配。 - 可添加
withFailureHandler捕获上传或校验过程中的错误,提升用户体验。 - 若不需要文件存在校验,可直接去掉
FileExists相关逻辑,简化上传流程。
内容的提问来源于stack exchange,提问作者Gutemberg Silveira Alves GTTJ
相关产品推荐
相关产品推荐

