You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何将带多层表头的Google Sheets表格导出为指定结构的JSON格式?

我来帮你搞定这个多层表头的Google Sheets转JSON的问题——原脚本确实只支持单层表头,咱们调整一下逻辑就能适配你的需求。先理清楚核心细节,再给你修改后的代码和关键说明:


先纠正一个小问题:你的示例JSON有无效重复键

你给出的示例里存在重复的EditionBook键,这在JSON规范里是不允许的(解析器会自动覆盖后面的重复键),所以咱们调整成每个版本/书籍组合对应一个独立的JSON对象,这样既符合规范,也更方便其他程序导入。比如正确的结构:

{"School of Magic":"Necromancy", "Spell":"Abi-Dalzim's Horrid Wilting", "Edition":"4th", "Book":"Exp2", "Exp2":"Yes"}
{"School of Magic":"Necromancy", "Spell":"Abi-Dalzim's Horrid Wilting", "Edition":"5th", "Book":"Elemental Evil Player's Companion", "Elemental Evil Player's Companion":"Yes"}

修改后的完整脚本

这个脚本专门适配你的多层表头结构,兼容合并单元格,只导出有效数据:

function exportJSON() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var data = sheet.getDataRange().getValues();
  
  // 校验表头行数是否足够
  if (data.length < 2) {
    SpreadsheetApp.getUi().alert("表格数据不足,需要至少两行顶部表头");
    return;
  }
  
  // 提取顶部多层表头:第一行=版本,第二行=书籍
  var editionRow = data[0];
  var bookRow = data[1];
  
  // 配置行标识列索引(A列=0,B列=1,以此类推)
  var schoolCol = 0;   // 魔法学派所在列
  var spellCol = 1;    // 法术名称所在列
  
  var jsonArray = [];
  var lastSchool = ""; // 处理魔法学派列的合并单元格问题
  
  // 从第三行开始遍历数据行(前两行是表头)
  for (var i = 2; i < data.length; i++) {
    var row = data[i];
    // 如果当前行魔法学派为空,继承上一行的学派(合并单元格场景)
    var school = row[schoolCol] || lastSchool;
    lastSchool = school;
    var spell = row[spellCol];
    
    // 跳过空的法术行
    if (!spell) continue;
    
    // 遍历所有数据列,只处理值为"Yes"的单元格
    for (var j = 2; j < row.length; j++) {
      var cellValue = row[j];
      if (cellValue !== "Yes") continue;
      
      var edition = editionRow[j];
      var book = bookRow[j];
      
      // 生成符合需求的JSON对象
      var entry = {
        "School of Magic": school,
        "Spell": spell,
        "Edition": edition,
        "Book": book
      };
      // 按照你的需求添加书籍名称作为键,值为"Yes"
      entry[book] = "Yes";
      
      jsonArray.push(entry);
    }
  }
  
  // 生成每行一个JSON对象的输出格式(适合导入)
  var jsonOutput = jsonArray.map(item => JSON.stringify(item)).join("\n");
  
  // 提供输出选项:保存到Drive或直接查看
  var ui = SpreadsheetApp.getUi();
  var response = ui.prompt("JSON导出", "选择操作:", ui.ButtonSet.OK_CANCEL);
  
  if (response.getSelectedButton() === ui.Button.OK) {
    var file = DriveApp.createFile("Spell_Export.json", jsonOutput, MimeType.JSON);
    ui.alert("导出成功!文件已保存到Google Drive");
  } else {
    ui.alert("JSON内容:\n" + jsonOutput);
  }
}

关键修改说明

  1. 多层表头解析:专门提取顶部两行作为版本和书籍的表头,每个数据列都能对应到唯一的版本+书籍组合,精准匹配单元格内容。
  2. 合并单元格兼容:通过lastSchool变量继承上一行的魔法学派名称,解决同一学派合并单元格导致的空值问题。
  3. 精准数据过滤:只处理值为Yes的单元格,避免导出空数据或无效记录。
  4. 灵活输出:运行后可选择直接查看结果,或保存成JSON文件到Google Drive,方便后续导入其他程序。

使用步骤

  1. 打开你的Google Sheets表格,点击「扩展」→「Apps脚本」
  2. 删除默认的myFunction代码,粘贴上面的完整脚本
  3. 点击保存按钮,给脚本起个名字(比如SpellJSONExporter
  4. 点击运行按钮,第一次运行需要授权(按照提示允许脚本访问你的表格和Drive)
  5. 按照弹窗提示选择查看结果或保存文件即可

适配你的真实数据

如果你的真实表格表头位置不同,只需要修改几个变量:

  • 调整schoolColspellCol的数值,对应魔法学派和法术名称的列索引
  • 如果版本表头在第3行,就把editionRow = data[2](数组索引从0开始)

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

火山引擎 最新活动