You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Apps Script多图上传异常:仅最后一张成功上传至Google Drive

解决Google Drive仅上传最后一张图片的问题

核心问题分析

你的代码存在三个关键问题导致仅最后一张图片上传成功:

  1. 共用单个FileReader实例:vFileReader在循环外定义,每次循环调用readAsDataURL会中断前一次的读取操作,且每次循环都会覆盖onload回调,最终只有最后一次的回调会执行。
  2. 闭包变量绑定问题:循环中使用全局变量i,当onload异步执行时,循环已经结束,i的值变为2,导致回调中DOM查询逻辑出错(仅最后一次读取未被中断,所以最后一张图能上传)。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 02:00:25