学术日历(课程表)的管理方法和工具 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
geelaw
V2EX    分享创造

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

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

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

    • 清华没有直接提供 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     Solana     5134 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 01:19 PVG 09:19 LAX 17:19 JFK 20:19
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86