我不负责公司考勤,但会要求负责的同事收到请假单时把信息告诉我(总不能大老板问起谁谁谁去哪了我说不知道吧)。于是日子一长,我就混乱了(请下一个月的假到下个月我怎么可能记得啊喂)。想了想,决定做个 Workflow 把微信上发来的请假信息自动导入日历,因为我的日历和 Todoist 任务管理工具是同步的,所以它们也会相应地显示在 Todoist 里,起到提醒作用。

结果如图:

请输入图片标题

看起来很简单,Here we go!

理顺逻辑

我遇到的第一个问题是同事发来的微信每次对请假的表述都不一样,统计之后发现最主要的表达方式有两种:

中文日期的表述:罗恩12月1日-3日事假3天
英文日期的表述:罗恩12.1-12.3调休3天

解决方式无比简单:

1.获取剪贴板
2.判断 text 里是否含有「日」,如有,运行「日程添加中文模式」的 Workflow,否则,运行「日程添加英文模式」的 Workflow。

请输入图片标题

中文模式

普通情况

1.设定剪贴板变量为「text」
2.提取时间
如何提取文字里的时间呢?仔细观察发现,我们需要的信息为「12月1日-3日」,就是从「第一个数字」起,到「最后一个汉字‘日’」止。
利用匹配文本加万能的正则表达式,如下:

(\d[\s\S]*日)

请输入图片标题

其中,
\d 表示0-9的数字
\s 表示空白符
\S 表示非空白符
[\s\S] 表示任意字符
[\s\S]* 表示0个到任意多个字符(贪婪模式)
() 表示保留的文本

也就是说,上面的正则表达的含义是保留一段文本,第一个字符为数字,最后一个字符为文本里的最后一个「日」,中间是啥无所谓。这样我们就获得了「12月1日-3日」的结果。
Bingo!

3.设定获得的结果为变量「all」
4.设置开始时间和结束时间
观察文本,显而易见我们应该拆分文本获取开始和结束日期。
利用「-」分隔后我们得到了一个列表,第一项是「12月1日」,设置为开始日期。最后一项(第二项)为「3日」。

等等,这样日历是识别不出来的吧?
于是我们需要提取出「12月」,加到列表第二项组成「12月3日」。
有了前面正则的基础,这个问题也迎刃而解啦。正则如下:

(\d[\s\S]*月)

设定变量为「month」,加上之前「3日」设置变量为「halfday」,共同组成变量「endday」

请输入图片标题

等等等等等……
如果,这个请假时间是跨月的呢?比如,「9月30日-10月1日」?
于是我们需要在「-」之后的「halfday」变量里进行一次判定,如果包含「月」,说明这个日期是跨月的,直接设定为「endday」。否则,加上月份组成「endday」。

请输入图片标题

呼……真不容易啊。

例外情况

有普通情况,当然还有例外情况。很多人请假只请一天,于是会有

罗恩12月3日请假1天

注意到我们一开始拆分文本后获取列表的时候用的是「最后一项」而不是「第二项」了吗?这里藏了一个小心机。如果前面匹配到的是「12月3日」的形式,那拆分文本就不起作用,之后的列表里就只有一项,当然列表的第一项和最后一项都是「12月3日」。这个时候,我们只要对列表的最后一项进行判定,如果它包含第一项,也就是变量「startday」,那意味着开始日期等于结束日期。

然后就添加进日程吧!
(因为我添加的是过去的日程,如果直接添加MM月dd日,会自动跳到下一年。所以我在前面添加了「2018年」字样,Google & iCloud 会自动识别的)
(添加「办公室考勤」字样是为了方便在日历里搜索)

最终的结果如下:

请输入图片标题

英文模式

有了中文模式的历练,英文模式应该手到擒来吧?
想多了。

罗恩12.1-12.3调休3天

第一步,提取「12.1-12.3」,我绞尽脑汁,也没想出合适的正则表达式。无奈之下,采取了一个妥协的办法。现在微信复制已经可以选择文字了,于是我复制的时候去掉除了日期之外的其他数字,变成这样

罗恩12.1-12.3调休

那么提取日期的正则表达式为

(\d[\s\S]*\d)

即提取文本里第一个数字到最后一个数字之间的一切。

设定提取日期为变量「all」。老规矩,用「-」拆分文本,得到第一项,即开始日期「12.1」;第二项,「12.3」,结束日期。

问题来了,「12.1」无法被系统识别为日期。于是我们替换文本,得到「12/1」,利用 Workflow 自带的 format date,格式化日期为「MM月dd日」的格式,设定变量为「startday」。

接下来到获取月份的步骤。匹配文本

(\d*)

这样会把所有的数字匹配出来。我们只需要列表第一项,设定变量为「month」

第二个问题是,同事发给我的日期可能是「12.1-12.3」,也可能是「12.1-3」(同事你好同事再见),为了让日历识别出正确的结束日期,我们需要再次进行判定。显然,判定的标准就是「-」拆分后的第二项是否含有字符「.」

如果含有字符「.」,说明得到的是「12.3」格式,设置为变量「endday」。否则,说明得到的仅仅是「3」,设定变量为「halfend」(忽略我粗暴的取名方式),再把「month」和「halfend」加个「.」设置为「endday」。

和上面一样,替换文本并格式化日期,设定为最终版的「endday」。

添加到日历,大功告成!

最终结果如下

请输入图片标题

课后题

如果请假信息是「罗恩明天请假1天」呢?

最后

做完才发现,如果把请假信息导入新的日历里,就可以在日历里以月视图模式直接看公司整体请假情况啦。
以及,感谢罗恩同学的友情出演!祝你和你的食尸鬼一切顺利!