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

将表格数据导出为JSON:合并单元格取值与结构构建问题

解决Google Sheets导出指定JSON结构的问题

我来帮你搞定这两个问题,咱们一步步拆解实现:

1. 正确获取合并单元格的表头内容

要处理未知范围的合并单元格,我们需要逐个检查表头的单元格,判断是否属于合并区域,然后提取合并区域的首单元格值,同时给合并覆盖的所有列填充同一个分类值,这样后续子分类才能正确关联到所属分类。

2. 拼接成目标JSON结构

我们需要先建立表头分类(如AB1)和子分类(如A2、B2)的映射关系,再遍历表体的每一行,对应原表格的真实行号,把数据填充到对应的分类和子分类层级下。

完整代码实现

function doGet() {
  var SpreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  var Sheet = SpreadSheet.getSheets()[1];
  var FirstRow = 1;
  var FirstColumn = 1;
  var LastRow = Sheet.getLastRow();
  var LastColumn = Sheet.getLastColumn();
  var FrozenRows = Sheet.getFrozenRows();
  var FrozenColumns = Sheet.getFrozenColumns();

  // 获取表头范围(冻结行部分,排除冻结列)
  var HeadRange = Sheet.getRange(FirstRow, FirstColumn + FrozenColumns, FrozenRows, LastColumn - FrozenColumns);
  var HeadData = HeadRange.getValues();
  var headRangeCells = HeadRange.getCells(); // 获取表头的所有单元格对象,用于检查合并状态

  // 处理表头第一行的分类(含合并单元格)
  var headRow1 = [];
  for (var col = 0; col < HeadRange.getNumColumns(); col++) {
    var cell = headRangeCells[0][col];
    if (cell.isPartOfMerge()) {
      var mergeRange = cell.getMergedRanges()[0];
      var mergeColsCount = mergeRange.getNumColumns();
      var categoryValue = mergeRange.getCell(1, 1).getValue();
      // 给合并覆盖的所有列填充同一个分类值
      for (var m = 0; m < mergeColsCount; m++) {
        headRow1.push(categoryValue);
      }
      col += mergeColsCount - 1; // 跳过已处理的合并列,避免重复遍历
    } else {
      headRow1.push(cell.getValue());
    }
  }

  // 表头第二行的子分类
  var headRow2 = HeadData[1];

  // 建立分类到子分类的映射关系
  var categoryMap = {};
  for (var i = 0; i < headRow1.length; i++) {
    var category = headRow1[i];
    var subCategory = headRow2[i];
    if (!categoryMap[category]) {
      categoryMap[category] = [];
    }
    categoryMap[category].push(subCategory);
  }

  // 获取表体数据范围
  var BodyRange = Sheet.getRange(FirstRow + FrozenRows, FirstColumn + FrozenColumns, LastRow - FrozenRows, LastColumn - FrozenColumns);
  var BodyData = BodyRange.getValues();

  // 构建目标JSON结构
  var InputData = {};
  for (var j = 0; j < BodyData.length; j++) {
    var rowValues = BodyData[j];
    // 计算原表格的真实行号(冻结行之后的第一行是FrozenRows+1)
    var originalRowNum = FrozenRows + 1 + j;
    var rowObj = {};

    // 遍历每个分类,填充子分类和对应的数据值
    for (var category in categoryMap) {
      var subCats = categoryMap[category];
      var subCatObj = {};
      subCats.forEach(subCat => {
        var colIndex = headRow2.indexOf(subCat);
        if (colIndex !== -1) {
          subCatObj[subCat] = rowValues[colIndex];
        }
      });
      rowObj[category] = subCatObj;
    }

    InputData[originalRowNum] = rowObj;
  }

  // 输出JSON格式结果
  var OutputData = ContentService.createTextOutput(JSON.stringify(InputData)).setMimeType(ContentService.MimeType.JSON);
  return OutputData;
}

关键逻辑说明

  • 合并单元格处理:通过getCells()获取表头的单元格对象,逐个检查isPartOfMerge()状态,如果是合并单元格,就提取合并区域的首单元格值,并给所有合并覆盖的列填充该值,确保每个子分类都能关联到正确的父分类。
  • JSON结构构建:先通过categoryMap存储分类与子分类的对应关系,再遍历表体每一行,用原表格的真实行号作为顶级键,根据映射关系把数据填充到对应的分类和子分类层级中,完全匹配你需要的JSON结构。

内容的提问来源于stack exchange,提问作者user11802360

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 18:02:37