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

基于User Count扩展表格行并拆分节目列值:Google Apps Script/PostgreSQL实现

实现方案:按用户数拆分节目行

Google Apps Script(Google Sheets 适用)

逻辑说明

遍历源数据表的每一行,根据User Count的数值生成对应数量的新行:

  • 保留原行的ID和Household字段
  • 新行的User Count固定设为1
  • 依次将Show 1到Show 4的节目值分配到对应新行,每行仅保留一个节目值,其余Show列为空

代码实现

function splitUserRows() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const data = sheet.getDataRange().getValues();
  const header = data[0];
  const result = [header]; // 保留表头

  // 遍历源数据行(跳过表头)
  for (let i = 1; i < data.length; i++) {
    const row = data[i];
    const id = row[0];
    const household = row[1];
    const userCount = row[2];
    const shows = row.slice(3, 7); // 获取Show 1到Show 4的值

    // 生成对应数量的新行
    for (let j = 0; j < userCount; j++) {
      const newRow = [id, household, 1];
      // 初始化所有Show列为空
      for (let k = 0; k < 4; k++) {
        newRow.push('');
      }
      // 将当前节目值放入对应Show列
      newRow[3 + j] = shows[j];
      result.push(newRow);
    }
  }

  // 清空原表并写入结果(可根据需求调整写入位置)
  sheet.clearContents();
  sheet.getRange(1, 1, result.length, result[0].length).setValues(result);
}

PostgreSQL 实现

逻辑说明

使用generate_series生成对应数量的行号,结合CASE语句将每个Show列的值分配到对应行,最终生成符合要求的拆分结果。

代码实现

假设源表名为household_shows,执行以下SQL查询即可得到目标结果:

SELECT
  id,
  household,
  1 AS "User Count",
  CASE WHEN seq = 1 THEN "Show 1" ELSE '' END AS "Show 1",
  CASE WHEN seq = 2 THEN "Show 2" ELSE '' END AS "Show 2",
  CASE WHEN seq = 3 THEN "Show 3" ELSE '' END AS "Show 3",
  CASE WHEN seq = 4 THEN "Show 4" ELSE '' END AS "Show 4"
FROM household_shows
CROSS JOIN generate_series(1, "User Count") AS seq
ORDER BY id, seq;

说明

  • CROSS JOIN generate_series(1, "User Count")会根据每行的User Count生成对应数量的行,seq作为行序号标记
  • CASE语句根据seq的值,将对应Show列的内容填充到新行中,其余Show列设为空字符串
  • 最终结果按ID和行序号排序,保证节目顺序与源表一致

内容的提问来源于stack exchange,提问作者Jose Buelto Perez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:00:59