如何展平Facebook广告API嵌套数组 适配Data Studio连接器开发
Facebook广告API Campaign数据拍平实现方案(适配Google Apps Script/Data Studio)
需求说明
- 适配Google Data Studio连接器开发场景,处理Facebook广告API返回的JSON格式广告系列数据
- 原始数据结构:每个campaign对象包含
campaign_name、cpm、spend、impressions等顶层基础字段,同时嵌套actions数组;数组内每个元素为键值对结构,存储action_type和对应的转化value - 转换目标:将
actions数组内的每一组转化类型映射为campaign对象的顶层平级字段,action_type作为字段名,对应value作为字段值,与原有基础字段保持同级,满足GDS的字段读取规则
核心实现
标准ES6+写法(支持新版GAS运行时)
使用reduce的正确逻辑:先拷贝所有原有基础字段作为reduce的初始值,再遍历actions数组逐个挂载转化字段,全程不修改原始API返回数据,避免副作用。
/** * 单条campaign数据拍平处理 * @param {Object} rawCampaign Facebook API返回的原始campaign对象 * @returns {Object} 平级结构的campaign对象 */ function flattenCampaignActions(rawCampaign) { // 提取actions数组,剩余字段为基础属性,做空值兜底 const { actions = [], ...baseFields } = rawCampaign; // 遍历actions数组,将转化字段挂载到基础属性对象上 return actions.reduce((result, action) => { // 跳过字段缺失的异常数据 if (action?.action_type && action.value !== undefined) { result[action.action_type] = action.value; } return result; }, { ...baseFields }); // 初始值传入拷贝后的基础字段,保证原有属性不丢失 }
老 runtime 兼容写法(无ES6+语法依赖)
如果使用的GAS运行时不支持解构、扩展运算符、可选链等特性,可使用全ES5兼容写法:
function flattenCampaignActions(rawCampaign) { var result = {}; var key; // 先拷贝所有非actions的基础字段 for (key in rawCampaign) { if (rawCampaign.hasOwnProperty(key) && key !== 'actions') { result[key] = rawCampaign[key]; } } // 兜底处理无actions字段的情况 var actions = rawCampaign.actions || []; var i, actionItem; for (i = 0; i < actions.length; i++) { actionItem = actions[i]; if (actionItem.action_type && actionItem.value !== undefined) { result[actionItem.action_type] = actionItem.value; } } return result; }
批量处理逻辑
针对API返回的整页campaign列表,可直接通过map批量转换:
function processCampaignList(apiResponse) { var rawList = apiResponse.data || []; return rawList.map(flattenCampaignActions); }
常见reduce写法错误说明
之前实现不符合预期通常是以下问题导致:
- 未给
reduce传入初始值,导致第一次迭代的累加器为actions数组的第一个元素,直接丢失所有campaign基础字段 - 迭代时直接修改原始campaign对象,产生数据污染,影响后续其他逻辑处理
- 未做空值兜底,当某条campaign无actions字段时直接抛出遍历错误
- 未做异常字段判断,遇到action_type/value缺失的脏数据时导致字段映射异常
转换效果示例
原始输入结构:
const rawData = { campaign_name: "618大促投放", cpm: 15.2, spend: 3280.5, clicks: 4120, actions: [ {action_type: "link_click", value: 3980}, {action_type: "add_to_cart", value: 562}, {action_type: "purchase", value: 113}, {action_type: "lead_form_submit", value: 189} ] }
转换后输出结构(完全平级,可直接供GDS识别为字段):
{ campaign_name: "618大促投放", cpm: 15.2, spend: 3280.5, clicks: 4120, link_click: 3980, add_to_cart: 562, purchase: 113, lead_form_submit: 189 }
内容的提问来源于stack exchange,提问作者Md Shamsuzzaman
相关产品推荐
相关产品推荐

