通用预约系统表模板使用教程

很多时候,为了更好地分配资源,我们需要有这样一个系统应用:

这样的需求,单纯的问卷形式传统表单收集是做不到的。而数据收集表虽然可以创建,整体的填写体验却不佳,也做不到判断填写是否有效。

如何将多种数据查看手段、数据收集手段,有机地结合起来,并赋以自动化?协同表格的通用应用、脚本、自动化规则综合使用,便是一种极好的方式。

本模板现在已经率先应用在唐仲英楼的会议室预约系统中。最古早的传统表单/数据收集表用法见2021年的推送:《协同表格 | 校内免费问卷制作平台你还不知道?》,这种用法作为早期智能表格的补充模块,比较简陋。现在面向复杂需求,更推荐使用的是通用应用:《协同表格 | 让每个人只能看见自己的记录,通用外部应用一招秒杀!》

太长不看?这次,我们做了个简单的演示视频,建议在电脑上播放噢!

使用模板

从模板创建

登录协同表格,从“通用”-“通用预约系统表”创建一张新表。

从模板创建

通用-通用预约系统表

打开创建的“通用预约系统表”,下面准备开始修改内容。

修改表格信息

预约记录表-单选列标签

在创建的表格中,“预约记录表”子表内可以看到如下的这些列:

在上述诸多信息中,你 只需要更改标出的两列,点击“编辑单选”:

其中,您可以根据您的实际需求,将院系更改为部门、年级、课题组等等其他人员分类;会议室房间也可以是仪器设备等其他公共资源

如果您需要更改列名,请注意将下方脚本内的相关索引(代码中“院系”和“会议室房间”的关键词)一并更改!

预约计价表-多选列标签

在前边我们修改过的“院系”和“会议室房间”(当然,根据你的需求,这里可能已经不叫这个名字了,但下面我们仍然沿用这两个名字),在 “预约计价表”子表 内也把相应的列名修改一致,并且标签需要一致:

唯一不同的是,这里的“院系”和“会议室房间”必须是多选列

这里有个小技巧:你可以通过“导入/导出标签”从前面的“预约记录表”子表精准地把标签导入过来。

“预约计价表”子表提供了两种计费模式:次单价和时单价,并且逻辑上取最大值

该子表的每一行都是计价规则,其逻辑为:同一行内,对应的“院系”预约对应的“会议室房间”,按照后边的计算方式计算。

此逻辑更改需要动脚本代码。如果不需要某种计费方式,一个简单的方法是:直接将该值写为0。例如,不需要按次计费,那就把次单价改为0,这样就始终采用时单价的结果了。

需要注意,这张子表应该覆盖所有的情况,并且规则互相不得有冲突

预约规则配置表-变量值

“预约规则配置表”子表配置了用于脚本的变量。

首列不要动,你只需要根据自己需求修改“值”即可。

需要特别注意的是,OUTDUE是宽限期,该参数设定在后期录入开始时间早于当前一定时间段的记录,也会被视作有效预约。

邮件通知(可选)

为了能较为即时反馈预约结果,本模板设计了邮件通知系统,但需要按照下文方式配置。首先打开第三方集成面板:

“邮件”-“增加邮件账号” 内,添加一个用于发信的邮箱:

添加邮箱需要下列信息:

这些信息你可以通过搜索对应邮箱的第三方客户端配置教程来填入。例如,以南京大学邮箱为例,你可以参考《南大电子邮件使用办法》中关于“学生/教师邮箱客户端设置办法”的内容,寻找“SMTP”和“IMAP”端口号与客户端专用密码设置。

在上述账号添加完毕后,你可以**点击“发送”**来测试是否正确配置:

接着,打开 “规则”-“自动化规则” 模块:

其中已经有预置的三个核心自动化规则,你只需要检查第一个“预约状态更新通知”自动化规则

绝大多数设置都是无需修改的,只需要将“第三方账户”从下拉框选中你刚刚添加的账户即可

如果不设置这一部分,邮件将不会发送,但前面的功能不受影响。

脚本

本预约系统的核心脚本有两个,除非有前文中提到的需要修改列名的情况,一般情况下无需修改。

可以注意到,这里的脚本有两个。其中,除了新增记录规则判断,我们还需要定期冲突重复检查。这是因为,记录提交后,后台会运行一个Python脚本,但由于这个过程是并发的,如果极小概率出现:A和B是两条有预约时间冲突/重叠的记录,A记录比B记录先触发脚本,但因为某些不可控的原因,A的脚本尚未执行完时B已经被执行了,B脚本是完全不知道A记录的存在的,因此可能会同时被判断为预约成功。为了解决这个问题,一般做法是通过队列或其他方式有一个顺序的控制,这在协同表格中可以单独以一张子表作为队列来解决——但是显然这非常麻烦。因此,每天定时做一次检查,将冲突情况搁置并让申请人通知管理员处理,是非常必要的。

脚本会获取之前的记录,查询检测是否合法,然后计算费用,写入预约记录表状态无效原因列。

其中,状态有4个:

预约失败的原因一般包括:

如果自动化运行未生效(没有自动判断预约成功),可以通过脚本日志查看是不是哪里设置有问题(尤其是前文提到的预约计价表情况是否定义完全):

脚本日志的常见报错包括:

编辑应用

通用应用是一个基于智能表格可让用户自行搭建简易APP的功能。通过简单的页面类型选择、组织,用户就可以为原先“简陋”的表格“套”上一层友好的交互页面。应用内的人员管理也是与表格原先的“协作人”独立,每一个用户登录应用时,都会被注册为一个应用的角色。

因此,通用应用功能相比之前依靠共享表格、视图以及传统表单、数据收集表实现的各种数据收集协作场景,都更加安全且功能丰富,而且登入/注册应用的用户不会受到人数限制。在面向大批量、不确定身份的人员很多行政目的的表格协作中,直接共享表格不仅权限不安全也有可能受到人数限制,使用通用应用是个推荐选择。

在“应用”模块,已经有一个样例应用。我们将通过下面这个应用来展示通用应用的优势。

点击右侧的小笔编辑此应用:

从左侧导航栏可以看见,这个应用设计了这些页面:

可以看到,我们预期本应用的设计需要满足预约填写,但又远不止是填写。我们希望:

说明页

进入编辑界面,说明页可以根据你的具体情况修改。

所有预约日历/所有预约查询

这两个页面直观展示当前预约情况:

其中,检索功能更具体一些:

这两个页面无需修改。

预约申请

这一页是用于预约填写的表单:

这里也应用了一个技巧,设置申请人姓名学号申请人学工号两个的默认值分别为{creator.name}{creator.id},并设置默认值之后不能更改,就可以直接获取当前登录者的信息,填写人不需要手动填自己的姓名学号。该技巧见:协同表格 | 今日小技巧:从表单问卷的信息中提取填写者姓名学号

预约申请页面一般也无需修改。

申请人/负责人

申请人/负责人文件夹内的页面结构是一样的

其中,对应的人员在预约取消一栏可以删除已经存在的记录,但是不能修改或新增。如要重新预约,必须要从上面的预约申请提交新的预约。

预约管理

预约管理是可以设置为我们指定的人来访问,其他人无权限访问这一页面。这样,我们就可以在应用内就完成数据协作,无需共享表格。

鼠标移动到“设置”小齿轮,

就可以打开这一页的页面设置:

可以发现,各种权限能够设置的选项有四个:管理员(这张智能表格的管理员)、没有人、任何人、特定角色

这里的特定角色与智能表格中的指定用户是完全不同的两个概念。特定角色仅在本应用内存在。在编辑本应用时,左侧可以看见用户和角色管理一项:

用户一栏中的用户,便是本应用目前为止注册的用户:

这与原始的表格是完全独立的——除非你点击右上角将用户同步到表格

角色一栏我们点右上角增加角色,例如图中我们创建了一个辅助管理角色:

现在回到之前的页面设置,刷新后你将在这里看见辅助管理这个角色,选中它,这一页就只能被辅助管理查看了

发放应用

至此,我们已经编辑完毕主要的内容。下面的问题是,我们要如何发放这个应用?

首先,在编辑应用的左侧我们可以看见齿轮,这是整个应用的设置。这里我们可以设置一个好记的自定义URL。

但是直接复制这个应用发放,你会发现收到的人点开没有权限!你需要打开用户和角色管理-开放式访问-任何登录用户访问应用程序都将自动注册为应用程序用户,并设置自动注册的角色:

这样,用户拿到上方的 App URL 或者前文的自定义 URL,点击登录后都会自动创建为设定的角色并注册为此应用的用户。

实际上,本来我们需要在用户和角色管理内的邀请链接,为默认角色(或者你自创的某个角色)创建一个邀请链接,访问这个链接的人登录后才会自动按照这个角色注册为应用用户,这也是不进行上文设置会提示没有权限的原因。

但是,开放式访问的功能简化了这一流程。前面的“辅助管理”自定义角色可以单独创建邀请链接发放给协作者:


在完成上述步骤后,你应该得到了:

分发公开的APP链接地址给需要预约的用户,然后将辅助管理的链接分发给一起管理(主要是解决小概率冲突才需要人工介入,其余情况基本为自动化计算)的同事。

需要注意的是,上文所有的查询功能必须基于用户登录才能实现,因此千万不能开启开放式访问-允许匿名用户访问


Revision #10
Created 30 November 2023 21:01:44 by LadderOperator
Updated 2 December 2023 13:12:18 by LadderOperator