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

Google Forms按姓名创建文件夹:代码报错及命名规则修改求助

解决方案

修正后的代码

function onFormSubmit(e) {
  const folderId = "12NjqFgiGLf***************";  // 请设置目标文件夹的顶级ID
  const form = FormApp.getActiveForm();
  const formResponses = form.getResponses();
  const itemResponses = formResponses[formResponses.length-1].getItemResponses();

  Utilities.sleep(3000); // 这行可能不需要

  // 准备文件夹
  const destFolder = DriveApp.getFolderById(folderId);
  // 获取First Name和Last Name字段的值
  const firstName = itemResponses[1].getResponse();
  const lastName = itemResponses[2].getResponse();
  let folderName = `${lastName}, ${firstName}`; // 按要求格式命名文件夹
  
  // 搜索现有同名或带序号的文件夹
  const subFolder = destFolder.searchFolders(`title contains '${folderName}'`);
  // 正则表达式匹配原名称或原名称_两位数字的格式
  const reg = new RegExp(`^${folderName}$|^${folderName}_\\d{2}$`);
  
  if (subFolder.hasNext()) {
    const folderNames = {};
    while (subFolder.hasNext()) {
      const fol = subFolder.next();
      const fName = fol.getName();
      if (reg.test(fName)) folderNames[fName] = fol;
    }
    const len = Object.keys(folderNames).length;
    if (len === 1 && folderNames[folderName]) {
      folderNames[folderName].setName(`${folderName}_01`);
    }
    folderName += `_${("00" + (len + 1)).slice(-2)}`;
  }
  
  const folder = destFolder.createFolder(folderName);

  // 获取所有上传文件的ID
  const fileUploads = itemResponses.filter((itemResponse) => 
    itemResponse.getItem().getType().toString() === "FILE_UPLOAD"
  )
  .map((itemResponse) => itemResponse.getResponse())
  .reduce((a, b) => [...a, ...b], []);

  // 将文件移动到新建文件夹
  fileUploads.forEach(id => DriveApp.getFileById(id).moveTo(folder));
}

关键修改说明

  1. 文件夹名称生成:
    • 从表单响应中正确提取First Name(索引1)和Last Name(索引2)的值,按"Last Name, First Name"格式拼接成文件夹名称。
  2. 正则表达式更新:
    • 调整正则规则以匹配新的命名格式,确保能识别原始名称(如"Smith, Alice")和带序号的变体(如"Smith, Alice_01")。
  3. 序号逻辑适配:
    • 保持原有的自动序号功能,当同一用户多次提交时,会自动生成带两位序号的文件夹名称,避免重复。

额外优化建议(可选)

原代码通过form.getResponses()获取最后一条响应,效率较低且可能在高并发场景下出错。建议直接使用触发器事件对象e来获取当前提交的响应,修改如下:

// 替换原代码中获取itemResponses的部分
const itemResponses = e.response.getItemResponses();

这样不仅更高效,还能准确获取当前触发的提交数据,避免因其他用户同时提交导致的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 06:12:08