如何根据电子表格列标题映射Object值至对应列?
解决namedValues到表格对应列的写入问题
问题背景
此前通过二维数组映射的方式处理列索引匹配,从而正确使用setValues()写入表格,但面对表单提交返回的namedValues对象时,不知道如何将对象中的值按表头列索引组织,完成对应列的写入。已经能获取匹配的列索引,但后续值的组织和写入步骤缺失。
完整解决方案代码
function saveResponse(e) { const ss = SpreadsheetApp.getActiveSpreadsheet(); const dbSheet = ss.getSheetByName('DB'); const dbHeaders = dbSheet.getRange("A1:1").getValues()[0]; const responseKeys = Object.keys(e.namedValues); // 初始化与表头列数一致的空数组,用于填充对应列的值 const rowToWrite = new Array(dbHeaders.length).fill(""); // 遍历响应的每个字段,匹配表头并填充值 responseKeys.forEach(key => { // 找到当前字段在表头中的列索引 const headerIndex = dbHeaders.findIndex(header => header.includes(key)); if (headerIndex !== -1) { // 提取表单提交的值(namedValues的值为数组,取第一个元素) rowToWrite[headerIndex] = e.namedValues[key][0]; } }); // 获取表格下一个空行,写入组装好的数据 const nextRow = dbSheet.getLastRow() + 1; dbSheet.getRange(nextRow, 1, 1, rowToWrite.length).setValues([rowToWrite]); }
关键步骤说明
- 初始化行数组:创建长度与表头列数相同的
rowToWrite数组,用空字符串填充,确保每个列都有对应的位置,避免因字段缺失导致列错位。 - 匹配列索引:使用
findIndex替代嵌套循环,更高效地找到每个响应字段对应的表头列位置,判断条件为表头包含响应字段名(兼容字段名略有差异的情况)。 - 填充对应值:由于
namedValues的每个值都是数组(支持表单多选控件),通过[0]提取第一个值,写入到对应索引的位置。 - 写入表格:
setValues()要求传入二维数组,因此将rowToWrite包装为[rowToWrite],定位到下一个空行完成写入。
内容的提问来源于stack exchange,提问作者onit
相关产品推荐
相关产品推荐

