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
相关产品推荐
相关产品推荐

