优雅地将课表导入日历

为什么要把课表导入日历呢?

当然是为了——优雅。

  • 可以方便地自定义和修改课程;
  • 可以将课表作为小部件放到桌面上,方便而实用;
  • 可以准确地管理上课时间,并将课程和其他日程安排统一管理;
  • 可以很容易地处理调课等突发情况;
  • 可以设置上课前 N 分钟提醒,避免忘记上课;
  • 脱离臃肿的充斥着广告的大学生课表应用;
  • 可以借助 Google Calendar 或 Outlook Calendar 做到多平台无缝融合,在电脑、手机、PAD 甚至 Web 网页都可以管理课程;
  • 可以借助滴答清单等 To-Do-List 应用安排日程,iOS 用户还有好用而漂亮的 Sorted3 可以使用。

那么,何乐而不为呢?

本文有些啰嗦,特别是拆分课表部分用了 PowerQuery,写出来显得有些麻烦,其实操作非常容易,不用 PQ 手动操作也超级快,不要害怕~

效果展示

Windows 日历应用

Windows 任务栏 iOS 日历应用 (from SunsetYeu)

Sorted3 (from SunsetYeu)

MIUI 系统日历

课程详情

如何将课表导入日历

@Triple-Z@MiaoTony等同学的努力下,我校本科生已经可以很方便地从教务系统,获取课表并生成 iCal 日历文件,以导入 Google Calendar、Outlook 或系统日历。

具体项目参见NUAA_ClassSchedul,该项目还有一个漂亮又易用的在线版本

而遗憾的是截至目前,研究生信息管理系统还尚未对接成功,所以无法一键导出=_=。但得益于@陈某豪@SunsetYe66的贡献,我们依然可以较为优雅地将课表转换为 ics 日历文件。

生成 ics 文件

部署项目

从 GitHub 拉取程序

1
git clone https://github.com/Xm798/ClasstableToIcalforNUAA.git

确保本机已安装Python 3 环境,然后安装依赖

1
pip install uuid xlrd

准备 Excel 课表文件

登录南京航空航天大学研究生信息管理系统,进入到“课程学习” - “选课结果查询”模块之中,点击“导出数据”,获得一份选课结果的 Excel 文件。

导出课表

在交给 ClasstableToIcal 处理之前,我们需要先对该课表文件做一些预先处理。

拆分课表

首先,针对“时间”中存在多个上课时间的,例如星期二 下午5-下午6,星期五 下午5-下午6,需要先拆分为单条记录,确保每行记录为一节课。

借助 Power Query,可以很轻松的实现这项工作。

Power Query 在 Microsoft Office 2016 及以上版本中为内置组件,Office 2010 或 2013 版本需要手动下载安装,不支持 2010 以下版本和 WPS。

若无 PQ 组件或不想使用 PQ 操作,由于数据量非常小,手动拆分完全可行,只要将每行拆分为单独的一节课即可。

打开下载的课表文件,在 Excel 中选择“数据 - 获取数据 - 来自文件 - 从工作簿”,选择下载的课表文件并打开,选中 sheet1,点击“加载”。

双击右侧“查询&连接”中的 sheet1,打开 Power Query 编辑器。

删除无用的“学分、阶段、选课人数”三列,然后选中“时间”一列,点击“转换 - 拆分列 - 按分隔符”,分隔符选择“逗号”。

拆分列

按住 Ctrl 键多选除了时间之外的其他列,点击“转换 - 逆透视列 - 逆透视其他列”。

逆透视列

删除多出的“属性”列,点击“主页 - 关闭并上载”,得到拆分后的表格。

预处理课表文件

按照模板文件 temp_classInfo.xlsx 的要求,需要将待导入的文件处理成模板文件的样子。

时间设置 conf_classTime.json 文件我已按照我校教学日历调整完毕,无需再做修改,这部分主要针对 classInfo.xlsx 的制作进行预处理。

在拆分完成的表格中继续操作,选中时间一列,点击“数据 - 分列”,依次选择“分隔符号、空格、完成”,将星期和节次拆分。

拆分星期

而后,在节次右侧的两个单元格分别使用以下两个公式,并下拉填充,将星期和节次转换为对应的数字。

1
2
3
=IF(RIGHT(H2,1)="","",MATCH(RIGHT(H2,1),{"一";"二";"三";"四";"五";"六";"日"},))

=IF(I2="","",MATCH(I2,{"上午1-上午2";"上午1-上午3";"上午1-上午4";"上午2-上午3";"上午2-上午4";"上午3-上午4";"下午5-下午6";"下午5-下午7";"下午5-下午8";"下午6-下午7";"下午6-下午8";"下午7-下午8";"晚上9-晚上10";"晚上9-晚上11"},))

转换星期和节次

到这里,对 classInfo.xlsx 的预处理已经完成,可以将对应字段粘贴到 classInfo.xlsx 之中了。

制作 Classinfo.xlsx

根据作者介绍,classInfo.xlsx 中的字段含义为:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
className - 课程名称
startWeek - 开始周数
endWeek - 结束周数
weekday - 课程日期(周几)
classTime - conf_classTime.json 中定义的时间段代号
classroom - 教室
weekStatus - 是否单双周排课:正常排课 = 0,单周排课 = 1,双周排课 = 2
classSerial - 可选,课程序号
classTeacher - 可选,教师名

最后两个可选字段如果不需要可以关闭,只需在 excel_reader.py 中的 27 和 28 行将:
self.config["isClassSerialEnabled"] = [1, 7]
self.config["isClassTeacherEnabled"] = [1, 8]
后方的方框中,要关闭的功能的 1 改成 0 即可(即 [0, 7] 或 [0, 8])。

注意:若课程有不同排课方式或一周有多节课,需要分多条记录录入。

将之前表格中的对应字段,粘贴至 classInfo.xlsxweekStatus填写 0,并补充线上课的classroom为线上即可。

制作完成的 classinfo.xlsx

生成文件

该部分直接引用脚本作者教程。

我校 2020-2021 学年第一学期第一周的日期输入 20200831。

打开命令提示符或终端,定位到该项目根目录下。

pic

然后执行 main.py:

1
2
3
python main.py
# 或
python3 main.py

pic

首先选 2 进入课程信息读取工具:若未修改过 Excel 文件结构,直接回车即可;若提示成功,文件夹中将多出一个新的 JSON 文件。

pic

此时,再输入 3 进入 iCal 生成工具,按提示输入必需信息后即可生成最终文件。请注意此处输入的日期必须严格按照提示输入开学第一周周一的日期,且该日期的格式是 YYYYMMDD,即 年年年年月月日日,中间不加符号。 我校 2020-2021 学年第一学期第一周日期为 20200831。

pic

周数生成器

为了更方便查看课程表,本项目还附带一个「周数指示器」生成器。只需要在运行 main.py 选择 1 即可进入。

周数生成器

请注意,与之前必须输入第一周周一的逻辑不同,若以第一周的工作日为 2020.3.2-3.6 为例,该处输入日期的逻辑为:

  • 若你的习惯是将周一当作一周的第一天,则输入第一周周一的日期,即 20200302
  • 若你的习惯是将周日当作一周的第一天,请输入周一前的那个周日的日期,即 20200301

运行完成后会生成一个新的 ics 文件,同样按照下面的步骤导入日历即可。

导入设备

注意:导入任何日历之前,都建议新建一个新的日历用于导入操作,便于出错时批量修改,以及不同颜色更容易区分。

iOS 设备

直接将生成的文件传输到手机后点击打开,选择“导入日历”即可。

导入 iOS 日历

Android 与 Windows 设备

部分 Android 设备的原生日历并不支持 ics 文件的导入功能,其实更加推荐的方法是借助于 Google Calendar 或者 Outlook 来完成日程管理,因为无论是谷歌日历还是微软的 Outlook,都可以很方便的完成手机、PAD 与 Windows 设备之间的日历同步。

如果有科学手段,可以选用 Google Calendar,如果没有,Outlook 也是一个极为不错的选择,全凭个人喜好。

Google Calendar 导入

电脑端打开 Google Calendar,选择添加其他日历 - 导入,记得选择一个单独的日历,如果没有,可以新建一个。点击导入,即可完成。

电脑端导入 Google Calendar

也可以在手机端完成导入,在安装好谷歌日历的情况下,直接点击接收到的 ics 文件,选择使用“日历”打开,即可。

手机端导入 Google Calendar

Outlook 导入

电脑端访问 Outlook,使用微软账号登录。

点击左侧的“日历”,添加日历 - 创建空白日历,新建一个课表日历。

创建日历

然后选择“从文件上传”,选择生成的 ics 文件,导入到创建的课表日历中即可。

Outlook 导入日历

或者,Windows10 系统可以直接在本地右键 ics 文件,选择使用系统日历打开。

使用日历打开

然后导入到日历即可。首次使用可能需要登录账号,此处登录微软账号或 Gmail 或其他任何支持的账号都可以。

导入到日历

跨平台同步

在手机端、电脑端、PAD 端登录同一账号之后,即可实现全平台同步。

Android 端

若使用 Google Calendar,手机端需要安装谷歌日历应用;若使用 Outlook,手机端需要安装 Outlook 应用。当然,部分安卓操作系统的系统日历可以直接订阅谷歌日历和 Outlook 的日历,不安装 App 使用系统日历也完全 OK。

例如,小米日历在“日历 - 设置 - 日历账号管理”中,可以添加 Gmail 日历。

添加日历账号

电脑端

Windows10 系统使用系统的“邮件与日历”应用,登录对应账号,即可完成电脑端平台的日历同步。

如果是使用 Google 服务,需要先解除 UWP 应用的代理限制,请自行搜索“解除 UWP 应用网络隔离”,或参阅Win10 解除 UWP 应用网络隔离允许访问代理。推荐使用Fiddler中的WinConfig模块,全部解除隔离。

0%