Microsoft Flow 用法示例或给妻子的花






4.25/5 (3投票s)
在这里,我将向您展示一个用于实际任务的 Microsoft Flow 用法示例,它并非那么简单。
问题
有时,编程挑战源于日常生活。这就是其中一个。我想时不时地给我妻子买花,例如,每个月一次。但有一个问题。我不想在某个特定日期购买,比如每个月的第一个。那样就不会有惊喜了。我想要一些随机性。例如,下次购买鲜花应该是在上次购买后一个月,再加上或减去几天。
这个要求没什么特别的。编写一个程序来通知我这些事件很容易。但是桌面应用程序有一个很大的缺点。它只能在一台机器上运行,而我有好几台(办公室、家里……)。还有智能手机……如果我能在我当前使用的任何设备上收到通知,那不是很好吗?
嗯,我可以将事件信息存储在互联网数据库中(例如 Mlab)。这样,我的应用程序的所有实例将使用和更改相同的信息,从而使它们能够同步工作。但即便如此,我仍然需要在所有计算机上安装此应用程序。而且,由于我在计算机上使用 Windows,在智能手机上使用 Android,如果我想在所有地方使用它们,我实际上需要编写不同的应用程序。我该如何克服这个障碍?当然,通过 Web。
如果我创建一个 Web 应用程序,我几乎可以在我拥有的任何设备上使用它。太棒了!决定了,我必须创建一个 Web 应用程序。但仍然,这不够酷。让我解释一下我的观点。虽然编写一个解决我问题的 Web 应用程序并不难,但我仍然需要考虑很多事情。我必须考虑托管、数据存储、代码存储库……为什么?我需要的功能几乎都已在现代 Web 日历中实现,例如 Google Calendar。它可以创建事件、使其递归、在时间到来时发送通知等。唯一不能做的是我想要的随机性。如果我能添加这个单一功能并利用所有其他功能,那不是很酷吗?
当我思考这个问题时,我偶然发现了 IFTTT.com 这个网站。这个网站的理念简单而强大。如果发生某事,它就会采取某项行动。我知道这听起来很奇怪,所以让我举几个例子。如果我收到某个特定人员的电子邮件,则给我发送短信。如果我最喜欢的作者在他的博客上发表了一篇新文章,则在 Slack 中通知我。或者,如果 Google 日历中的某个特定事件时间到了,则给我发送一封电子邮件。我希望您现在能明白我的意思。此服务可以观察某些事件(称为触发器)并在事件发生时采取行动。IFTTT.com 上有大量触发器和操作。我可以观察 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 日历添加一个并行的“创建事件”操作。对于此操作,我们将从初始事件中获取标题、描述和地点。唯一要做的就是设置其开始时间和结束时间。
现在我们到了真正有趣的部分。我们需要在事件开始时间上添加一些随机天数。然后,我们将此新日期用作新事件的开始时间。例如,我想添加 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 函数从 string
中提取所需部分,并使用 int 函数将结果转换为整数。
太棒了!我们差不多完成了。唯一要做的就是设置事件的结束时间。在这里,我们遇到了最后一个障碍。我希望结束时间等于开始时间加上 15 分钟。Microsoft Flow 有 addMinutes 函数,我们可以这样写
addMinutes(<the previous expression here>, 15)
但是,根据 rand 函数的性质,我们可能会得到一个与我们的开始时间完全无关的 value
。相反,我希望在这里有一个变量 nextStart
,它会保留我们表达式的值。在这种情况下,我将使用此变量作为开始时间,并使用
addMinutes(<the value of 'nextStart' variable>, 15)
作为我新事件的结束时间。您知道吗?Microsoft Flow 有变量。首先,我们需要初始化一个。将鼠标悬停在触发器和条件之间的箭头上。点击加号,然后选择“添加操作”。
在搜索框中,输入“Variables”,然后选择“Initialize variable”。
将变量名设置为 nextStart
,类型设置为“String”。Microsoft Flow 没有日期/时间类型,因此它也使用 string
来表示日期/时间。
现在我们可以为变量设置值。我不能在这里直接设置,因为我不知道这是否是正确的事件。只有在我们的条件之后,我才能确定。所以我将在发送电子邮件后插入另一个“Set variable”操作。
在这里,我将 nextStart
变量的值设置为我们长的表达式。唯一剩下的就是在这两个表达式中重用这个变量:开始时间和结束时间。我们可以使用以下方式在表达式中引用我们的变量:
variables('nextStart')
所以事件结束时间的表达式将是
addMinutes(variables('nextStart'), 15)
结论
故事结束了。我们可以保存流,Microsoft Flow 将为我们运行它。
我希望这篇文章对您有所帮助。我认为 Microsoft Flow 是自动化各种任务的绝佳工具。
你可以在我的博客上阅读更多我的文章。