使用Microsoft Flow或如何给妻子送花的示例

在这里,我将演示一个使用Microsoft Flow解决一个实际问题的不太简单的示例。

问题陈述


有时,程序员的任务源于日常生活。 就是这种情况之一。 我想不时给我的妻子送花,比如说每月一次。 但是同时,我不想在任何特定日期(例如,每月的第一天)执行此操作。 那就不足为奇了。 我想要随机化。 例如,下次我送花时,应该比上次时间晚一个月,再加上/减去几天。

这样的要求没有什么特别的。 编写使我想起这些事件的程序很容易。 但是桌面应用程序有一个很大的缺点。 它只能在一台机器上运行,而我有几台(在家,在工作中……)。 还有一部智能手机……在我的任何设备上接收通知会不会很好?

好了,您可以将事件信息保存在某种在线存储中(例如Mlab )。 在这种情况下,我的应用程序的所有实例将使用相同的信息,这将使它们彼此同步。 但是,我将需要在所有计算机上安装这些应用程序。 此外,我在计算机上使用Windows,在智能手机上使用Android,因此,如果我真的想在任何地方接收通知,则必须编写几种不同的应用程序。 如何克服这个问题? 当然,使用网络。

如果创建Web应用程序,则几乎可以在任何设备上使用它。 太好了! 但是仍然不够好。 让我解释一下我的观点。 尽管编写能够解决我的问题的Web应用程序并不那么困难,但在这种情况下,我仍然需要处理很多事情。 您需要考虑托管,数据存储,代码存储……为什么? 几乎所有必需的功能已经在现代Web日历(例如Google日历)中实现 。 他可以创建事件,使事件重复发生,向我发送有关事件发生的通知等。 唯一缺少的是我需要的随机化。 如果我可以仅添加此功能并使用所有其他可用功能,那不是很好吗?

当我想到这个问题时,我遇到了IFTTT.com网站。 这个站点的想法很简单,但是很有成效。 如果发生什么事,他会做某事。 我知道这听起来很奇怪,所以让我举一些例子。 如果我收到某人的电子邮件,请给我发送一条短信。 如果我最喜欢的作者在他的博客上发布了新文章,请在Slack上告诉我。 或者,如果该在Google日历中举行特定活动了,请给我发送电子邮件。 我希望现在清楚我要做什么。 该服务可以监视某些事件(称为触发器),并在这些事件发生时执行某些操作。 IFTTT支持大量可能的触发器和动作。 我可以在Google日历中跟踪事件,然后在发生特定事件时给自己发送电子邮件,删除旧事件并在以后添加新事件。 哇! 到底需要什么! 但事实并非如此。

首先,IFTTT仅允许在触发器上执行一个操作。 这不是一个大问题,因为 您可以创建具有相同触发器的多个applet(applet是IFTTT中触发器和操作的组合)。 一个会给我一封信,另一个会删除我的旧事件,第三个会创建一个新事件。 但是还有一个更严重的障碍。 对于一个新事件,我需要创建一个随机的响应时间。 而且我在IFTTT中找不到如何执行此操作。 这意味着该服务无法解决我的问题。 但是,也许互联网上还有其他类似的服务? 是的,有。

我审核的下一个站点是Zapier 。 在这里,我们可以在一个触发器上使用多个动作,这很好。 但这只是为了钱,不是很好。 我玩Zapier的时间还不够长,但给人的印象是它也没有提供我所需的随机化机会。 虽然在这里我可能是错的。 无论如何,我都转到下一个候选人。

Microsoft Flow 。 该服务使我每月可以免费跟踪750个触发器。 这足以满足我的需求。 而且,它还支持表达式,包括rand()函数! 这正是您所需要的。 现在,让我向您展示如何使用Microsoft Flow解决上述问题。

解决方案


首先,您需要创建一个新流程。 流是触发器和动作的组合。 为此,请在网站上注册,然后在主菜单中单击我的流程 ,然后单击从空白创建



单击从空白创建按钮:



系统将要求您选择一个触发器。 在搜索字段中输入“日历”,然后选择Google日历



在Google日历的可用触发器列表中,选择事件开始时



在这里,您可能会被要求允许代表您从Microsoft Flow访问Google日历。

现在触发器已准备就绪。 它的唯一参数是日历:



是的,您可以在Google日历中创建多个日历。 每个事件都属于其中一个日历,因此您需要选择一个日历,其事件将触发您的操作。

创建新日历并将所有应触发您的操作的事件放入其中并没有错。 但是,如果不是日历中的所有事件都需要处理,则可以使用过滤。 单击新建步骤 ,然后添加条件



这将为您创建一个过滤器。 现在,您需要准确确定我们要如何过滤事件。 例如,我只想处理“位置”字段中包含文本“ [RANDOM]”的那些事件。 为此,请单击选择值输入字段。 Microsoft Flow将为您显示可以使用的可能值的列表:



单击事件列表事件位置 。 并用适当的值填写其余字段:



请注意高级模式下的链接编辑 。 她非常有帮助。 如果单击它,将得到与文本表达式相同条件的表示:



编写自己的表达式时,这将有很大帮助。

现在,您可以为我们的事件添加操作。 在过滤器的“ 如果是”部分中 ,单击“ 添加操作”链接。 在这里,我将创建一个操作,该操作将向我发送有关Gmail的事件通知:



如您所见,您可以使用事件中的数据来填充此操作的“主题”,“正文”和其他属性。

现在我们有通知。 现在该删除日历上的旧事件并在以后创建一个新事件。 使用添加操作链接为Google日历创建删除事件操作:



应该说,很可能只需更改日历上的事件,而不用删除旧事件并创建新事件。 但是在这里,我仍然坚持使用后一种方法,向您展示另一个Microsoft Flow功能。 假设我希望在日历中创建新事件不是在删除旧事件之后发生,而是与此同时发生。 将鼠标悬停在“ 发送电子邮件”和“ 删除事件”操作上。 屏幕上会出现一个加号。 单击它,然后在上下文菜单中选择添加并行分支→添加操作



现在,我们可以从Google Calendar添加并行的Create a event action。 对于此操作,我们将从源事件中获取标题,描述和位置。 剩下要做的唯一事情就是设置新事件的开始和结束时间:



现在我们进入真正有趣的部分。 我们需要以某种方式向当前事件的开始添加随机天数。 我们将使用这个新日期作为创建事件的开始。 例如,我要加30天加/减2天。 可用功能的文档可在此处找到。 我承认,这不是一个很简单的阅读。 我有很多问题,特别是关于如何从源事件中提取开始时间,以便可以在函数中使用它。 可以从我们的过滤器中获得一些帮助。 记住链接高级模式下的编辑



单击它会显示相应的表达式:



这为我编写表达方式提供了一些线索。 现在,单击“ 创建事件”事件的“ 开始时间”字段,然后选择“ 表达式”选项卡:



在输入字段中,输入以下表达式:

addDays(triggerBody()?['start'], add(30, rand(mul(2, -1), add(2, 1))))

然后单击确定 。 这个表达式正好解决了我们的问题:将30天的正负2天添加到了初始事件的开始时间。 但是,如果我需要一些灵活性怎么办? 如果我想进行几种类型的事件怎么办? 对于第一种类型的事件,我将开始时间增加30天加上/减去2天,对于第二种类型的事件-将增加14天加上/减去3天,依此类推。 这怎么可能实现?

这是一种方法。 还记得我们在事件的“位置”字段中存储字符串“ [RANDOM]”吗? 现在,我们将在此字段中编写其他信息。 其内容将为格式为[[RANDOM],NN,MM“的文本,其中NN是两位数字,MM也是两位数字。 我们会将事件发生的时间增加NN天,加上/减去MM天。 使用这种格式,我可以确定字符串的位置9和10(从0开始)处的字符将代表NN,位置12和13处的字符将是MM。 这是一个使用这种新信息存储格式来增加事件开始时间的表达式:

addDays(triggerBody()?['start'], add(int(substring(triggerBody()?['location'], 9, 2)), rand(mul(int(substring(triggerBody()?['location'], 12, 2)), -1), add(int(substring(triggerBody()?['location'], 12, 2)), 1))))

它使用substring函数从字符串中选择必要的部分,并使用int函数将其转换为整数。

哇! 我们几乎达到了目标。 仅保留设置新事件的结束时间。 在这里,我们遇到了最后的障碍。 事件的结束时间必须等于事件开始的时间再加上15分钟。 Microsoft Flow支持addMinutes函数,您可以编写类似以下的表达式:

addMinutes(< >, 15)

但是,由于rand函数的性质,我们最终得到的值与事件开始时的值无关。 相反,最好使用变量“ nextStart”来保存表达式的值。 然后我们可以在事件开始时使用它的值,并使用

addMinutes(< 'nextStart'>, 15)

对于它结束的时间。 你知道吗? Microsoft Flow支持变量。 首先,我们需要对其进行初始化。 将鼠标悬停在触发器和过滤器之间的箭头上。 点击加号,然后选择添加操作



在搜索字段中输入“变量”,然后选择“ 初始化变量”



将变量名称设置为“ nextStart”,然后键入“ String”。 Microsoft Flow没有用于日期和时间的单独类型;它在各处使用字符串。



现在,您需要为此变量设置值。 由于尚不知道此事件是否正确,因此无法在此处立即执行此操作。 只有在过滤器之后,我们才能确定这一点。 因此,我们在发送邮件通知后添加了另一个Set变量类型的操作:



在这里,我们将创建的变量的值设置为长表达式。 剩下的只是在事件的开始和结束时间在表达式中重用此变量。 您可以在这样的表达式中引用变量:

variables('nextStart')

因此,事件结束时间的表达式如下所示:

addMinutes(variables('nextStart'), 15)



结论


故事到此结束。 您只需要保存该流,Microsoft Flow就会为我们启动它。

希望本文对您有所帮助。 对我而言,Microsoft Flow一直是出色的任务自动化工具。

Source: https://habr.com/ru/post/zh-CN425847/


All Articles