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

使用Google Script更新Google Drive文件版本失败求助

问题分析与修正方案

你的代码存在两个核心问题,导致Excel文件更新失败并出现异常文本:

  1. 错误的文件更新方式:file.setContent(attachment.setDataFromString)将函数本身的字符串(而非附件数据)写入了文件,同时setContent仅适用于文本文件,无法处理Excel这类二进制格式。
  2. 未确保获取最新线程:threads[0]的排序逻辑不可靠,无法保证拿到的是最新的带标签邮件线程。

修正后的代码

function UploadToDrive() {
  var labelName = "Port";
  var targetFolderName = "Schedules";
  var targetFileName = "Schedule.xlsx";

  var label = GmailApp.getUserLabelByName(labelName);
  if (!label) return; // 标签不存在时直接退出

  var threads = label.getThreads();
  if (threads.length === 0) return;

  // 按最后消息时间降序排序,确保第一个是最新线程
  threads.sort((threadA, threadB) => threadB.getLastMessageDate() - threadA.getLastMessageDate());
  var mostRecentThread = threads[0];
  var messages = mostRecentThread.getMessages();
  var latestMessage = messages[messages.length - 1];
  var attachments = latestMessage.getAttachments();

  for (var k = 0; k < attachments.length; k++) {
    var attachment = attachments[k];
    var attachmentName = attachment.getName().toLowerCase();

    if (attachmentName.includes("work schedule")) {
      try {
        var targetFolder = DriveApp.getFoldersByName(targetFolderName).next();
        var targetFileIterator = targetFolder.getFilesByName(targetFileName);

        if (targetFileIterator.hasNext()) {
          var targetFile = targetFileIterator.next();
          // 用setBlob传入二进制附件数据,正确覆盖目标Excel文件
          targetFile.setBlob(attachment);
          // 移除标签避免重复处理
          mostRecentThread.removeLabel(label);
          break; // 找到目标附件后终止循环
        } else {
          console.log(`目标文件 ${targetFileName} 不存在于文件夹 ${targetFolderName}`);
        }
      } catch (e) {
        console.log(`操作出错: ${e.toString()}`);
      }
    }
  }
}

关键修改说明

  • 使用setBlob替代setContent:Excel是二进制文件,setBlob()可以直接接收Gmail附件的Blob对象,正确覆盖目标文件内容,解决异常文本问题。
  • 线程时间排序:通过sort()方法按邮件最后更新时间降序排列,确保始终处理最新的带标签线程。
  • 添加异常捕获:用try-catch处理文件夹/文件不存在的情况,避免脚本崩溃并输出错误信息。
  • 移除标签防重复:处理完成后从线程移除目标标签,防止后续运行重复处理同一邮件。
  • 简化匹配逻辑:直接用小写字符串匹配附件名称,避免重复的toLowerCase()调用。

内容的提问来源于stack exchange,提问作者apex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 07:27:07