Chrome V8环境下Google Sheets中ES6 JS按Id合并多维数组
解决Google Sheets V8中动态维度数组按Id合并的问题
针对你描述的场景——两个维度未知的多维数组,arr1的Id固定在第一列,arr2的Id列位置不确定,需要按arr1的Id匹配合并,没有匹配项则填空字符串,我整理了一套通用的解决方案:
核心思路
- 快速映射arr2数据:先遍历arr2找到Id列位置,用
Map创建Id到对应行非Id列数据的映射,后续匹配时能实现O(1)时间查找,效率更高。 - 动态合并表头:自动拼接arr1的表头和arr2中排除Id列的表头,保证结果表头完整对应。
- 遍历arr1完成合并:逐个处理arr1的每一行,根据Id从映射中取出对应数据拼接;无匹配Id时,生成对应数量的空字符串填充。
完整代码实现
function mergeArrays(arr1, arr2) { // 第一步:定位arr2的Id列,并构建Id映射表 let idColIndexArr2 = -1; // 遍历arr2表头找Id列位置 for (let i = 0; i < arr2[0].length; i++) { if (arr2[0][i] === "Id") { idColIndexArr2 = i; break; } } if (idColIndexArr2 === -1) throw new Error("arr2中未找到Id列"); // 存储Id对应的数据(排除Id列本身) const arr2Map = new Map(); for (let row = 1; row < arr2.length; row++) { const id = arr2[row][idColIndexArr2]; const otherCols = []; for (let col = 0; col < arr2[row].length; col++) { if (col !== idColIndexArr2) otherCols.push(arr2[row][col]); } arr2Map.set(id, otherCols); } // 第二步:生成结果表头 const resultHeader = [...arr1[0]]; for (let col = 0; col < arr2[0].length; col++) { if (col !== idColIndexArr2) resultHeader.push(arr2[0][col]); } // 第三步:遍历arr1合并每一行数据 const result = [resultHeader]; for (let row = 1; row < arr1.length; row++) { const currentId = arr1[row][0]; // arr1的Id固定在第一列 // 找不到匹配Id时,生成对应长度的空字符串数组 const arr2Data = arr2Map.get(currentId) || Array(arr2[0].length - 1).fill(""); const mergedRow = [...arr1[row], ...arr2Data]; result.push(mergedRow); } return result; }
使用示例
假设你已经从工作表中获取到两个数组,可通过以下方式调用并写入结果:
function testMerge() { // 从工作表获取原始数组 const sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("arr1"); const sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("arr2"); const arr1 = sheet1.getDataRange().getValues(); const arr2 = sheet2.getDataRange().getValues(); // 执行合并 const mergedArr = mergeArrays(arr1, arr2); // 将结果写入新工作表 const resultSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Result") || SpreadsheetApp.getActiveSpreadsheet().insertSheet("Result"); resultSheet.clearContents(); resultSheet.getRange(1, 1, mergedArr.length, mergedArr[0].length).setValues(mergedArr); }
代码特性
- 完全动态适配:无需提前知晓两个数组的行列数,自动适配任意维度,只要arr2表头包含"Id"即可正常工作。
- 空值兼容:无匹配Id时自动填充对应数量的空字符串,保证结果数组维度统一。
- 性能友好:用
Map存储映射关系,避免重复遍历arr2,数据量大时优势明显。
内容的提问来源于stack exchange,提问作者xyz333
相关产品推荐
相关产品推荐

