ONLYOFFICE升级到7.4版本后,在其表格编辑器中新增了一些公式函数:SEQUENCE、XMATCH、EXPAND、FILTER、ARRAYTOTEXT和SORT,大大加强了对矩阵、数组的操作处理能力。这一组函数公式,在微软的Excel里面是专属于Office365和OfficeOnline版本的,也就是说那些使用破解单机版微软Office的使用者是用不了这些函数公式的,免费使用这些函数公式,只有使用ONLYOFFICE才可以。
一张图极简介绍使用方法
入口
首先看看在表格编辑器里面哪里找到这些函数。Sequence公式函数位于数学和三角学
分类之中:
arraytotext公式函数位于文字和数据
分类之中:
其它新增的的函数,XMATCH、EXPAND、FILTER和SORT,都在查找和参考分类
之中:
从这个入口开始使用函数的好处就是,可以弹出一个对话框向导,简单提示各个参数的数据类型、意义:
用熟练了之后就可以自己直接在公式栏手写公式了。另外,Office类软件的表格编辑器中的各种函数公式的名称拼写都不区分大小写。
关于数组矩阵
这里我不从严区分名词概念,究竟是叫做数组,还是叫做矩阵,还是叫做对象,我搜索到网上管这种东西的称谓五花八门,反正只要你们知道这是指表格里面划定的某一行几个数或者某一列几个数或者某个几行乘以几列的一片数字,就够了。
如图所示,这里有和微软的微小差异,微软的office里面叫做动态数组,有自动溢出功能,细节这里略去,而ONLYOFFICE里面,和WPS的操作类似,是用鼠标选择矩阵操作公式所要填充影响的矩阵区域后,在其公式输入框中输入公式,然后按键盘快捷键ctrl+shift+enter
将数据生成填入,如果手选矩阵小于公式函数内容的尺寸,就会截断内容:
该矩阵截断了右两列和下三行。反之,如果手选矩阵大于公式函数内容的尺寸,就会自动用#N/A
补全矩阵:
因此使用者需要自己选择准确操作的区域。
序列生成函数sequence
上面已经展示了sequence函数的简单用法了,这里复习一下上一期文章在表格文件里面绘制的正七边形
并且还附带计算了一下七等分圆周的角度数给标注上去了,这里就用到了新增的sequence函数。
这个函数公式作用是制作生成一个序列数组矩阵。
语法
sequence([行数], [列数], [起始值], [步长值])
参数 | 意义 |
---|---|
行数 | 要生成返回的矩阵的行数,如果省略,自动填充所选择的矩阵的行数 |
列数 | 要生成返回的矩阵的列数,如果省略,自动填充所选择的矩阵的列数 |
起始值 | 序列的起始值,如果省略,序列将从1开始 |
步长值 | 系列中每个数的递增值,如果省略,序列每次将增加1,设为负数则可以递减 |
举例
参数语法中方括号[]括起来的参数是非必需的可选的参数,可以省略,但是不能省略其后的逗号,例如下图省略了所有四个参数的写法:
无论是微软官网手册还是谷某官网手册里该函数第一个参数不可省略,而我在ONLYOFFICE中亲测所有四个参数都可以省略。微软和谷某的官网手册的页面地址放在文末的参考文献中,欢迎自取。ONLYOFFICE的各种函数公式的使用细节,几乎都可以去谷某和微软的Office官网手册查找帮助学习,非常标准非常方便,但是这里仅仅推荐阅读谷某和微软的帮助手册的英文页面版本,她俩的中文页面版本都是机器翻译,惨不忍睹。
更进一步深入扩展使用数组类函数,可以在其参数内使用数学公式,也可以把所生成的序列矩阵作为参数传递给在外面再套一层公式,比如上面的正七边形示例。
再举一例,使用sequence绘制日历,则周一到周日可以自动填充,公式为
=TEXT(SEQUENCE(1,7,"2023/6/26",1),"ddd")
日矩阵数组的自动填充公式为:
=SEQUENCE(6,7,"2023/6/26",1)
借助于index函数可以从已有的数组矩阵里面选择抽取需要的数据够成新的矩阵,比如把全班同学按照学号的单双号来划分为红蓝两队来做军事对抗演习:
序列查找匹配函数xmatch
XMATCH会返回与指定值相匹配的项在数组或范围中的相对位置,在数组或单元格区域搜索指定项,然后返回该项的相对位置。
语法
XMATCH(查找内容, 查找范围, [匹配模式], [搜索模式])
参数 | 意义 |
---|---|
查找内容 | 要搜索的值,例如,42、"Cats" 或 B24 |
查找范围 | 要搜索的范围,此范围必须为单行或单列 |
匹配模式 | 查找内容匹配的方式:0为默认值表示完全匹配,1表示查找等于或大于查找值的最小值,-1则反之,2位通配符方式匹配 |
搜索模式 | 搜索查询范围的方式:1位默认值表示从前向后搜索,-1表示从后向前搜索,2表示二进制搜索,需要先将范围按升序排序,-2则反之 |
举例
参考文献中微软、谷某帮助页面所举的例子这里就不再重复展示了。这里我从实际出发,xmatch函数经常配合index函数来从大数据表格中精确取回某一行某一格子的数据,就拿自己先前川普模拟器的模拟交易数据记录表格里做数据分析
最终效果就是用多个格子拼合成一句话,想查看别的物业的销售简况,只需要填写C列的这一个格子里的地产名,就可以自动取得更新后面的这些数据。
税前销售价格一栏的公式为:
=INDEX(Sheet1!J:J,XMATCH(C2,Sheet1!G:G))
其中引用到的第一张表,如下图所示
xmatch函数从G列查找地产名为这家单位的,如上图所示,有两行出现,该函数默认返回搜索到的第一条命中记录也就是第229行,用这个行号来继续在J列查找到税前销售价格取回值来。类似的,成交价一栏的公式为:
=INDEX(Sheet1!L:L,XMATCH(C2,Sheet1!G:G,,-1))
与上一条公式非常类似,区别在于这里的xmatch函数的第三个参数用,逗号省略,引入了第四个参数-1,从后向前搜索,从而搜索到上图中的该次销售的成交记录行在第234行,从而进一步取到其L列的成交价数值。类似的,成交溢价收入一栏的公式为:
=INDEX(Sheet1!M:M,XMATCH(C2,Sheet1!G:G,,-1))
类似的,从保密成绩表中翻译为行业黑话的公式,这里甚至查询嵌套了查询:
=INDEX(I3:L3,XMATCH(INDEX(B2:B12,XMATCH(D2,A2:A12)),I2:L2,-1))
矩阵数组填充扩展函数EXPAND
可以将数组展开或者填充到指定的行或列的尺寸
语法
Expand(矩阵对象, [行数], [列数], [要填充的值])
参数 | 意义 |
---|---|
矩阵对象 | 要展开的数组矩阵对象 |
行数 | 扩展到多少行,省略则为原始矩阵行数 |
列数 | 扩展到多少列,省略则为原始矩阵列数 |
要填充的值 | 省略则填充#N/A |
举例
这个函数的作用,我用来给缺零的序列补零用,比如:
序列删选函数filter
基于定义的条件,返回过滤后的源范围版本,筛选一系列数据,其中仅包含满足指定条件的行和列
语法
FILTER(范围,条件, [空时返回值])
参数 | 意义 |
---|---|
范围 | 要筛选的数组或区域 |
条件 | 布尔值数组,其高度或宽度与数组相同,与范围的首行或首列对应的一行或一列,其中包含的是true或false值或得出true或false值的数组公式 |
空时返回值 | 所含数组中的所有值都为空(筛选器不返回任何内容)时返回的值 |
举例
还是用上文提到的川普模拟器举例:
我想查找这一段时期内的卖出有亏损的交易,就如下图所示,从M列成交溢价收入项目查找小于零的负数,就是亏损的,返回对应该次交易行数的G列地块名称:
公式如下
=FILTER(Sheet1!G229:G242,Sheet1!M229:M242<0)
第二个参数可以多个条件与或操作,例如上面构造的虚拟成绩表中统计班级考试里面优良可差各有哪些同学:
=FILTER(A2:A12,(J2<B2:B12)*(B2:B12<I2))
用星号*连接两个序列判断式执行与的运算如上图所示;
用加号+连接两个序列判断式执行或的运算
=FILTER(A2:A12,(J2<B2:B12)+(B2:B12<I2))
判断式可以是等于=、小于<、大于>,在外层套一个NOT()执行非运算或者不等于不小于不大于
=FILTER(A2:A12,not(B2:B12<I2))
序列转字符串函数arraytotext
返回任意指定区域内的文本值的数组。 它传递不变的文本值,并将非文本值转换为文本。
语法
arraytotext(序列, [格式])
参数 | 意义 |
---|---|
序列 | 要返回为文本的数组 |
格式 | 返回的数据的格式,默认为0,易于阅读的简明格式;1则包含转义字符和行定界符的严格格式。 |
举例
我实在是想不出这个函数有什么实用有意义的用处,只想到可以用来群发广告邮件,比如表中记录了很多目标邮件地址,使用该函数把这些邮箱地址拼接成一整行字符串:
=ARRAYTOTEXT(L2:L6)
然后在Office里面ctrl+c复制这个群发格子,打开浏览器,登录自己邮箱,撰写邮件,在发送目标地址栏ctrl+v粘贴字符串,就可以直接自动把这多个人的邮件一次粘贴进去了,非常方便:
配合同样新推出的函数sequence,可以在一个格子里面生成有序的序列,例如这里生成了一个三行五列序列数组:
=ARRAYTOTEXT(SEQUENCE(3,5,1,1),1)
这里ARRAYTOTEXT函数的第二个参数设为1,则生成的字符串用分号;区分行,用逗号,区分列,从而清晰的在一行文本中展示三行五列的数组。
再来看看26个英文字母不用手敲而用公式来生成:
=ARRAYTOTEXT(CHAR(SEQUENCE(26,,CODE("A"))))
我其实很奇怪发明这个公式的表姐是不会盲打键盘找不着26个英文字母都在哪里吗?
数组矩阵排序sort函数
依据一列或多列中的值对给定数组或范围中的各行进行排序
语法
sort(范围, [排序依据列], [升降序], [按列排序])
参数 | 意义 |
---|---|
范围 | 要排序的区域或数组,返回的数组与所提供的数组参数的形状相同 |
排序依据列 | 范围内或范围之外的某个范围中的某列的列号,该列中的值指定了排序顺序。指定为排序依据列的范围必须是行数与范围相同的单个列,省略该值则以范围最左列为排序依据 |
升降序 | 1表示升序(默认值),-1表示降序 |
按列排序 | 一个逻辑值,指示所需的排序方向;False表示按行排序(默认值),True表示按列排序 |
举例
sort函数搭配filter函数可以从巨大的矩阵中提取隐藏在数据中的意义,例如每日鹰机系列图文
的态势图就是用在线版ONLYOFFICE做的,其中输入的原始数据是公开的adsb信号数据
我认为飞行高度越低,则飞机就越是刚起飞或马上就要降落的状态也就是离飞机场越近,或者和海面水上舰艇越近,或者是在执行反潜任务对海攻击任务的状态,那我就:
=SORT(FILTER(Sheet1!A2450:I2652,Sheet1!I2450:I2652>0),9,1)
先用filter函数将矩阵按照高度列I列把有数值的条目行抽取出来形成矩阵,再在外面套一层sort排序函数,按照第九列也就是I列按照高度从低到高排序,就可以上往下查看哪里飞得低了,泰国这飞机在南海这地方才飞六百来米高度也挺奇怪的。
再以川普模拟器为例,之前有竞拍次数的计算方法:
这里再把竞拍条目行提取出来从大到小排序一下:
=SORT(FILTER(Sheet1!A500:AM654,Sheet1!AK500:AK654>0),37,-1)
总结一下
参考文献:
SEQUENCE 函数(Microsoft 365 支持)
SEQUENCE 函数(Google 文档编辑器帮助)
XMATCH 函数(Microsoft 365 支持)
XMATCH 函数(Google 文档编辑器帮助)
XMATCH Function(ONLYOFFICE helpcenter)
EXPAND 函数(Microsoft 365 支持)
EXPAND Function(ONLYOFFICE helpcenter)
FILTER 函数(Microsoft 365 支持)
FILTER(Google 文档编辑器帮助)
FILTER Function(ONLYOFFICE helpcenter)
ARRAYTOTEXT 函数(Microsoft 365 支持)
ARRAYTOTEXT Function(ONLYOFFICE helpcenter)
SORT 函数(Microsoft 365 支持)
SORT(Google 文档编辑器帮助)
SORT Function(ONLYOFFICE helpcenter)