如何编写公式拆分结构化数据生成ASIN-日期-时段-排名汇总表?
解决方案(Google Sheets)
针对你提到的宽表转长表需求,这里提供基于ARRAYFORMULA、FLATTEN和SPLIT的可行公式,直接生成目标四列数据:
基础版公式(适用于所有单元格均为“早排名,晚排名”格式)
=ARRAYFORMULA( LET( asins, A2:A, // 提取所有ASIN数据(跳过表头) dates, B1:Z1, // 提取所有日期表头 ranks, B2:Z, // 提取所有排名数据区域 // 展开ASIN和日期,仅保留有排名的行 expanded_asins, FLATTEN(IF(ranks<>"", asins, "")), expanded_dates, FLATTEN(IF(ranks<>"", dates, "")), // 拆分排名并展开 split_ranks, SPLIT(FLATTEN(ranks), ","), // 生成对应早/晚时间标签并展开 times, FLATTEN(IF(ranks<>"", "Morning"&"|"&"Evening", "")), expanded_times, SPLIT(FLATTEN(times), "|"), // 过滤空排名行,输出最终四列 FILTER( {expanded_asins, expanded_dates, expanded_times, split_ranks}, split_ranks<>"" ) ) )
增强版公式(兼容仅含单排名的单元格)
如果存在单元格只有早排名或只有晚排名(无逗号分隔),可以用以下公式自动补全格式,避免时间标签错位:
=ARRAYFORMULA( LET( asins, A2:A, dates, B1:Z1, ranks, B2:Z, // 为无逗号的单元格自动补全逗号,确保拆分后有两个元素 fixed_ranks, IF(ranks<>"", IF(NOT(REGEXMATCH(ranks, ",")), ranks&",", ranks), ""), expanded_asins, FLATTEN(IF(fixed_ranks<>"", asins, "")), expanded_dates, FLATTEN(IF(fixed_ranks<>"", dates, "")), split_ranks, SPLIT(FLATTEN(fixed_ranks), ","), times, FLATTEN(IF(fixed_ranks<>"", "Morning"&"|"&"Evening", "")), expanded_times, SPLIT(FLATTEN(times), "|"), FILTER( {expanded_asins, expanded_dates, expanded_times, split_ranks}, split_ranks<>"" ) ) )
使用说明
- 调整公式中的区域范围(
A2:A、B1:Z1、B2:Z)匹配你的实际数据; - 公式会自动跳过空的排名单元格,仅保留有效数据行;
- 输出结果的四列依次为:ASIN、Date、Time(MorningOrEvening)、Rank。
内容的提问来源于stack exchange,提问作者user20777937
相关产品推荐
相关产品推荐

