乐于分享
好东西不私藏

告别合并单元格噩梦!WPS这两个新函数+JS自定义函数太强了

告别合并单元格噩梦!WPS这两个新函数+JS自定义函数太强了

在日常工作中,我们经常会遇到带有合并单元格的表格。这些合并单元格虽然让表格看起来美观,但却给后续的数据处理和分析带来了不少麻烦。比如无法正常排序、筛选,公式填充时也会出现各种问题。  今天,我要给大家介绍几个WPS中的强大函数,特别是SCAN和REDUCE,它们能轻松解决合并单元格带来的困扰。同时,我也会分享一个更高级的解决方案——JS自定义函数,彻底解决多列合并单元格的处理难题。

一、SCAN函数:扫描生成累积结果

SCAN函数可以对数组中的每个元素进行累积计算,并返回每个中间步骤的结果。它的基本语法是:

=SCAN(初始值, 数组, LAMBDA(累加器, 当前值, 计算))

实战案例:填充合并单元格

假设我们有这样一张表格,A列存在合并单元格:

部门
姓名
销售部
张三
李四
王五
技术部
赵六
钱七

我们想要把A列的空单元格填充为对应的部门名称。传统方法需要定位空值、输入公式,非常繁琐。现在用SCAN函数一行代码就能搞定:

=SCAN("", A2:A6, LAMBDA(a, b, IF(b="", a, b)))
原理说明:LAMBDA中的a代表上一次计算的结果(累加器),b代表当前单元格的值。如果当前单元格为空,就返回上一次的值;否则返回当前值。这样就能把上面的非空值“继承”下来。
二、REDUCE函数:归约为单个结果
与SCAN不同,REDUCE只返回最终的累积结果,而不是每一步的中间值。语法类似: 
=REDUCE(初始值, 数组, LAMBDA(累加器, 当前值, 计算))
 实战案例:合并文本内容
将某列的所有文本用顿号连接:(也可以用textjoin函数)   
=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自定义函数

  1. 打开WPS表格,点击“开发工具”选项卡 → “JS宏”

  2. 在弹出的编辑器中,插入一个新模块

  3. 粘贴以下代码:

/** * 对多列区域分别进行向下填充(处理合并单元格) * @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自定义函数更理想?

  1. 一次性处理多列:不需要为每一列单独写公式

  2. 逻辑清晰可控:你可以完全自定义填充规则

  3. 性能优秀:JS处理数组的速度远超工作表函数嵌套

  4. 可复用性强:保存后可以在任何工作簿中调用

  5. 无函数限制:完全绕过了BYCOL、MAP的返回值类型限制

五、总结与建议

场景
推荐方案
单列填充合并单元格
SCAN函数
单列归约计算
REDUCE函数
多列填充合并单元格
JS自定义函数
其他复杂的逐列数组操作
JS自定义函数

WPS内置的SCAN、REDUCE函数配合LAMBDA,确实让很多原本复杂的操作变得简单优雅。但当遇到BYCOL、MAP无法传递数组结果的限制时,不妨打开JS宏编辑器,用几行JavaScript代码轻松解决问题。

掌握JS自定义函数,你的WPS将会如虎添翼!


小贴士:如果你经常需要处理这类问题,可以把常用的JS函数保存为个人宏工作簿,这样所有文件都能直接调用。

你学会了吗?如果有任何问题,欢迎在评论区留言交流~