使用JavaScript实现动态数组扁平化并适配Google Sheets数据导入
动态提取API数据字段并导入Google Sheets
需求说明
需要将API返回的对象键提取为表头数组、值提取为数据行数组,用于导入Google Sheets;同时实现动态适配,当API返回新增字段时,无需修改代码即可自动映射表头与对应值。
API响应示例
// API响应示例 var data = [ { "actions": [ { "action_type": "comment", "value": "3" }, { "action_type": "like", "value": "33" }, { "action_type": "link_click", "value": "1531" }, { "action_type": "mobile_app_install", "value": "1049" } ], "spend": "8621.03", "date_start": "2017-10-28", "date_stop": "2017-11-26" // 若API新增字段,比如"campaign_id": "12345",代码需自动处理 } ];
现有代码的问题
现有代码通过硬编码指定顶层字段(spend/date_start/date_stop),无法自动识别API新增的顶层字段;同时仅取第一个扁平化对象的键作为表头,若不同数据项存在不同的action_type,会导致部分表头丢失。
动态解决方案代码
function importToGoogleSheets() { const sheet = SpreadsheetApp.getActiveSheet(); // 假设data为API返回的原始数据数组 var data = [/* API响应数据 */]; // 1. 扁平化每个数据项:合并顶层字段与actions中的键值对 const flattenedData = data.map(item => { // 复制所有顶层字段(动态适配新增字段) const flattened = { ...item }; // 删除原始actions字段,避免保留冗余数据 delete flattened.actions; // 将actions中的每个action_type转为独立字段 item.actions.forEach(action => { flattened[action.action_type] = action.value; }); return flattened; }); // 2. 收集所有唯一表头:遍历所有扁平化对象,确保不遗漏任何字段 const allHeaders = [...new Set(flattenedData.flatMap(item => Object.keys(item)))]; // 3. 生成对应表头顺序的数据行,缺失字段填充空字符串 const dataRows = flattenedData.map(item => { return allHeaders.map(header => item[header] || ''); }); // 4. 写入Google Sheets const nextRow = sheet.getLastRow() + 1; // 写入表头 sheet.getRange(nextRow, 1, 1, allHeaders.length).setValues([allHeaders]); // 写入数据行 sheet.getRange(nextRow + 1, 1, dataRows.length, dataRows[0].length).setValues(dataRows); }
代码关键改进点
- 动态扁平化数据:使用
{ ...item }复制所有顶层字段,无需硬编码,API新增字段会自动被包含;同时将actions中的每个action_type转为独立字段。 - 全量收集表头:通过遍历所有扁平化对象的键并去重,确保所有可能的字段(包括新增字段、不同数据项的不同
action_type)都被作为表头。 - 适配缺失字段:生成数据行时,若某个字段在数据项中不存在,自动填充空字符串,避免导入时出现数据错位。
内容的提问来源于stack exchange,提问作者Arif Ahmed
相关产品推荐
相关产品推荐

