如何识别绑定到同一张Google Sheet的多个Google Form提交来源
解决方案
你不需要拆分当前Google Sheet,可通过以下两种方式过滤onFormSubmit触发事件,实现数据分流:
方案1:通过提交数据的目标标签过滤(推荐)
onFormSubmit事件对象的range属性对应新提交数据写入的单元格范围,调用range.getSheet()即可获取数据写入的标签对象,匹配标签名称即可判断提交来源,实现分流。
修改后的参考代码如下:
// These are the Database connections values var user = 'dbUsername'; var userPwd = 'dbPassword'; var db = 'databaseName'; var dbUrl = 'jdbc:mysql://192.168.0.0:3306/' + db; // 配置标签名与对应写入逻辑的映射 const SHEET_CONFIG = { "表单1对应的标签名": { table: "test_google_forms_1", fields: ["Color1", "Number1"] }, "表单2对应的标签名": { table: "test_google_forms_2", fields: ["Department", "StaffName"] } } function onFormSubmit(e) { // 获取本次提交数据写入的标签名称 const targetSheetName = e.range.getSheet().getName(); // 不在配置内的标签提交直接跳过 if (!SHEET_CONFIG.hasOwnProperty(targetSheetName)) return; const config = SHEET_CONFIG[targetSheetName]; // 按配置提取对应字段值 const values = config.fields.map(field => e.namedValues[field][0]); // 写入对应MySQL表 writeToTable(config.table, config.fields, values); } function writeToTable(tableName, fields, values) { var conn = Jdbc.getConnection(dbUrl, user, userPwd); // 动态拼接预处理SQL const placeholders = values.map(() => '?').join(','); const fieldStr = fields.map(f => `\`${f}\``).join(','); var stmt = conn.prepareStatement(`INSERT INTO ${tableName} (${fieldStr}) values (${placeholders})`); // 批量绑定参数 values.forEach((val, idx) => stmt.setString(idx+1, val)); stmt.execute(); // 关闭连接避免资源占用 stmt.close(); conn.close(); }
如果担心标签被重命名导致匹配失效,也可以用标签ID匹配,调用e.range.getSheet().getSheetId()获取标签ID做配置即可。
方案2:通过表单独有问题字段过滤
如果每个绑定的表单都有独有的问题字段,也可以通过检查e.namedValues中是否存在对应独有字段来判断提交来源:
function onFormSubmit(e) { // 表单1独有问题为Color1 if (e.namedValues.hasOwnProperty('Color1')) { const color = e.namedValues['Color1'][0]; const number = e.namedValues['Number1'][0]; writeColor(color, number); } // 表单2独有问题为Department else if (e.namedValues.hasOwnProperty('Department')) { const dept = e.namedValues['Department'][0]; const name = e.namedValues['StaffName'][0]; writeDeptStaff(dept, name); } }
内容的提问来源于stack exchange,提问作者Bing
相关产品推荐
相关产品推荐

