V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
geelaw
V2EX  ›  分享创造

学术日历(课程表)的管理方法和工具

  •  
  •   geelaw ·
    GeeLaw · 2018-09-22 08:35:41 +08:00 · 4955 次点击
    这是一个创建于 2258 天前的主题,其中的信息可能已经有所发展或是发生改变。

    从学校的网站导入课程到日历总是有这样或那样的不完美:

    • 清华没有直接提供 iCal,我不知道第三方 app 是否支持导入英文课程名,以及英文的上课地点)
    • 你可能希望上课地点特别详细(可以导航的地步)
    • 希望自定义上课前的提醒时间(清华的只要 15 分钟,在美国上学可能需要半小时,如果选择步行)

    此外,你还可能希望自己可以编辑单个 instance,例如由于调休或休假而取消等,或者生病而缺勤,或者想要保留退课前上的一次课程,但之后的就不用再出现了。

    我四年间断断续续用了好几种办法管理我的学术日历,从自己尝试写 app (后来放弃,工作量太大了,转到 Exchange + Outlook 强力组合),到 VBA (Outlook),现在终于沉淀了一个 PowerShell 脚本出来,高度可定制地创建和追踪学术日历事件。支持:

    • 交互式创建课程和输入上课时间信息(多个不同的 pattern,每个可以 override 一些属性)
    • 信息使用的对象模型可以被序列化和反序列化
    • 通过 Outlook 对象模型创建日历事件
    • 建立日历事件和课程对象之间的联系,退课之后可以批量删除
    • 当然也可以取消这两者之间的联系

    你可以 在我的这篇中文博文中了解更多 或者 转到 GitHub

    以下是两张用这种方法管理的日历截图:

    1

    图 1 大图

    2

    图 2 大图

    14 条回复    2018-09-25 11:41:50 +08:00
    YeT9
        1
    YeT9  
       2018-09-22 09:25:50 +08:00
    之前有人做了 iCal 日历导出(还不是贵系,是电子系做的)ˊ_>ˋ但可能后来年久失修…
    iRiven
        2
    iRiven  
       2018-09-22 09:40:25 +08:00 via Android
    你说的是这样子的玩意吗 https://yee2.github.io/schedule-to-google-calendar/
    Willjim
        3
    Willjim  
       2018-09-22 09:41:55 +08:00 via Android
    我们老师也做了个给大学教师用的 app(学术通),也是包括上课地点以及时间提醒,还可以追课题申报的进度。可以试试,虽然不是老师,学生用也差不多。同学上课还会互相提醒,老师教学事故有点可怕😂
    geelaw
        4
    geelaw  
    OP
       2018-09-22 09:55:40 +08:00 via iPhone
    @iRiven 类似,但是你不能之后批量删除?我现在在手机上,那个选择开学时间的控件是没法用的。以及对时间的控制只能适应一个学校的节数,也不能设置提醒时间。另外我不确定这个玩意儿对其他时区的支持。
    phy25
        5
    phy25  
       2018-09-22 10:35:46 +08:00 via Android
    从 iCalendar 的格式的角度来说,recurring event 设置 exception (EXDATE) 是非常正常的操作。一直在用手机的日历客户端 / Google Calendar,这样都能(人工)处理假期的情况,似乎也能优雅地保存下来。编辑的时候会提示是修改本次事件还是修改本次及以后事件这样子,基本能覆盖到上课党会遇到的各种情况吧。

    这个事情感觉似乎是低频操作,没有批量导入工具的情况下,其实全部用 GUI 人工做也并不是很累(毕竟半年一次而已),主要还是意识问题。

    顺便收藏了一个博客,感谢分享。
    cloverii
        6
    cloverii  
       2018-09-22 10:41:22 +08:00 via Android
    非 THU 学生,
    用 Google calendar 搞过自动导入,但课程表的最大问题是外界的变动,比如某课在某两周教室不一样,或者放假不上课,烦不胜烦。学校提供的日历是写明周次的,所以每节课创建一个单独的日程,坏处是不能批量编辑,幸好没有遇到这种需求场景
    另外,手机 app 上能展示地点的空间有限,地点详细到能导航的程度的话,基本上没地方展示最核心的教室编号了,所以我地点直接写教室编号,不过这是在我已经熟悉校园环境的前提下
    cloverii
        7
    cloverii  
       2018-09-22 10:42:44 +08:00 via Android
    @cloverii 手滑,是想说批量导入来着,说成自动导入了
    geelaw
        8
    geelaw  
    OP
       2018-09-22 11:52:30 +08:00
    @iRiven #2 回到电脑上看了一下,在 Edge 上这个日期选择器是可以用的。然后在 Edge 上无法“下载”,可能是支持问题。Chrome 上可以。时区也没太大问题,只要改变 Google Calendar 的时区似乎就行了。似乎这里完全没有设置 Reminder 时间的选项,以及不能删除。/facepalm

    @phy25 #5 我知道所有的日历软件、服务都支持 recurring appointment 的 exception。在文章开头说了 recurring 的若干个不方便之处。
    至于用 GUI,反正清华有 18 周都在上课的情况我是弄不来(太麻烦了,要填好多字段,而且很多是重复或者规律的)。美国这边我的学校是 quarter 制,一年会有三次,也挺烦的。我之前用每次自己写一次性脚本也觉得很麻烦。

    @cloverii #6 #7 如果你的地址是英文的,教室编号会在最前面(我现在处于这种情况里)。然后批量导入的情况也可以设置不同的教室。我一般是通知调休之后一次性把所有那天的 appointments 剪切到另一天;放假则是删除。

    批量编辑的情况主要有两个,一是退课需要删除后面所有的 occurrences,二是先前不知道上课地点,写的 TBA,要改成正确的。前一个情况这个脚本已经 cover 了,后一个情况下发生在学期初,可以批量删除之后重建。
    ranye
        9
    ranye  
       2018-09-22 13:39:40 +08:00
    iOS 上有个课表应用叫 iStudiez Pro 挺好用的,我大学四年都是用的这个,好像也出了 Android 版。
    你说的这些功能都支持,还可以记录每门课的作业、作业的 deadline 和占比,以及追踪 GPA
    楼上也说啦,像课表这种设置一次管半年的需求 GUI 可以满足了
    Wichna
        10
    Wichna  
       2018-09-22 15:28:26 +08:00
    为什么不用 Google Calendar API 同步到 Calendar 上面呢?
    geelaw
        11
    geelaw  
    OP
       2018-09-22 17:21:52 +08:00
    @Wichna #10

    使用 Google 的 API 只能访问 Gmail,如果要访问 Outlook.com/Exchange Online,又要用 Microsoft Graph API 实现一次。每次都要增加一些学习成本。为什么不使用已经存在的 Outlook 的同步和管理功能?

    此外,用 Outlook 对象模型操作:

    - 不需要自己做各种 authentication
    - 不需要用户当时在线
    - 相比各种 REST API 更快
    - 不用自己处理“操作到一半失败了需要回滚”之类的的问题( Outlook 已经帮你解决了)。

    此外,我不用 Gmail,但即使你问我为什么不用 Microsoft Graph API,前面这段的想法也是一样的。

    最后,我不确定 Google 的 API 和 Graph 是否支持 user properties, which 对于关联一个 appointment 到一个该程序里面的对象来说很重要。

    此外,即使不使用 Exchange,也可以在 Outlook 里面建一个辅助日历,用本地的代码建立好然后导出成 iCal,传入 Google Calendar 或者常见的 calendar 服务(例如 iCloud 的)。

    此外,还可以通过 Google Calendar Sync 在 Outlook 和 Google 之间双向同步日历,然后用 Outlook 对象模型完成这个操作。

    从实用角度,我觉得这个 app 做成本地的就够了。从个人角度,我只需要支持有 Outlook 的 Windows。只有我需要在更广的平台上推出该功能时(例如在 Web 上),才会考虑各种平台的 API。
    Wichna
        12
    Wichna  
       2018-09-22 17:33:36 +08:00
    @geelaw 感谢这么用心的回复,可能我对微软系 Outlook/Exchange 不太熟悉,我用 Google 的产品用的更多一些,不过还是很敬佩楼主这种 geek 精神
    geelaw
        13
    geelaw  
    OP
       2018-09-22 18:38:58 +08:00
    @Wichna #12 又想了想 #10 的要义:Outlook 对象模型可以抽象掉不同的服务提供商(甚至是不同的目的,无论是制作一个可以在网络上分发的日历,还是为了某个具体的服务使用)的区别,就是“接口”的思想,用 Outlook 对象模型作为个人信息管理的接口。
    EugeneLiu
        14
    EugeneLiu  
       2018-09-25 11:41:50 +08:00
    道国外有个产品专门来做日历管理的 http://ecal.com 。IOS 是支持地图显示,导航需要跳到自带的日历当中。如果不使用 Exchange 完全可以用 Github 作为服务器。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3789 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 00:14 · PVG 08:14 · LAX 16:14 · JFK 19:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.