Gridea

在Tasker中避免大量IF语句的小技巧

在Tasker中避免大量IF语句的小技巧
2020-03-15 · 4 min read
Tasker

前几日订阅了少数派收费栏目 Power+ 2.0,为 Fairyex 写的几篇Tasker教程所吸引,跟着《利用 NFC 实现自动记录时间》这篇文章的步骤,付费了 Tasker,也买了 NFC 标签……也有所思考。


Fairyex 在「根据不同 NFC 标签内容触发不同任务」一节中,面对从 NFC 标签中读到的不同数据,使用了 IF... ELSE IF... 的方式进行分支。而我想到了另外一种实现方式。使用多行文本来存储类似表格一样的内容,通过正则表达式和 Tasker 的搜索匹配功能对内容进行提取和分组。

首先先大致描述下 Fairyex 前辈的实现逻辑:

1. 读入 NFC 标签内容
2. IF NFC 标签内容 为 A
	3. 设任务名称为 A不拉不拉
	4. 执行 Toggl 计时任务
5. Else IF NFC 标签内容 为 B
	6. 设任务名称为 B不拉不拉
	7. 执行 Toggl 计时任务
8. 结束 IF

如果任务很多,最后的成品代码将会非常难以阅读。并且日后需要修改任务名称的时候,要在大量的 IF... ELSE... 中寻找待修改的内容,个人感觉可修改性很差。于是想到了利用多行文本和正则进行匹配的实现方式。大致描述如下:

1. 读入 NFC 标签内容
2. 设定当作数据库的多行文本变量 LIST
3. 提取 NFC 标签内容所在的整行内容到变量 LINE 中
4. 将 LINE 以指定的字符分割为一组变量数组
5. 设任务名称为 变量数组中代表名称的那个
6. 执行 Toggl 计时任务

这样的描述可能过于抽象,因此我做了一个演示任务来帮助大家更好的理解这一思路:

左图为演示任务的内容,中图和右图分别为将 %目标变量 设为 a,b 后,在变量 %数据库 中匹配出来的结果。如果日后需要修改任务的名称等信息,只需要修改 2.变量定义 中定义的变量 $数据库 的内容即可。

1. 变量定义 定义了要查找的 %目标变量a

2. 变量定义 定义了以特定格式存储类似表格一样的多行文本的变量 %数据库

这里的「特定格式」,以-开头,中间各列以//或者其他不会在内容中出现的符号做分割。演示任务中的定义是这样的:

-a//a的第一列//a的第二列
-b//b的第一列//b的第二列
-c//c的第一列//c的第二列

3. 变量搜索替换 ,通过正则表达式 -%目标变量//.* ,将「每行开头 - 与第一个 // 之间内容」和「 %目标变量 」一致的整行内容匹配出来,并且存储到变量 %目标行 中。需要注意的是,之后再次引用时,要在变量名称为 %目标行1,这是因为Tasker 的搜索匹配结果是以数组的形式保存的,而第一次匹配的结果存储在1号下标的位置。

因为 %目标变量a, 所以此时 %目标行1 的内容为 -a//a的第一列//a的第二列

4. 变量拆分, 以 // 为分隔符,将 %目标行1 中内容分割为 -aa的第一列a的第二列。并分别储存到变量 %目标行11目标行12目标行13 当中。

这样的操作就可以替代大量的 IF... ELSE 来进行判断了。

完整的截图如下:


PS:在用作存储对应关系的 %数据库 中,不止可以存储纯文本信息,也可以插入带有变量的内容。比如这样的一个例子: