求助:用Google Apps Script实现表单提交的带前缀自增ID生成
实现专属ID生成与同步的解决方案
核心思路
- 根据表单选择的
project类型生成对应首字母缩写前缀 - 为每个类型维护独立的自增序号,通过关联的Spreadsheet存储计数(避免重复)
- 将生成的ID同步写入表单响应表,并替换到生成的Google Doc中
具体代码修改
function autoFillGoogleDocFromForm(e) { // 获取表单提交数据 var timestamp = e.values[0]; var Name = e.values[1]; var class1 = e.values[2]; var team = e.values[3]; var project = e.values[4]; var phone = e.values[5]; // 1. 生成ID前缀 var prefix = ""; switch(project.toLowerCase()) { case "mechanical": prefix = "mc"; break; case "nonmechanical": prefix = "nm"; break; case "it": prefix = "it"; break; case "open": prefix = "op"; break; default: prefix = "unk"; // 未知类型默认前缀 } // 2. 获取并更新对应类型的自增序号 var ss = SpreadsheetApp.getActiveSpreadsheet(); // 用单独的配置表存储计数,避免响应表被修改影响 var configSheet = ss.getSheetByName("ID计数"); // 如果配置表不存在则创建并初始化 if(!configSheet) { configSheet = ss.insertSheet("ID计数"); configSheet.appendRow(["类型", "当前序号"]); configSheet.appendRow(["mc", 0]); configSheet.appendRow(["nm", 0]); configSheet.appendRow(["it", 0]); configSheet.appendRow(["op", 0]); configSheet.appendRow(["unk", 0]); } // 查找对应前缀的行并更新序号 var data = configSheet.getDataRange().getValues(); var currentNum = 0; var rowIndex = -1; for(var i=1; i<data.length; i++) { if(data[i][0] === prefix) { currentNum = data[i][1] + 1; rowIndex = i+1; // 表格行号从1开始 break; } } // 更新配置表中的序号 configSheet.getRange(rowIndex, 2).setValue(currentNum); // 3. 格式化生成ID(补零到3位) var formattedNum = currentNum.toString().padStart(3, "0"); var customID = prefix + formattedNum; // 4. 将ID写入表单响应表的对应行 var responseSheet = ss.getSheetByName("表单响应 1"); // 替换为你的实际响应表名称 var lastRow = responseSheet.getLastRow(); responseSheet.getRange(lastRow, 7).setValue(customID); // 第7列对应原idnumber列位置 // 后续文档生成逻辑 var file = DriveApp.getFileById("1nVMeanqeOL3fgEcjlzoq1u_FKu5E9Ta5IEO0ng-mt6Y"); var folder = DriveApp.getFolderById("1NeEHCsNhbQ0bAfcd3o-7X4SAhyEWXx1W") var copy = file.makeCopy(team + ',' + project + ' - ' + customID, folder); // 文件名加入ID便于识别 var doc = DocumentApp.openById(copy.getId()); var body = doc.getBody(); // 替换文档中的占位符,用生成的customID代替原idnumber body.replaceText('{{name}}', Name); body.replaceText('{{class1}}', class1); body.replaceText('{{team}}', team); body.replaceText('{{type}}', project); body.replaceText('{{no}}', phone); body.replaceText('{{id}}', customID); doc.saveAndClose(); }
关键步骤说明
- 前缀映射:通过
switch语句将表单选项转换为对应缩写,保证ID前缀匹配准确 - 序号存储:使用独立的
ID计数表维护各类型序号,避免响应表数据变动导致计数错误 - ID格式化:用
padStart(3, "0")将序号统一格式化为3位数字,确保ID格式一致(如mc001、it010) - 同步写入:定位到响应表的最新提交行,将生成的ID写入对应列
- 文档同步:把生成的ID替换到文档的
{{id}}占位符,同时在文件名中加入ID方便查找
注意事项
- 确认关联的Spreadsheet中存在
表单响应 1(或你的实际响应表名称),代码会自动创建ID计数表 - 首次运行脚本时需授予Drive和Spreadsheet的访问权限
- 若表单响应表的列顺序有变动,需调整写入ID的列号(
responseSheet.getRange(lastRow, 7)中的7)
内容的提问来源于stack exchange,提问作者zuniyed hossain
相关产品推荐
相关产品推荐

