解析对象数组至Google表格时,如何展开affiliations数组?
解决Google表格解析对象数组时展开affiliations子字段的问题
核心思路
针对affiliations是数组嵌套对象的结构,我们需要手动提取其内部的子字段(如city/city_id/country),将其作为独立列与其他字段合并,再写入表格。以下是具体实现方案:
修改后的代码示例
function parseDataToSheet() { // 替换为你的测试数据 const testData = [ { "id": "1", "name": "Einarr", "affiliations": [ { "city": "Oslo", "city_id": "NO-03", "country": "Norway" } ], "corresponding": true, "email": "einarr@example.com" }, { "id": "2", "name": "Anna", "affiliations": [ { "city": "Stockholm", "city_id": "SE-01", "country": "Sweden" } ], "corresponding": false, "email": "anna@example.com" } ]; // 1. 生成完整表头:基础字段 + 带前缀的affiliations子字段 const baseHeaders = Object.keys(testData[0]).filter(key => key !== 'affiliations'); const affiliationSubHeaders = Object.keys(testData[0].affiliations[0]).map(subKey => `affiliation_${subKey}`); const allHeaders = [...baseHeaders, ...affiliationSubHeaders]; // 2. 处理每行数据,展开affiliations子字段 const rows = testData.map(item => { // 提取基础字段值 const baseValues = baseHeaders.map(header => item[header]); // 提取第一个关联机构的子字段值(若有多个机构可调整为循环生成多行) const targetAffiliation = item.affiliations[0] || {}; const affiliationValues = affiliationSubHeaders.map(subHeader => { const subKey = subHeader.replace('affiliation_', ''); return targetAffiliation[subKey] || ''; }); // 合并所有字段值 return [...baseValues, ...affiliationValues]; }); // 3. 写入Google表格 const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); sheet.clear(); // 可选:清空原有内容 sheet.getRange(1, 1, 1, allHeaders.length).setValues([allHeaders]); sheet.getRange(2, 1, rows.length, rows[0].length).setValues(rows); }
关键逻辑说明
- 表头处理:过滤掉原数据中的
affiliations字段,为其子字段添加affiliation_前缀(避免与其他字段重名),合并成最终表头。 - 数据展开:对每个数据项,先提取基础字段值,再取出
affiliations数组的第一个对象(若需支持多机构,可修改为遍历数组生成多行数据,基础字段会重复显示),提取子字段值后与基础值合并。 - 表格写入:先写入表头,再批量写入处理后的数据行,保证格式对齐。
多关联机构场景适配
如果一个对象有多个affiliations条目,需要每个机构单独占一行,可将数据处理部分修改为:
const rows = []; testData.forEach(item => { const baseValues = baseHeaders.map(header => item[header]); // 遍历每个关联机构,生成独立行 item.affiliations.forEach(affiliation => { const affiliationValues = affiliationSubHeaders.map(subHeader => { const subKey = subHeader.replace('affiliation_', ''); return affiliation[subKey] || ''; }); rows.push([...baseValues, ...affiliationValues]); }); });
内容的提问来源于stack exchange,提问作者Einarr
相关产品推荐
相关产品推荐

