本文同步發布在個人博客,電腦端從博客頁面查看可以獲得更好的體驗。
連結:https://blog.rneko.com/archives/49/
或點擊閱讀原文查看!!
項目地址:
https://github.com/Xm798/ClasstableToIcalforNUAA
其實是微信公眾號排版真的太麻煩了(((以及超連結可能都是不允許添加的,麻煩各位看官通過閱讀原文跳轉吧!
本文排版使用Md2All自動渲染生成。
當然是為了優雅。
可以方便地自定義和修改課程;
可以將課表作為小部件放到桌面上,方便而實用;
可以準確地管理上課時間,並將課程和其他日程安排統一管理;
可以很容易地處理調課等突發情況;
可以設置上課前N分鐘提醒,避免忘記上課;
脫離臃腫的充斥著廣告的大學生課表應用;
可以藉助Google Calendar或Outlook Calendar做到全平臺融合,在電腦、手機、PAD甚至Web網頁都可以管理課程;
可以藉助滴答清單等To-Do-List應用安排日程,iOS用戶還有好用而漂亮的Sorted3可以使用。
那麼,何樂而不為呢?
效果展示手機系統日曆在@Triple-Z、@MiaoTony等同學的努力下,我校本科生已經可以很方便地從教務系統,獲取課表並生成 iCal 日曆文件,以導入Google Calendar、Outlook或系統日曆。
具體項目參見NUAA_ClassSchedul,該項目還有一個漂亮又易用的在線版本。
而遺憾的是截至目前,研究生信息管理系統還尚未對接成功,所以無法一鍵導出=_=。但得益於@陳某豪和@SunsetYe66的貢獻,我們依然可以較為優雅地將課錶轉換為ics日曆文件。
生成ics文件 部署項目從 GitHub 拉取程序
git clone https://github.com/Xm798/ClasstableToIcalforNUAA.git
確保本機已安裝Python 3環境,然後安裝依賴
pip install uuid xlrd
登錄南京航空航天大學研究生信息管理系統,進入到「課程學習」-「選課結果查詢」模塊之中,點擊「導出數據」,獲得一份選課結果的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 的製作進行預處理。
在拆分完成的表格中繼續操作,選中時間一列,點擊「數據-分列」,依次選擇「分隔符號、空格、完成」,將星期和節次拆分。
而後,在節次右側的兩個單元格分別使用以下兩個公式,並下拉填充,將星期和節次轉換為對應的數字。
=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中的欄位含義為:
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.xlsx 。weekStatus填寫0,並補充線上課的classroom為線上即可。
該部分直接引用腳本作者教程。
我校2020-2021學年第一學期第一周的日期輸入20200831。
打開命令提示符或終端,定位到該項目根目錄下。
然後執行 main.py:
python main.py
或
python3 main.py
首先選 2 進入課程信息讀取工具:若未修改過 Excel 文件結構,直接回車即可;若提示成功,文件夾中將多出一個新的 JSON 文件。
此時,再輸入 3 進入 iCal 生成工具,按提示輸入必需信息後即可生成最終文件。請注意此處輸入的日期必須嚴格按照提示輸入開學第一周周一的日期,且該日期的格式是 YYYYMMDD,即 年年年年月月日日,中間不加符號。
我校本學期第一周時間為8月31日,輸入20200831。
注意:導入任何日曆之前,都建議新建一個新的日曆用於導入操作,便於出錯時批量修改,以及不同顏色更容易區分。
iOS設備直接將生成的文件傳輸到手機後點擊打開,選擇「導入日曆」即可。
部分Android設備的原生日曆並不支持ics文件的導入功能,其實更加推薦的方法是藉助於Google Calendar或者Outlook來完成日程管理,因為無論是谷歌日曆還是微軟的Outlook,都可以很方便的完成手機、PAD與Windows設備之間的日曆同步。
如果有科學手段,可以選用Google Calendar,如果沒有,Outlook也是一個極為不錯的選擇,全憑個人喜好。
Google Calendar導入電腦端打開Google Calendar,選擇添加其他日曆-導入,記得選擇一個單獨的日曆,如果沒有,可以新建一個。點擊導入,即可完成。
也可以在手機端完成導入,在安裝好谷歌日曆的情況下,直接點擊接收到的ics文件,選擇使用「日曆」打開,即可。
電腦端訪問Outlook,使用微軟帳號登錄。
點擊左側的「日曆」,添加日曆-創建空白日曆,新建一個課表日曆。
然後選擇「從文件上傳」,選擇生成的ics文件,導入到創建的課表日曆中即可。
或者,Windows10系統可以直接在本地右鍵ics文件,選擇使用系統日曆打開。
然後導入到日曆即可。首次使用可能需要登錄帳號,此處登錄微軟帳號或Gmail或其他任何支持的帳號都可以。
在手機端、電腦端、PAD端登錄同一帳號之後,即可實現全平臺同步。
Android端若使用Google Calendar,手機端需要安裝谷歌日曆應用;若使用Outlook,手機端需要安裝Outlook應用。當然,部分安卓作業系統的系統日曆可以直接訂閱谷歌日曆和Outlook的日曆,不安裝App使用系統日曆也完全OK。
例如,小米日曆在「日曆-設置-日曆帳號管理」中,可以添加Gmail日曆。
添加日曆帳號電腦端Windows10系統使用系統的「郵件與日曆」應用,登錄對應帳號,即可完成電腦端平臺的日曆同步。
如果是使用Google服務,需要先解除UWP應用的代理限制,請自行搜索「解除UWP應用網絡隔離」,或參閱Win10解除UWP應用網絡隔離允許訪問代理。推薦使用Fiddler中的WinConfig模塊,全部解除隔離。
感謝@陳某豪和@SunsetYe66的項目貢獻!