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

完善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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 05:23:15