Apps Script问题:使用DriveApp setName()重命名时生成原文件副本
Google表单上传文件重命名后,Drive根目录出现原文件副本问题
我用Google Form收集活动参与者签署的免责声明,尝试将上传文件重命名为「参与者姓名+上传时间」以整理文件夹,但遇到问题:重命名后的文件在目标子文件夹中正常显示,但Drive根目录同时出现原文件名的副本。
最初使用getItemResponses()方法重命名,对PDF有效但jpg、png格式无效,遂改为获取最后上传文件的方式(脚本运行时已锁定),代码如下:
function waiverSubmissionFileId(participantName) { const waiverSubmissionFolderId = '***DRIVE*FOLDER*ID***', waiverSubmissionFolder = DriveApp.getFolderById(waiverSubmissionFolderId); var lastSubmittedFileInfo = retrieveLastFileId(waiverSubmissionFolder); var lastSubmittedFileId = lastSubmittedFileInfo[0], lastSubmittedFileType = lastSubmittedFileInfo[1]; var lastSubmittedFile = DriveApp.getFileById(lastSubmittedFileId); var currentTime = new Date(); var currentTimeFormatted = Utilities.formatDate(currentTime,"GMT-5", "yyyy-MM-dd' 'HH:mm:ss"); lastSubmittedFile.setName(currentTimeFormatted + ' - ' + participantName + '.' + lastSubmittedFileType); } function retrieveLastFileId(waiverSubmissionFolder) { var files = waiverSubmissionFolder.getFiles();; var result = []; while (files.hasNext()) { var file = files.next(); var dateCreated = new Date().valueOf(); var fileId = file.getId(); result.push([dateCreated,fileId]); } var id = result.sort()[0][1]; var fileType = DriveApp.getFileById(id).getBlob().getContentType().slice(-3); if (fileType == 'peg'){ var fileInfo = [id,'jpg']; } else{ var fileInfo = [id,fileType]; } return fileInfo; };
问题根源
你怀疑getBlob()创建副本是错误的,实际问题出在retrieveLastFileId函数的逻辑错误:
- 获取文件创建时间时误用了
new Date().valueOf(),这获取的是脚本当前运行时间,而非文件实际创建时间,导致无法定位到最新上传的文件。 - 排序逻辑错误,原代码升序排序后取第一个文件,拿到的是目标文件夹中最旧的文件,而非新上传的文件。此时新上传的文件未被脚本处理,仍保留在Google Form默认的存储位置(通常是Drive根目录下的自动生成文件夹,看起来像根目录的副本)。
修复方案
修正代码中的时间获取和排序逻辑,同时优化后缀名获取方式:
function waiverSubmissionFileId(participantName) { const waiverSubmissionFolderId = '***DRIVE*FOLDER*ID***', waiverSubmissionFolder = DriveApp.getFolderById(waiverSubmissionFolderId); const lastSubmittedFileInfo = retrieveLastFileId(waiverSubmissionFolder); const lastSubmittedFileId = lastSubmittedFileInfo[0], lastSubmittedFileType = lastSubmittedFileInfo[1]; const lastSubmittedFile = DriveApp.getFileById(lastSubmittedFileId); const currentTime = new Date(); const currentTimeFormatted = Utilities.formatDate(currentTime,"GMT-5", "yyyy-MM-dd' 'HH:mm:ss"); lastSubmittedFile.setName(`${currentTimeFormatted} - ${participantName}.${lastSubmittedFileType}`); } function retrieveLastFileId(waiverSubmissionFolder) { const files = waiverSubmissionFolder.getFiles(); const result = []; while (files.hasNext()) { const file = files.next(); // 获取文件实际创建时间,替换原错误的当前时间 const dateCreated = file.getDateCreated().valueOf(); const fileId = file.getId(); result.push([dateCreated, fileId]); } // 按创建时间降序排序,取最新上传的文件 const sortedFiles = result.sort((a, b) => b[0] - a[0]); const latestFileId = sortedFiles[0][1]; const latestFile = DriveApp.getFileById(latestFileId); // 直接用getFileExtension获取后缀,更可靠 let fileType = latestFile.getExtension(); // 处理无后缀或特殊格式的情况 if (!fileType) { const contentType = latestFile.getBlob().getContentType(); fileType = contentType.split('/')[1]; if (fileType === 'jpeg') fileType = 'jpg'; } return [latestFileId, fileType]; };
关键修正点
- 正确获取文件创建时间:用
file.getDateCreated().valueOf()替代new Date().valueOf(),确保能筛选出最新上传的文件。 - 修正排序逻辑:改为降序排序,直接取第一个元素就是最新文件,避免选中旧文件。
- 优化后缀名获取:用
getFileExtension()直接获取文件后缀,替代不可靠的getContentType().slice(-3),减少格式兼容问题。 - 额外校验:增加无后缀文件的处理逻辑,避免命名失败。
内容的提问来源于stack exchange,提问作者Ruben Remus
相关产品推荐
相关产品推荐

