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

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];
};

关键修正点

  1. 正确获取文件创建时间:用file.getDateCreated().valueOf()替代new Date().valueOf(),确保能筛选出最新上传的文件。
  2. 修正排序逻辑:改为降序排序,直接取第一个元素就是最新文件,避免选中旧文件。
  3. 优化后缀名获取:用getFileExtension()直接获取文件后缀,替代不可靠的getContentType().slice(-3),减少格式兼容问题。
  4. 额外校验:增加无后缀文件的处理逻辑,避免命名失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 15:12:03