如何将带多层表头的Google Sheets表格导出为指定结构的JSON格式?
我来帮你搞定这个多层表头的Google Sheets转JSON的问题——原脚本确实只支持单层表头,咱们调整一下逻辑就能适配你的需求。先理清楚核心细节,再给你修改后的代码和关键说明:
先纠正一个小问题:你的示例JSON有无效重复键
你给出的示例里存在重复的Edition和Book键,这在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); } }
关键修改说明
- 多层表头解析:专门提取顶部两行作为版本和书籍的表头,每个数据列都能对应到唯一的版本+书籍组合,精准匹配单元格内容。
- 合并单元格兼容:通过
lastSchool变量继承上一行的魔法学派名称,解决同一学派合并单元格导致的空值问题。 - 精准数据过滤:只处理值为
Yes的单元格,避免导出空数据或无效记录。 - 灵活输出:运行后可选择直接查看结果,或保存成JSON文件到Google Drive,方便后续导入其他程序。
使用步骤
- 打开你的Google Sheets表格,点击「扩展」→「Apps脚本」
- 删除默认的
myFunction代码,粘贴上面的完整脚本 - 点击保存按钮,给脚本起个名字(比如
SpellJSONExporter) - 点击运行按钮,第一次运行需要授权(按照提示允许脚本访问你的表格和Drive)
- 按照弹窗提示选择查看结果或保存文件即可
适配你的真实数据
如果你的真实表格表头位置不同,只需要修改几个变量:
- 调整
schoolCol和spellCol的数值,对应魔法学派和法术名称的列索引 - 如果版本表头在第3行,就把
editionRow = data[2](数组索引从0开始)
内容的提问来源于stack exchange,提问作者EmptySet




