基于下拉选项的Google Form-Sheet分类递增编号Apps Script实现
基于Google Apps Script实现按分类生成递增编号(Google Form提交同步至Sheet)
你的需求是让Swimmers和Lifeguards两类提交各自拥有独立的递增编号,两类编号互不干扰、分别统计。原代码是全局统一递增,无法实现分类计数,下面是修改后的完整实现代码:
function onFormSubmit(e) { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const lastRow = sheet.getLastRow(); // 定义分类列(D列,对应索引4)和编号列(最后一列+1,也可改成固定列,比如E列填5) const categoryCol = 4; const incrementCol = sheet.getLastColumn() + 1; // 添加编号列表头(如果不存在) if (lastRow === 1 && !sheet.getRange(1, incrementCol).getValue()) { sheet.getRange(1, incrementCol).setValue("分类编号"); } // 获取当前提交的分类值(Swimmers/Lifeguards) const currentCategory = e.values[categoryCol - 1]; // e.values从0开始索引,列号需减1 // 获取所有已存在的同分类记录的编号 const allRows = sheet.getRange(2, 1, lastRow - 1, incrementCol).getValues(); const categoryNumbers = allRows .filter(row => row[categoryCol - 1] === currentCategory) .map(row => row[incrementCol - 1]) .filter(num => typeof num === 'number' && !isNaN(num)); // 计算新编号:同分类无记录则从1开始,否则取最大值+1 let newIncrementNumber = 1; if (categoryNumbers.length > 0) { newIncrementNumber = Math.max(...categoryNumbers) + 1; } // 给当前行设置编号 sheet.getRange(lastRow, incrementCol).setValue(newIncrementNumber); // 按第二列排序(保留你原有的排序逻辑) sortSheetByColumn(sheet, 2); } function sortSheetByColumn(sheet, column) { const range = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn()); range.sort({column: column, ascending: true}); } function createTrigger() { const triggers = ScriptApp.getProjectTriggers(); triggers.forEach(trigger => { if (trigger.getHandlerFunction() === "onFormSubmit") { ScriptApp.deleteTrigger(trigger); } }); ScriptApp.newTrigger('onFormSubmit') .forSpreadsheet(SpreadsheetApp.getActiveSpreadsheet()) .onFormSubmit() .create(); }
关键逻辑说明
- 分类列定位:把
categoryCol设为4对应D列,若你的分类列不是D列,直接修改这个数字即可。 - 获取当前分类:通过事件对象
e直接读取提交的分类值,比手动读取行数据更高效准确。 - 筛选同分类编号:遍历所有已有记录,筛选出当前分类的有效编号(过滤非数字值避免干扰)。
- 计算新编号:用
Math.max找到同分类的最大编号,加1得到新编号;若为该分类第一条记录,直接从1开始。
部署步骤
- 打开你的Google Sheet,点击菜单栏「扩展程序」→「Apps脚本」。
- 删除原有代码,粘贴上面的新代码。
- 点击保存按钮,给脚本起个名字(比如「分类编号生成器」)。
- 执行
createTrigger函数一次,创建表单提交触发事件(首次执行需授权,按提示完成即可)。 - 提交测试表单,验证编号是否按分类正确递增。
内容的提问来源于stack exchange,提问作者Vanessa Martinez
相关产品推荐
相关产品推荐

