将表格数据导出为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
相关产品推荐
相关产品推荐

