用 Power Automate 搭建信息查询系统
Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。
文章代表作者个人观点,少数派仅对标题和排版略作修改。
疫情期间,各大平台的表单系统都发挥了巨大的作用,比如要收集公司员工的旅行信息,收集小区住户的身体状况信息等等。以往需要几天且耗费大量时间精力的工作,在表单表单系统的帮助下,只需要几个小时就可以完成,简单快捷。
但表单系统仍有一个不足,它的信息流是单向的。也就是说,信息只能从表单填写者流向信息收集者,而如果要实现让信息从发布方流向信息获取方,目前市面上的表单系统就无能为力了。虽然微信公众号甚至自建网站也可以实现信息的分发,但这种系统一般只能实现信息的无差别发布,即任何人都可以看到发布的信息,而且大家看到的信息都是一样的,如果要实现信息的精确发布,即某个人只能看到某条数据,构建成本就会大大增加,而且需要相当程度的专业知识。
但事实上这种需求还是挺常见的,比如你是一个社团的负责人,有很多人想加入这个社团,你让大家填写表单来申请加入。于是接下来你可能会经常收到申请人的电话、邮件、IM 消息来询问他的申请到了什么步骤,是否有进展,有没有通过。你只能不厌其烦地去查看每个人的申请进度,然后一一回复,或者干脆不理他们。那么有没有更好的办法来解决这个问题呢?
为此我试用了市面上常见的一些云端办公系统,如腾讯文档、WPS、Google docs 等,但这些产品似乎都没有提供什么好的解决方案,或者需要购买「企业版」授权才能使用。不过就在我将要放弃的时候,我发现了微软 Microsoft 365 订阅中的一项服务 Power Automate。Power Automate 是一项在线流程自动化服务,对普通消费者来说可能比较陌生,其实市面上也有其他类似的服务,比如比较知名的 IFTTT。关于 Power Automate 的介绍,大家可以参考这里:
https://docs.microsoft.com/zh-cn/power-automate/getting-started
简单点说,我们就是用 Power Automate 来创建一个自动化的工作流,当有人希望查询一些信息的时候,通过某种方式触发这个工作流并提交想要查询的关键字,工作流引擎收到查询请求之后,根据配置的流程规则,用关键字在指定的数据集合里面找到相关数据,然后再以某种方式把查询到的数据返回给想要查询信息的人。
让我们开始吧。
这里就让我们假设一个场景,当有人提交某种申请之后,我们会用一个 Excel 表格来记录这些人的申请进度,然后让申请人通过发邮件的方式来查询他自己的申请进度。而且我们希望每个人都不会看到其他人的申请信息,以免信息泄露造成麻烦。
首先你需要一个 Microsoft 账号,然后用这个账号购买一份 Microsoft 365 订阅,你只需要购买个人版或和其他人一起合买家庭版就行,这样成本最低,可能一年只要几十块钱。然后就可以用这个账号开始下面的步骤了。
既然是查询数据,那么自然需要一个数据集合用来查询搜索,Power Automate 支持各种类型的数据,比如各种数据库系统,但既然我们希望这套查询系统能尽可能的简单,那么用 Excel online 来作为数据集显然就是最简单又最节省成本的选择了。
打开 onedrive,在任意一个目录下新建一个 Excel 文件,暂时就取名叫 database 吧
然后在这个 Excel 文件中填入我们一会儿用来查询的数据
可以根据自己的需要给每一列数据提供一个名称,如上图中的 Name、Email、Status。然后选中这个数据区域,并在插入菜单中选择插入「表格」
这时系统会给出提示,点击「确定」
然后你就会看到表格变成了这个样子
「插入表格」这一步非常重要,因为 Power Automate 后续对数据进行的查询也是基于 Excel 中的「表格」进行的,所以这里如果只是填入了数据,而没有把数据区域转换成「表格」的话,后面就会发现找不到任何表格,也就无法进行查询了。
到这里,我们的数据集就制作完成了,接下来我们就用一个自动化工作流在这个数据集中查询指定的数据。你也可以根据你自己的具体需求来设置你自己的表格内容。
我们的查询工作流大概可以分为 4 步:触发 -> 取数 -> 筛选 -> 反馈。
「触发」就是说使用这个查询系统的用户,通过一定的手段使工作流开始运行,比如在我们这个例子中,我们将会用邮件作为查询的手段,即用户通过给指定邮箱地址发一封 Email 来进行数据的查询。
「取数」就是把我们前面建好的数据表的内容读取到工作流中。
「筛选」就是我们的工作流在收到触发条件后,根据用户的查询要求在前面读取的数据表中搜索满足条件的数据。
「反馈」就是工作流在上一步中找到了用户需要的数据之后,通过某种方式反馈给用户,让用户指定查询的结果。这里我们既然选择了用邮件来触发查询,那么用回复邮件的方式将查询结果反馈给用户就是最简单自然的选择了。
我们访问 https://asia.flow.microsoft.com/zh-cn/ 打开 Power Automate 的主页,并选择左侧的「创建」菜单
然后在界面中选择第一项「自动化云端流」
在弹出的提示框中,先给我们的工作流起一个好记的名字,比如「search」。然后在流触发器搜索框中搜索「outlook.com」,并选择结果中的「如果有新电子邮件到达(Outlook.com)」并点击下面的「创建」按钮。
这时,我们的工作流就建好了,同时还选择了邮件作为工作流的触发条件。下面就开始对工作流进行具体的配置。
首先,虽然我们已经选择了「如果有新电子邮件到达」作为工作流的触发器,但这时触发器的配置还相对简单,我们可以给触发器添加更多的选项来优化触发的逻辑。比如首先我们可以选择指定的文件夹作为触发的条件,这里我们选择是「收件箱」,也许你的邮箱账号里面有多个文件夹,你也可以指定别的文件夹作为触发条件,这样只有发送到指定文件夹的邮件才有可能触发我们的工作流。
也许这个邮箱除了会收到查询的邮件,还会收到其他邮件,显然我们得把邮件过滤一下,不能任何邮件都触发查询的动作。我们点击「显示高级选项」,在「主题筛选器」中填入「check-status」,这样只有在收到的邮件的主题中出现「check-status」这个关键字,工作流才会被触发。
这样,触发器就配置好了。对于邮箱系统比较熟悉的朋友可能已经想到了一个更灵活的手段来配置触发条件,那就是和邮箱里的一些收件规则搭配起来使用。你可以在邮箱系统中配置详细的规则来把一些特定的邮件转入特定的文件夹,再把触发器配置为这个特定文件夹收到的邮件才会触发工作流,这样配置可以更细致灵活。
收到邮件,工作流被触发之后,就要开始筛选数据了,但筛选之前得先把被筛选的数据都拿到才能进行筛选。我们点击上面的「 + 新步骤」按钮,就会看到下图的界面。这个界面是用来选择我们接下来要进行的操作的,所以首先我们要在这里拿到被查询的数据,也就是前面那个 Excel 文件中的表。于是我们在搜索框中输入「列出表中存在的行」,并选择「列出表中存在的行(Excel Online OneDrive)。因为我这里用的是家庭版 Office 365 账号,所以要选择 OneDrive 版本。
然后我们选择好文件和表,这里的表就是前面特意提醒大家要插入的那个表,如果前面没有进行插入表的动作,这里就找不到任何表了。
选择好数据源之后,我们再添加一个新步骤,对数据进行筛选,也是最关键的一步。
添加新步骤之后,我们在搜索框中搜索「筛选」并选择「筛选数组」。这里所谓「数组」其实就是「数据组」的意思,或者说是一个包含一组数据的列表。比如我们前面拿到的数据是一个表中的所有行,那么每一行也就是一项数据,这些行放在一起就是一个「包含一组数据的列表」了。我们就是要在这个列表中进行数据的筛选,找到符合我们要求的数据。
筛选器配置界面分为上下两部分,上半部分是选择要筛选的数据,这里我们在点击输入框之后可以看到弹出一个小窗,在小窗中选择「value」。这里的 value 其实指的就是前面「列出表中存在的行」那一步所拿到的所有数据。
下半部分就是筛选条件了。我们希望直接通过 Name 字段来筛选,也就是上面那个表中的所有行中,Name 栏位的值满足要求的才是我们想要的数据,所以现在条件的第一个输入框中选择「Name」。
中间的下拉选项是匹配条件,我们就选「等于」。右边就要填写查询的用户给我们的条件了,也就是邮件主题中的后半部分。
我们之前规定查询邮件的主题是「check-status-xxxx」的格式,那么这里我们就要把主题中的「xxxx」部分的内容取出来,才能和 Name 栏位的值进行对比。这里就要用到表达式了,所谓表达式其实就是一个数据处理工具,简单理解为,你把一些数据给这个工具,这个工具会按照你配置的规则对数据进行加工并返回给你。
比如这里我们系统这个工具把邮件主题中的「xxxx」部分给我们,于是我们在表达式中用到了 substring 这个函数,这个函数可以返回一个字符串的一部分。
关于表达式中的函数可以参考这个文档:https://docs.microsoft.com/zh-cn/azure/logic-apps/workflow-definition-language-functions-reference
选择 substring 函数,然后把光标放到函数后面的一对括号中间,并选择「主题」,这样就算是把「主题」传递给 substring 函数了。
但是 substring 光知道原始内容还不够,他还要知道你想截取原始内容的哪一部分,所以我们还要告诉他从哪里开始截取,也就是 startIndex 是多少。
「check-status-xxxx」这段内容前面的「check-status-」一共有 13 个字符,所以我们是从 13 之后开始截取的,所以 startIndex 就是 13,最后一个 length 参数是指你想从 startIndex 开始截取多长的内容,这里我们希望截取 startIndex 之后的所有内容,所以 length 不用填了。
完整的表达是就是下面这个样子
substring(triggerOutputs()?['body/Subject'],13)
点击「确定」按钮
你还可以用高级模式查看完整的条件表达式
到这里,我们的数据筛选过程就配置完成了。接下来就要把这些筛选好的数据反馈给查询的用户了。
前面我们已经通过筛选拿到了用户要查询的数据,接下来就是把筛选出来的数据反馈给发起查询的用户了。
首先我们了解到,前面对数据进行筛选之后的结果,并不一定是单一的数据,而是一个「数组」,也就是一个包含一组数据的列表。为什么呢?因为符合前面筛选条件的数据可能是有多条的,假如表中有两条数据的 Name 都是「张三」,那么当用户查询张三的数据的时候,就会筛选出两条数据了。
还是和之前一样,先添加一个新步骤,然后在窗口中选择「控件」。
接着选择「应用到每一个」,意思就是说对前面筛选结果的每一条内容进行处理。
在「应用到每一个」的配置界面中选择「正文」
然后点击「添加操作」
搜索「outlook.com」,并选择「答复电子邮件」。
上面这段配置的意思就是,针对前面查询到的每一条数据,都给用户发一封答复邮件。
下面来配置邮件的具体内容。先在「消息 ID」中选择弹框中的「消息 ID」。
然后在邮件的正文配置中,我们要再次用到表达式。因为查询到的数据其实是一个比较复杂的结构,用一种叫做 JSON 的数据格式进行描述的,虽然里面包含了这条数据的内容,但如果直接回复给用户,可能阅读起来并不是很友好。所以这里要对筛选出的 JSON 数据进行一些处理。
我们这里只希望把查询到的数据的 Status 栏位的值返回给用户,于是用到 item 函数,这个函数会返回当前的这一条数据,而不是前面说的一个数组。
然后我们要把当前这条数据的 Status 栏位的值取出来,所以我们的表达式写成下面这样
item()?['Status']
点击「确定」按钮。
到这里,工作流就配置完成了,可以在界面中比较直观地看到整个工作流的内容:触发 -> 取数据 -> 筛选 -> 反馈。
工作流都配置好了,那么我们怎么知道它真的可以正常运行呢?
点击上图界面右上角的「测试」按钮并选择「保存与测试」
接下来我们就自己模拟以为查询数据的用户,给这个账号的邮箱发一封 Email。
很快我们就收到回复的邮件啦 ^_^
你可能会疑虑,如果有人冒充我给系统发了邮件,他岂不就可以知道我的申请状态信息了?解决这个问题其实很简单,我们可以在数据筛选的步骤中添加一个条件,比如要求发件人的邮箱地址要和表中「Email」栏位的值相同,这样就只能用指定的邮箱才能查询到对应的信息了。
再如,如果我们要搭建的信息查询系统中,经常会查到多条数据,那么每条数据都回复一封邮件显然不是一个好主意,这时我们就可以去掉「应用到每一个」步骤,直接使用邮件回复,并适当配置邮件的内容,让邮件的正文能列出所有搜索到的数据。
这里我只是举个简单的例子,大家可以根据自己的实际需求做进一步的研究。
通过这套工作流,你可以非常简单快速地搭建一个信息查询系统,满足一些简单的小需求。从而解放自己的生产力,让自己的工作生活变得更加高效。同时,哪怕你之前对 Power Automate 完全不了解,只要你按照上述的步骤操作一遍,你也一定会发现,Power Automate 的功能其实非常强大,我们今天演示的其实只是它最入门的一种用法。如果你能更深入的研究 Power Automate 的其他用法,相信你还会有更多收获。届时也期待你与大家一起分享你的成果。
> 下载少数派 客户端 、关注 少数派公众号 ,了解更妙的数字生活 🍃
> 想申请成为少数派作者?冲!