使用Google Script更新Google Drive文件版本失败求助
问题分析与修正方案
你的代码存在两个核心问题,导致Excel文件更新失败并出现异常文本:
- 错误的文件更新方式:
file.setContent(attachment.setDataFromString)将函数本身的字符串(而非附件数据)写入了文件,同时setContent仅适用于文本文件,无法处理Excel这类二进制格式。 - 未确保获取最新线程:
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
相关产品推荐
相关产品推荐

