从本篇文章开始,我将在 Notion 中一步步搭建出一个个人事务管理系统,对自己实践 Notion 做一个复盘,如果能顺便给大家一些参考,那也是再好不过了。
Todo List
说到个人事务管理,最原始最简单的办法就是采用 todo list,可以用一本记事本加一支笔,也可以用应用商店里琳琅满目的各种 “TODO” app,形式不限。记一条准备要做的事项,前面画一个框,等到这个任务完成以后,在框里打个对勾。更进一步,再给每个任务设置一个时限,可以利用 app 的提醒功能,在提前安排好的执行时间或者是 deadline 对自己发出一个提醒。
如果你习惯使用传统的纸和笔来完成任务管理,我推荐采用子弹笔记(bullet journal)的方法来进行。子弹笔记法采用几个约定的符号来表示任务的状态,同时考虑了任务执行过程中需要延迟执行等各种情况,都有相应的处理方式,来避免用纸笔进行任务管理时经常出现记录过于混乱的情况。强烈推荐感兴趣的朋友尝试一下。
Notion 注册
言归正传,我们来看如何在 Notion 中进行任务管理,Notion 可以通过浏览器和客户端两种方式使用,客户端又包括电脑端和手机端。个人推荐直接使用浏览器页面,因为可视范围比较大,更便于操作。新用户只需要在 Notion 的官网按提示注册即可。可以使用 Google 或者是 Apple 的账户登录,也可以使用 Email 地址进行注册,具体的过程也没有特殊之处,我这里就不多写了。
界面
注册并成功登陆后,可以看到如下界面:
这就是 Notion 的主界面,分成左右两部分。左边是功能菜单和页面菜单树,右边就是选中左侧菜单后对应的页面。第一次登录后 Notion 会为你准备一个已经包含示例的 workspace。如果你是第一次使用 Notion,还对它不太熟悉,可以通过它提供的这些示例大致了解一下 Notion 的一些典型应用场景。这里我们直接开始创建自己的任务管理页面。
创建任务“数据库”
创建数据库页面
workspace 中的示例页面可以保留,也可以删除。我们这里新建一个页面,可以选择左侧 Add a page
,或者当你彻底删除所有页面和垃圾箱后,Notion 会为你自动创建一个新页面。我们将这个页面命名为数据库
。
Notion 为我们提供了丰富的页面组件,这里我们会用到数据库组件 Table
。按我的理解,数据库在 Notion 中有多种展现形式,table 是其中一种,你可以把它理解成一个 Excel 表格,有行有列。每一列都有列头,定义了这一列的内容和数据格式,每一行代表一条数据。有两种形式的 Table:
- Table - Inline:内嵌在页面中的 table,页面中还可以有其他内容;
- Table - Full page:整个页面就是一个 table,页面中无法增加其他内容。
创建任务 table
这里我们选择 Full page 形式的 table,具体原因后面会提到。在页面上输入 /
后,可以看到弹出一个下拉列表,其中展示了我们可以添加的页面组件,输入 table 过滤后,选择 Table - Full page
。
然后将新生成的页面命名为 任务
:
这个页面就可以看成是我们的任务数据库,后续所有的任务数据都会保存在这个页面展示的 table 里。
定义任务
有了数据库,接下来可以向其添加数据了,也就是我们的任务,每条任务都以数据库中一条数据的形式存在。有人会问了,还没有定义任务的各个属性啊,比如任务的名称,是否完成,执行时间等等。我们现在就来做。
table 字段定义
table 的字段定义有两种方法,第一种是类似 Excel 的操作方法,直接在这个页面中的表格里进行编辑,第二种是先新增一条数据,在这条数据的页面上完成定义。这里我们使用第二种方式。直接在表格第一行第一列输入一条待办事项,也就是我们的任务名称,比如:背 100 个单词
。输入完成后,鼠标放在当前单元格中,会出现一个 Open
按钮,点击它,打开这项任务的具体页面。
打开背 100 个单词这个任务的页面后,就可以使用页面中间的 Add a property
新增任务属性了。鼠标移动到每个属性上,前面会出现六个点,点击可弹出菜单进行相关操作。下面我们为这条任务新增以下属性:
属性名称 | 属性类型 | 说明 |
---|---|---|
优先级 | Select | 可设为 1颗星-5颗星,5颗星优先级最高 |
频率 | Select | 可设置:一次性任务、按时间间隔、每天、每周、每月、每季度、每年等 |
间隔 | Number | 如执行频率选择按时间间隔,则按照此间隔安排任务执行时间 |
上下文 | Multi-Select | 任务相关场所、人、工具等等,比如家、公司、张三、手机、iPad等 |
执行日期 | Date | 任务执行日期 |
下一执行日期 | Formula | 任务的下一次执行日期 |
截止日期 | Date | 任务截止日期,deadline |
目标 | Number | 为任务定义工作量的数值 |
当前 | Number | 当前已完成工作量的数值 |
进度 | Formula | 完成百分比 |
剩余天数 | Formula | 当前距离截止日期的天数 |
已完成 | Checkbox | 是否已完成 |
说明一下各个属性类型的含义:
- Select:单选,可直接在输入框中输入新选项,或鼠标点击选择已有选项;
- Number:数值;
- Multi-Select:新增选项方式和单选相同,可通过鼠标点击选择多个选项;
- Date:日期;
- Formula:公式;
- Checkbox:勾选框。
公式类型的属性我们稍后说明,其他属性和初始值完成后,如下图所示。
table 字段属性
属性类型
Notion 对于 table 的字段属性提供了非常丰富的数据类型,总体分为基础和高级两大类。基础类型除了上面用到的几个,还有 Text
,Person
,Files & media
,URL
,Email
,Phone
,根据名称都比较好理解,也基本做到了覆盖大部分使用场景。高级类型中这里仅使用到了Formula
,其他类型还包括Relation
,Rollup
,Created time
,Created by
,Last edited time
,Last edited by
,后边用到的时候再做详细介绍。
公式介绍
顾名思义,公式类字段的值都是经过公式运算后得出的值。在我们任务的属性中,下一执行日期
,进度
,剩余天数
都为公式类型,其中下一执行日期
是根据执行日期加上任务频率得出的,比如整理客厅任务我们 3 天做一次,本次执行日期是 2021-03-17,那么系统就会自动算出下一执行日期为 2021-03-20。进度
是由当前
除以目标
得出,剩余天数
是由截止日期
减去当前日期得出。
接下来我们对公式类型字段进行设置。首先点击下一执行日期
后的输入框,在弹出窗口中填入以下公式:
if(prop("频率") == "每天", dateAdd(prop("执行日期"), 1, "days"), if(prop("频率") == "每周", dateAdd(prop("执行日期"), 1, "weeks"), if(prop("频率") == "每月", dateAdd(prop("执行日期"), 1, "months"), if(prop("频率") == "每季度", dateAdd(prop("执行日期"), 1, "quarters"), if(prop("频率") == "每年", dateAdd(prop("执行日期"), 1, "years"), if(prop("频率") == "间隔", dateAdd(prop("执行日期"), prop("间隔"), "days"), dateAdd(prop("执行日期"), 0, "days")))))))
公式看上去比较长,但逻辑还是比较简单的,就是按照频率字段的值,给当前日期加上不同的天数,得到下一执行日期的值。其中主要用到了 if
操作符和 dateAdd()
方法。
if 操作符
- 语法:
boolean ? value : value
if(boolean, value, value)
- 举例:
true ? 1 : -1 == 1
if(false, "yes", "no") == "no"
dateAdd() 方法
- 语法:
dateAdd(date, number, text)
- 举例:
dateAdd(date, amount, "years")
dateAdd(date, amount, "quarters")
dateAdd(date, amount, "months")
dateAdd(date, amount, "weeks")
dateAdd(date, amount, "days")
dateAdd(date, amount, "hours")
dateAdd(date, amount, "minutes")
dateAdd(date, amount, "seconds")
dateAdd(date, amount, "milliseconds")
进度
的计算公式如下:
- 进度:
empty(prop("目标")) ? "" : format(slice("▓▓▓▓▓▓▓▓▓▓", 0, floor(prop("当前") / prop("目标") * 10)) + format(slice("░░░░░░░░░░", 0, ceil(10 - prop("当前") / prop("目标") * 10)) + " " + format(round(prop("当前") / prop("目标") * 100)) + "%"))
这里面用到了一个小技巧,就是采用两种符号组合的方式来表示进度条,深色符号表示已完成部分,浅色符号表示未完成部分,通过计算每种符号的比例组合成进度条。你也可以尝试将公式中的符号替换成其他不同的符号来改变显示风格。具体显示效果如下图:
剩余天数
的计算公式如下:
empty(prop("截止日期")) ? "" : ((prop("已完成") == false) ? ((prop("截止日期") > now()) ? if(prop("已完成") == true, "✅", format(dateBetween(prop("截止日期"), now(), "days") + 1) + " 天") : ((dateBetween(prop("截止日期"), now(), "days") == 0) ? "" : "")) : "✅")
和之前的公式一样,里面使用到的符号可以根据你的喜好自己选择。设置好剩余天数
的公式后,可看到文本框中已经有了值。当我们试着将已完成
字段打勾,剩余天数
的值也会变成“✅”符号,我用这个符号来表示任务已经完成,不再关心剩余天数。
以上所有属性都已经设置完后,我们的第一条任务以及任务字段的定义就完成了。回到任务页面,可以直接在表格中使用已设置好的属性列再次添加其他任务,如下图展示。如果想调整列的先后次序,可以用鼠标拖动列表头来手动排序。
到这里,基本的任务管理页面就创建完成了,我们可以在这个页面上新增或者是更新已有任务的状态。
就这样?当然不是。
细心的朋友可能已经发现了。上面的图里我新建了一条任务“创建个人事务管理系统”,然而它的进度只有 10%。也就是说,有了这个任务页面,我们的整个系统只完成了 10% 左右。有经验的朋友也会问到,这里只有单个任务,怎么定义任务的粒度呢?比如“创建个人事务管理系统”这个任务貌似有很多工作要做啊,应该怎么管理呢?
别着急,后边还会有很多篇文章来继续介绍这个系统的搭建。在下一篇文章里,我打算暂时把 Notion 放在一边,来为大家介绍一下第一篇文章里提到过的著名生产力专家 Tiago Forte 的 “P.A.R.A”方法,因为这是我们构建整个系统以及工作流的理论依据,希望大家能够喜欢。