Google Sheet App Script如何将SheetA列A的JSON解析后写入SheetB
工作表声明相关问题解答
- 你写的按索引获取两个工作表的写法逻辑正确,仅注释有误,
sheet2对应注释应为// 获取第二个工作表,更稳妥的写法是按工作表名称获取,避免后续调整工作表顺序导致引用错误:
var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheetA = ss.getSheetByName("SheetA"); // 读取数据源表 var sheetB = ss.getSheetByName("SheetB"); // 写入目标表
- 两种实现方案均可行,适用场景不同:
- 自定义函数方案:适合数据量较小的场景,无需手动运行脚本,数据更新自动刷新。注意你原来的写法有两处问题:一是调用时应该传入SheetA的单元格而不是SheetB的列,二是函数内部需要先解析传入的JSON字符串,且不存在未定义的
i变量,修正后的示例如下:
调用时在SheetB的目标单元格输入function parseJSON(jsonStr) { if (!jsonStr) return []; try { const parsed = JSON.parse(jsonStr); // 提取JSON外层数字键对应的菜品对象 const dishObj = Object.values(parsed)[0]; // 按顺序返回对应字段值,可根据需求调整字段 return [dishObj.dish_name, dishObj.dish_price, dishObj.dish_quantity, dishObj.dish_size_name, dishObj.dish_size_price, dishObj.dish_addon_name, dishObj.dish_addon_price, dishObj.dish_variation_name, dishObj.dish_variation_price]; } catch(e) { return "JSON解析错误"; } }=parseJSON(SheetA!A1),下拉即可批量应用。
2. 全量脚本方案:适合数据量较大(数百行以上)的场景,执行效率更高,不会触发自定义函数的配额限制,写入时直接调用sheetB.appendRow()即可。 - 自定义函数方案:适合数据量较小的场景,无需手动运行脚本,数据更新自动刷新。注意你原来的写法有两处问题:一是调用时应该传入SheetA的单元格而不是SheetB的列,二是函数内部需要先解析传入的JSON字符串,且不存在未定义的
表头与数据处理相关问题解答
- 表头两种实现方式均支持:
- 提前声明表头数组:适合JSON字段固定的场景,稳定性更高,不会因个别JSON缺字段导致表头错乱,示例写法:
const headers = ["dish_name","dish_price","dish_quantity","dish_size_name","dish_size_price","dish_addon_name","dish_addon_price","dish_variation_name","dish_variation_price"] - 从JSON的key动态提取:适合字段不固定的场景,直接取第一个合法JSON对象的key作为表头即可,写法为
const headers = Object.keys(dishObj)
- 提前声明表头数组:适合JSON字段固定的场景,稳定性更高,不会因个别JSON缺字段导致表头错乱,示例写法:
- Apps Script原生支持forEach循环遍历JSON内容,本身就是JavaScript运行环境,批量处理全量数据的示例脚本如下:
function batchParseJSON() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheetA = ss.getSheetByName("SheetA"); const sheetB = ss.getSheetByName("SheetB"); // 提前声明固定表头 const headers = ["dish_name","dish_price","dish_quantity","dish_size_name","dish_size_price","dish_addon_name","dish_addon_price","dish_variation_name","dish_variation_price"]; // 清空目标表原有内容,写入表头 sheetB.clearContents(); sheetB.appendRow(headers); // 读取SheetA A列所有非空内容 const jsonRows = sheetA.getRange(1, 1, sheetA.getLastRow(), 1).getValues(); // 遍历所有JSON行 jsonRows.forEach(row => { const jsonStr = row[0]; if (!jsonStr) return; try { const parsed = JSON.parse(jsonStr); const dishObj = Object.values(parsed)[0]; // 按表头顺序组装行数据,缺字段自动填空值 const rowData = headers.map(header => dishObj[header] ?? ""); sheetB.appendRow(rowData); } catch(e) { sheetB.appendRow(["JSON解析错误", ...new Array(headers.length - 1).fill("")]); } }) }
- 若你JSON外层的数字键(如示例中的
55)为需要保留的订单ID等字段,直接将该字段加入表头数组,组装行数据时加上Object.keys(parsed)[0]即可。
内容的提问来源于stack exchange,提问作者user2395639
相关产品推荐
相关产品推荐

