因課程需求,作業需要以公開的形式繳交開發過程筆記及對應程式碼的連結至教師設置的公開筆記作業區。當學員直接編輯作業區筆記繳交作業時,時常忘了設置適當的 HackMD 權限,例如公開閱讀且登入者可修改。若有自動化檢查並提醒學員不適當的權限設置則可以省下可觀的溝通時間。
我們使用 Google 表單取得學員之 GitHub 帳號、作業程式碼網址、HackMD 筆記固定發布網址、基本聯絡資訊以及一些關於課程內容之基本問題。Apps script 是 Google 提供自動化旗下服務的平台,運行於 GCP 之上,語法是 Javascript 的子集合。使用範例如下
此處依我們的需求設置,若有其他需求請自行調整
setTrigger
執行,此時會需要授予該 Apps script 權限(注意事項2)。setTrigger
的作用為設置收到表單提交時要觸發的函式。也可以在專案內側邊欄選擇觸發條件,以使用者界面設置,但是欄位有點令人困惑且有可能點錯選項,不如固定執行設置函式。此權限會決定電子郵件發信者onSubmit
函式內讀取表單回應的 indexEMAIL.body
logError
函式之作用為依據參數檢查函式之回傳錯誤碼,紀錄錯誤原因於 EMAIL.body
內,若沒有錯誤 logError
會回傳 true,否則回傳 false
。checkNotePermission
函式需要一個參數 url
,此 url
為筆記固定發布網址字串,第一個 fetch
會取得此筆記的 note ID ,第二個 fetch 以 HackMD API 檢查此筆記之讀寫權限以及發布狀態,若有不符合預期者回傳錯誤碼,符合預期者紀錄筆記固定發布網址於 PUBLISHED_LINKS
內。PUBLISHED_LINKS
型態為 list ,可以滿足檢查並紀錄多個筆記之需求updateNote
函式需要此表單要更新之筆記的 note ID 字串、GitHub 使用者名稱字串,及要填入到筆記的內容字串。第一個 fetch 取得目前筆記之最新內容,接著尋找欲更新之使用者有無已提交之內容,若有則更新其內容(注意事項3),若無則新增內容於末端,有兩個以上的使用者提交紀錄會拋出錯誤。第二個 fetch 以 HackMD API 更新筆記內容。所有的 fetch 若有失敗皆會回傳錯誤碼test
函式,對照表單題目設置好 index 及回應字串後可從工具列執行以快速測試,此測試方法可以繞過表單上的內容驗證限制。執行此函式也會需要授予權限onSubmit
執行的紀錄,一次成功的提交會見到紀錄如下.*\n
的數量,比較好的寫法是要取\- \[ \]${username}\n
到 \- \[ \]
之間的內容,不過單純用 wildcard 表示中間的字元會有多個相符的結果,所以要扣除掉 -
, [
, ]
三種字元,才會從指定 GitHub 名稱該行的 \- \[ \]
開始剛好取到下一個 \- \[ \]
。但是我還沒找到正確寫法,目前依循 文件 及 ChatGPT 的建議嘗試使用以下寫法仍無法正確篩選
const toReplace = new RegExp(`- \\[ \\] ${username}\n([^\\-\\[\\]]|(\n))*- \\[ \\]`, 'm');
data.content = body.content.replace(toReplace, `- [ ] ${username}\n${linksStr}\n`);
- \\[ \\] ${username}\n(.|(\\n))*- \\[ \\]
會有多個相符結果而 replace
函式會取最後一個,也就是最廣的 - [ ]
到 - [ ]
的範圍取代{%hackmd note-id %}
) 此筆記內容,以維持此筆記只有一人編輯