完善Google Form附件同步脚本:支持编辑时增删附件同步至作业文件夹
修复表单编辑时附件无法同步到作业文件夹的问题
以下是完善后的Google Apps Script代码,支持首次提交和编辑表单时同步附件(新增附件移入文件夹,删除附件从文件夹移除):
const formID = 'FORM_ID'; // 替换为你的表单ID const spreadsheetID = 'SPREADSHEET_ID'; // 替换为你的表格ID const parentFolderID = 'PARENT_FOLDER_ID'; // 替换为父文件夹ID(修正原笔误) function onFormSubmit(e) { const sheet = SpreadsheetApp.openById(spreadsheetID).getSheets()[0]; // 关键修正:编辑时获取原数据行,而非最后一行 const row = e.range.getRow(); const formResponse = e.response; const responseId = formResponse.getId(); // 作业编号赋值(仅首次提交时设置) if (!sheet.getRange(row, 1).getValue()) { sheet.getRange(row, 1).setValue(row); } // 设置编辑链接(仅首次提交时设置) const editResponseUrl = formResponse.getEditResponseUrl(); if (!sheet.getRange(row, 5).getValue()) { sheet.getRange(row, 5).setValue(editResponseUrl); } // 获取或创建作业文件夹 const jobNumberValue = sheet.getRange(row, 1).getValue(); const columnDValue = sheet.getRange(row, 4).getValue(); const folderName = `${jobNumberValue} - ${columnDValue}`; const parentFolder = DriveApp.getFolderById(parentFolderID); // 查找或创建文件夹 let folder = null; const existingFolders = parentFolder.getFoldersByName(folderName); if (existingFolders.hasNext()) { folder = existingFolders.next(); } else { folder = parentFolder.createFolder(folderName); // 首次创建时记录文件夹ID、响应ID和URL sheet.getRange(row, 14).setValue(folder.getId()); sheet.getRange(row, 15).setValue(responseId); sheet.getRange(row, 6).setValue(folder.getUrl()); } // ************** 核心:附件同步逻辑 ************** // 获取表单中当前的附件列表(假设最后一个字段是附件上传字段) const attachmentItemResponse = formResponse.getItemResponses().pop(); const currentAttachmentIds = attachmentItemResponse.getResponse().map(file => file.id); // 获取作业文件夹中的所有文件ID const folderFiles = folder.getFiles(); const existingFileIds = []; while (folderFiles.hasNext()) { const file = folderFiles.next(); existingFileIds.push(file.getId()); } // 1. 删除文件夹中不在当前附件列表的文件(移入回收站,可恢复) existingFileIds.forEach(fileId => { if (!currentAttachmentIds.includes(fileId)) { DriveApp.getFileById(fileId).setTrashed(true); } }); // 2. 将表单中新增的附件复制到作业文件夹(避免重复复制已存在的文件) currentAttachmentIds.forEach(fileId => { if (!existingFileIds.includes(fileId)) { const file = DriveApp.getFileById(fileId); file.makeCopy(file.getName(), folder); } }); }
关键改动说明
- 行号定位修正:使用
e.range.getRow()获取表单提交对应的行,解决编辑时定位到错误行的问题 - 取消首次提交限制:移除原脚本中仅首次提交才执行的逻辑,确保编辑时也能触发附件同步
- 双向附件同步:
- 对比当前表单附件与文件夹内文件,删除已从表单移除的文件(移入回收站)
- 将表单新增的附件复制到作业文件夹,避免重复操作
- 文件夹逻辑优化:首次创建文件夹时才记录ID和URL,编辑时直接复用已有文件夹
内容的提问来源于stack exchange,提问作者Natalija Krupska
相关产品推荐
相关产品推荐

