[TOC] > Mon Apr 26 2021 14:57:41 GMT+0800 (GMT+08:00) 涉及按条件提取数据记录的需求,本质上与筛选相似,只是筛选不能将结果主动移到目标区域而已。VLOOK这类函数呢能用但不适合重复记录,为此 Excel 上出现了很多的数组函数,这类函数是很好用的,而 WPS 则貌似还没有这类函数出现,WPS JS宏可以让大家多了个临时解决方案(专业版可以用 VBA)。 我们来理一下设计思路: * 源数据,应该是一个单元格区域: * 行数 * 列数 * 起始坐标,终点坐标。 * 条件所在列——区域内偏移量(实际上可以要求提供具体全局列号,但不太人性化)。 * 条件,条件并不好设计: * 不同类型的数据,条件的设计逻辑不同。我们不能去猜用户会给我们什么样的条件,为此我们直接将条件参数设计为一个 callback `(function)` ,然后通过 eval 方法执行。 * 好处是,我们不必为条件这个不可预测的参数发愁。坏处嘛就是对使用者的编程技能有要求。 * 条件满足时要提取的内容所在的列(可以是整行——整条记录、某一列……),怎么处理设计这个逻辑: * 当符合条件时,数据所在行的行号是确定的: * 如果提供的是数字——构建单元格对象,并读取内容,最后输出到目标单元格。 * 其实,设计一个callback 是正解。 * 因为不确定,我们将它设计为数组参数,[1,2,3,5,...]或者“all”。 * 输出结果到,只需提供第一单元格即可。 因为不是原生的数组函数(我们设计这个工具其实就是一个能返回数组的函数),因此我们输出的结果需要直接写入单元格区域,当条件更换时要清空这片区域,然后接着输出新结果。这就涉及到危险操作了,一不小心可能就把用户数据给删了。因此,这个可能一遍又一遍重复清空、写入的逻辑要设计好。 * 因为没有存储机制,我们并不知道上一次输出的结果占了多大的单元格区域。在清空的时候就不好操作了。不清空又不行,新旧记录可能会混在一起。用插入单元格的做法可能会改变用户表格结构。总之,为了规避这个问题带来的后果,我们需要提前告知用户,使用这个工具时,输出结果的单元格区域内要留足空间(右侧和下方都要避开)。 * 加入存储机制,即每次输出后占用了多大空间都记录下来,作为下一次运行时清空单元格区域的依据。好是好,但这充满变数,不可取。没有这样一个地方——可以完美地保存这个数据,只能作罢…… > 确实不知道存哪里,关键是不会被删除和移位。 * 那我们只能硬着头皮硬来了,只能提示用户远离目标区域(留足空间)。