Google Sheets如何列出相邻单元格为空时的对应非空单元格值
Google Sheets 空单元格相邻非空值分组罗列实现方案
以下提供两种可直接落地的实现方式,按需选择即可。
方法1:原生公式实现(无需编码,适合小数据量场景)
- 先确认数据结构:假设存在空值的分组列为A列,需要罗列的内容列为B列,数据从第2行开始(第1行为表头)
- 在结果输出列的首个单元格(如C2)输入以下公式,回车后会自动向下填充所有行的结果:
=BYROW(ARRAYFORMULA(IF(A2:A<>"",SCAN("",A2:A,LAMBDA(a,c,IF(c<>"",c,a))),)),LAMBDA(x,JOIN("、",FILTER(B:B,ARRAYFORMULA(IF(A2:A<>"",SCAN("",A2:A,LAMBDA(a,c,IF(c<>"",c,a))),))=x,B:B<>"")))) - 自定义调整说明:
- 公式里的
A2:A替换成你实际的分组列范围,B:B替换成你实际要罗列的内容列范围 - 公式里的
"、"是内容拼接的分隔符,需要用逗号分隔就换成",",需要换行分隔就换成CHAR(10) - 如果不需要把内容拼接成字符串,要按横向单元格逐个罗列,把外层
JOIN部分替换为TOROW(FILTER(...),1)即可
- 公式里的
方法2:Apps Script自定义函数实现(灵活度高,适合大数据量/复杂逻辑场景)
- 打开目标Google Sheets表格,点击顶部菜单栏「扩展程序」→「Apps Script」进入脚本编辑器
- 清空编辑器内默认生成的所有代码,粘贴以下代码:
function LIST_BY_GROUP(groupRange, contentRange, separator = "、") { const groups = groupRange.flat(); const contents = contentRange.flat(); const groupContentMap = {}; let currentGroup = ""; // 遍历所有行,给每个分组收集对应的非空内容 for (let i = 0; i < groups.length; i++) { const groupVal = groups[i]?.toString().trim(); const contentVal = contents[i]?.toString().trim(); if (groupVal) { currentGroup = groupVal; groupContentMap[currentGroup] = []; } if (currentGroup && contentVal) { groupContentMap[currentGroup].push(contentVal); } } // 按原表行顺序生成对应结果 currentGroup = ""; return groups.map(g => { const groupVal = g?.toString().trim(); if (groupVal) currentGroup = groupVal; return [currentGroup ? groupContentMap[currentGroup].join(separator) : ""]; }) }
- 点击编辑器顶部的保存按钮,给项目任意命名(比如「分组罗列工具」),首次运行按提示完成账号授权即可(个人账号脚本仅你本人可访问,无安全风险)
- 回到表格页面,在结果输出列的首个单元格输入自定义函数即可自动生成结果:
=LIST_BY_GROUP(A2:A,B2:B,"、") - 自定义调整说明:
- 第一个参数传入存在空值的分组列范围,第二个参数传入需要罗列的内容列范围
- 第三个参数传入自定义分隔符,和公式法规则一致
- 如果需要实现内容去重、加序号、按特定规则排序等效果,直接修改脚本里收集内容的逻辑即可,比如去重就把数组存成Set结构再转数组
注意:如果数据行数超过10000行,优先使用Apps Script方案,原生公式在大数据量下会出现明显的计算延迟。
内容的提问来源于stack exchange,提问作者CressyDonut
相关产品推荐
相关产品推荐

