You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AppScript将Facebook API中的每个操作展平为单独列

展平Facebook API响应中的Actions字段以适配报表需求

Facebook API返回的响应会将所有操作类型合并在actions字段中,这种嵌套结构不利于报表制作。需要将每个action_type拆分为独立列,对应填充其value值,实现结构展平。

API响应示例

"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"
      }
    ]

现有代码及问题

const sheet = SpreadsheetApp.getActiveSheet();
const headers = Object.keys(data[0]);
var values = data.map(o => headers.map(h => o[h]));
sheet.getRange(sheet.getLastRow() + 1, 1, values.length, values[0].length).setValues(values);

现有代码执行后,actions字段仍以嵌套数组形式存在,控制台输出如下:

["actions", "spend", "date_start", "date_stop"]
[[[{
  action_type: "comment",
  value: "3"
}, {
  action_type: "like",
  value: "33"
}, {
  action_type: "link_click",
  value: "1531"
}, {
  action_type: "mobile_app_install",
  value: "1049"
}], "8621.03", "2017-10-28", "2017-11-26"]]

这种结果无法满足报表对扁平结构的需求,需修改代码实现actions字段的列展平。

修改后的代码实现

const sheet = SpreadsheetApp.getActiveSheet();
const data = /* 你的Facebook API响应data数组 */;

// 1. 提取所有可能的action_type作为额外表头
const allActionTypes = [...new Set(data.flatMap(item => item.actions.map(action => action.action_type)))];

// 2. 定义基础表头(排除actions)和完整表头
const baseHeaders = Object.keys(data[0]).filter(key => key !== 'actions');
const fullHeaders = [...baseHeaders, ...allActionTypes];

// 3. 处理每条数据,展平actions字段
const flattenedValues = data.map(item => {
  // 将actions转换为{action_type: value}的对象
  const actionObj = item.actions.reduce((acc, action) => {
    acc[action.action_type] = action.value;
    return acc;
  }, {});
  // 按完整表头顺序生成值数组,没有的action类型填空
  return fullHeaders.map(header => actionObj[header] || item[header] || '');
});

// 4. 写入表格(如果需要新增表头,先写入表头)
// sheet.getRange(1, 1, 1, fullHeaders.length).setValues([fullHeaders]);
sheet.getRange(sheet.getLastRow() + 1, 1, flattenedValues.length, flattenedValues[0].length).setValues(flattenedValues);

代码说明

  • 遍历所有数据收集所有出现过的action_type,确保不会遗漏任何操作类型
  • 分离基础表头和操作类型表头,合并为完整的表头列表
  • 把每条数据的actions数组转换为键值对对象,再按完整表头顺序生成对应数值数组,缺失的操作类型填充空值
  • 最后将扁平后的数据写入Google Sheet,若需要写入表头可取消注释对应代码

内容的提问来源于stack exchange,提问作者Arif Ahmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 13:05:26