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

Google表单提交后上传文件多副本 如何仅保留自定义子文件夹文件

问题根因

你观察到的3份上传文件并非全是占用存储空间的实体副本:

  • 根目录「My Drive」中展示的文件是Google Drive的聚合视图快捷入口,不是独立存储的实体副本,本身不占用额外空间
  • Google表单自动生成的文件响应子文件夹内的文件,是用户提交上传后默认存储的原始正本
  • 学号命名自定义子文件夹内的文件,是脚本执行移动操作后的文件,若未显式移除原始目录的挂载关联,同一份文件会同时在两个文件夹中显示,看起来像生成了副本
  • 如果你之前多次运行过initialize函数生成了重复触发器,会导致脚本多次执行复制逻辑,真的生成多份实体副本。
操作步骤

1. 清理重复触发器

打开Apps Script编辑器,先手动删除所有已绑定到表单、触发函数为onFormSubmit的触发器,避免重复执行脚本生成冗余文件。

2. 替换为优化后的脚本代码

将原有代码全部替换为以下版本,新版本增加了重复触发器清理、子文件夹存在性校验、显式移除默认目录挂载关联的逻辑,从根源避免多副本问题:

const PARENT_FOLDER_ID = "1x_SpJWrQ3FLuosjooPD3mNMVKphvQZMAf59Hd6O0HYwlguaxCzWaqRR3rxBkWI9P26zKx1CF";

const initialize = () => {
  const form = FormApp.getActiveForm();
  // 自动清理旧的重复触发器
  ScriptApp.getProjectTriggers().forEach(trigger => {
    if(trigger.getHandlerFunction() === 'onFormSubmit') ScriptApp.deleteTrigger(trigger);
  })
  // 绑定新的表单提交触发器
  ScriptApp.newTrigger("onFormSubmit").forForm(form).onFormSubmit().create();
};

const onFormSubmit = ({ response } = {}) => {
  try {
    // 读取学号字段作为自定义子文件夹名称
    const studentNumber = response.getItemResponses()[2].getResponse().trim();
    const parentFolder = DriveApp.getFolderById(PARENT_FOLDER_ID);
    
    // 校验同名文件夹是否存在,避免重复创建子文件夹
    let targetSubfolder;
    const folderIterator = parentFolder.getFoldersByName(studentNumber);
    if(folderIterator.hasNext()){
      targetSubfolder = folderIterator.next();
    } else {
      targetSubfolder = parentFolder.createFolder(studentNumber);
    }

    // 提取当前提交中所有上传文件的ID
    const uploadedFileIds = response
      .getItemResponses()
      .filter(itemResponse => itemResponse.getItem().getType().toString() === "FILE_UPLOAD")
      .map(itemResponse => itemResponse.getResponse())
      .reduce((fileList, currentBatch) => [...fileList, ...currentBatch], []);

    if (uploadedFileIds.length > 0) {
      // 获取表单默认的文件上传存储目录
      const form = FormApp.getActiveForm();
      const defaultUploadFolder = DriveApp.getFolderById(form.getFileUploadsDestinationFolder().getId());
      
      uploadedFileIds.forEach(fileId => {
        const targetFile = DriveApp.getFileById(fileId);
        // 将文件移动到自定义学号文件夹
        targetFile.moveTo(targetSubfolder);
        // 显式移除文件和默认上传目录的关联,彻底解决双文件夹挂载问题
        targetFile.removeParent(defaultUploadFolder);
      });
    }
  } catch (err) {
    Logger.log(err);
  }
};

3. 重新初始化触发器

代码替换完成后,在编辑器中手动运行一次initialize函数,按照弹窗提示完成Google账号授权,脚本会自动完成触发器的清理和重新绑定。

4. 关闭根目录聚合视图避免误导

打开Google Drive设置页面,取消勾选「在「我的云端硬盘」中显示所有已上传和共享的文件」选项,保存设置后,根目录就不会再展示所有文件的快捷入口,你只会在自定义的学号子文件夹中看到唯一一份实体上传文件。

注意:不要直接删除根目录视图中看到的上传文件,该入口关联实体文件,直接删除会导致自定义文件夹内的文件被同步删除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:09:23