You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:48:37