告别合并单元格噩梦!WPS这两个新函数+JS自定义函数太强了
在日常工作中,我们经常会遇到带有合并单元格的表格。这些合并单元格虽然让表格看起来美观,但却给后续的数据处理和分析带来了不少麻烦。比如无法正常排序、筛选,公式填充时也会出现各种问题。 今天,我要给大家介绍几个WPS中的强大函数,特别是SCAN和REDUCE,它们能轻松解决合并单元格带来的困扰。同时,我也会分享一个更高级的解决方案——JS自定义函数,彻底解决多列合并单元格的处理难题。
一、SCAN函数:扫描生成累积结果
SCAN函数可以对数组中的每个元素进行累积计算,并返回每个中间步骤的结果。它的基本语法是:
=SCAN(初始值, 数组, LAMBDA(累加器, 当前值, 计算))
实战案例:填充合并单元格
假设我们有这样一张表格,A列存在合并单元格:
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
我们想要把A列的空单元格填充为对应的部门名称。传统方法需要定位空值、输入公式,非常繁琐。现在用SCAN函数一行代码就能搞定:
=SCAN("", A2:A6, LAMBDA(a, b, IF(b="", a, b)))
=REDUCE(初始值, 数组, LAMBDA(累加器, 当前值, 计算))
=REDUCE("", B2:B6, LAMBDA(a, b, a&"、"&b))
三、遇到瓶颈:BYCOL不能对每列应用SCAN
在实际工作中,我们经常需要处理多列的合并单元格。比如下面这个表格:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
我们需要同时填充A列和B列的空值。
很自然地,我们会想到用BYCOL函数对每一列分别应用SCAN:
=BYCOL(A2:C6, LAMBDA(col, SCAN("", col, LAMBDA(a, b, IF(b="", a, b)))))
但遗憾的是,这段公式会报错!
为什么不行?
查阅WPS官方文档发现:BYCOL函数要求LAMBDA返回标量值(单个数值、文本或逻辑值),不能返回数组。
而SCAN函数返回的是一个数组(与输入列等高的数组)。因此BYCOL无法接收SCAN的返回结果。同样的限制也存在于MAP函数——MAP也是每个元素映射成一个标量,不能映射成一个数组。
这意味着,WPS自带的函数组合无法直接对多列分别执行“填充合并单元格”这类返回数组的操作。
四、终极解决方案:JS自定义函数
当内置函数无法满足需求时,WPS的JS自定义函数功能就派上用场了。我们可以用JavaScript编写一个函数,一次性处理多列合并单元格的填充问题。
编写JS自定义函数
-
打开WPS表格,点击“开发工具”选项卡 → “JS宏”
-
在弹出的编辑器中,插入一个新模块
-
粘贴以下代码:
/*** 对多列区域分别进行向下填充(处理合并单元格)* @param {Range} range 输入区域(例如 A1:B4),可包含多行多列* @returns {Array} 填充后的二维数组*/function FILL_MERGE_COLUMNS(range) {// 获取区域的值(二维数组,行为行,列为列)let arr = range.Value2;if (!arr) return [["无数据"]];// 确保 arr 是二维数组(单行或单列时需转换)if (!Array.isArray(arr[0])) arr = [arr];const rows = arr.length;const cols = arr[0].length;// 准备结果数组(深拷贝)let result = arr.map(row => [...row]);// 对每一列单独处理for (let c = 0; c < cols; c++) {let lastValue = null; // 上一个非空值for (let r = 0; r < rows; r++) {let cellValue = result[r][c];// 判断是否为空(null、undefined、空字符串)if (cellValue !== null && cellValue !== undefined && cellValue !== "") {lastValue = cellValue;} else {// 如果是空白,继承上一个非空值result[r][c] = lastValue;}}}return result;}
-
使用自定义函数
选中一个足够大的区域(与原数据同尺寸),输入公式:
=FILL_MERGE_COLS(A2:C6)
由于WPS支持动态数组,结果会自动溢出到相邻单元格。
效果:A列和B列的所有空单元格都会被自动填充为上面最近的非空值。
为什么JS自定义函数更理想?
-
一次性处理多列:不需要为每一列单独写公式
-
逻辑清晰可控:你可以完全自定义填充规则
-
性能优秀:JS处理数组的速度远超工作表函数嵌套
-
可复用性强:保存后可以在任何工作簿中调用
-
无函数限制:完全绕过了BYCOL、MAP的返回值类型限制
五、总结与建议
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
WPS内置的SCAN、REDUCE函数配合LAMBDA,确实让很多原本复杂的操作变得简单优雅。但当遇到BYCOL、MAP无法传递数组结果的限制时,不妨打开JS宏编辑器,用几行JavaScript代码轻松解决问题。
掌握JS自定义函数,你的WPS将会如虎添翼!
小贴士:如果你经常需要处理这类问题,可以把常用的JS函数保存为个人宏工作簿,这样所有文件都能直接调用。
你学会了吗?如果有任何问题,欢迎在评论区留言交流~
夜雨聆风