My Codeforces Journal是一款 Chrome 擴充程序,可協助 Codeforces 用戶追蹤他們已解決的問題。只需單擊一下,該擴充功能就會將當前問題的詳細資訊儲存到使用者已連接的 Google 試算表中。這樣可以輕鬆維護一段時間內解決的問題的個人日誌。
想為這個 chrom 擴充做出貢獻嗎?前往此儲存庫:我的 Codeforces 期刊開發
一鍵儲存:只需按一下即可儲存您已解決的目前 Codeforces 問題。
電子表格整合:連結您自己的 Google 電子表格,以適合您的格式儲存和組織問題。
捕獲的問題詳細信息:擴展程序存儲關鍵信息,例如問題 URL、問題名稱和問題評級。
觀看此 YouTube 影片:如何開始使用 My Codeforces Journal
在使用該擴充功能之前,請確保您具備以下條件:
將儲存問題的 Google 試算表。
已安裝 Codeforces Journal Chrome 擴充功能並有權存取您的電子表格。
請務必閱讀本文末尾的常見錯誤部分。
從以下連結下載dist
資料夾:我的 Codeforces Journal
打開 Chrome 並前往chrome://extensions/
。
在右上角啟用開發者模式。
點擊“載入已解壓縮的檔案”並選擇儲存dist
資料夾的資料夾。
該擴充功能現在應該在您的擴充頁面上可見。
將擴充功能固定在工具列上以方便使用。
建立一個新的 Google 試算表。
根據您的喜好命名電子表格。
點擊“擴充功能”選單,然後點擊“應用程式腳本”。
點擊“無標題”並重新命名此應用程式腳本檔案以符合您的電子表格的名稱。
複製下面的程式碼並將其貼上到應用程式腳本編輯器中,然後按cmd + S
/ ctrl + S
儲存
點擊右上角的“部署”按鈕,然後選擇“新部署”。
新增您選擇的描述(可以與電子表格的名稱相同)。
將“誰有權訪問”設定為“任何人”。
點選「部署」並授權App腳本,
點擊授權後,選擇您用於建立電子表格的 Google 帳戶,然後您將看到一條「Google 尚未驗證此應用程式」的訊息
點擊底部的高級,然後,
按一下顯示的 AppScript 項目的名稱,然後按一下允許
重新部署 AppScript 專案只是為了確保您的專案已獲得正確授權
複製腳本 URL,因為這是您的 AppScript URL,並將其儲存以供以後在擴充功能中使用。
再次點選“部署”按鈕
選擇“管理部署”,然後會出現一個模式
點擊“編輯”按鈕(筆圖示),現在底部的“部署”按鈕將變為活動狀態
點選部署
如果授權有錯誤,則會再次顯示授權按鈕,否則將顯示複製腳本 URL
函數 doPost(e) { 嘗試 { varsheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0]; // 解析傳入的請求資料 var data; 嘗試{ data = JSON.parse(e.postData.contents); } catch (parseError) { return ContentService.createTextOutput('{"status":"error","message":"無效的 JSON 格式。"}').setMimeType(ContentService.MimeType.TEXT); } // 檢查請求是否為檢查現有問題 if (data.action === "checkProblem") { const ProblemNameColumn = Sheet .getRange("B2:B" + Sheet.getLastRow()) .getValues() 。 (); const ProblemExists = ProblemNameColumn.includes(data.problemName); return ContentService.createTextOutput(JSON.stringify({ status: "success", Exists: ProblemExists })).setMimeType(ContentService.MimeType.JSON); } // (這裡是您現有的「初始化」和「新增問題」邏輯) if (data.action === "initialize") { var headers = ["Rating", "Problem", "Status", " Remarks", "日期」、「外帶」、「主題」]; if (sheet.getLastRow() === 0 ||sheet.getRange("A1").getValue() === "") { // 初始化邏輯保持不變sheet.getRange("A1:G1")。合併(); sheet.getRange("A1").setValue("Codeforces Sheet"); sheet.getRange("A1").setFontSize(13).setHorizontalAlignment("center").setBackground("#ffd966"); sheet.getRange("A2:G2").setValues([headers]); sheet.getRange("A2:G2").setFontSize(12).setHorizontalAlignment("center").setBackground("#93c47d"); sheet.setColumnWidth(1, 75); sheet.setColumnWidth(2, 185); sheet.setColumnWidth(3, 155); sheet.setColumnWidth(4, 290); sheet.setColumnWidth(5, 80); sheet.setColumnWidth(6, 530); 工作表.setColumnWidth(7, 190); sheet.getRange("A2:G1000").setVerticalAlignment("中間"); sheet.getRange("C2:C1000").setWrap(true); sheet.getRange("D2:D1000").setWrap(true); sheet.getRange("F2:F1000").setWrap(true); sheet.getRange("G2:G1000").setWrap(true); sheet.getRange("A2:A1000").setHorizontalAlignment("center"); sheet.getRange("B2:B1000").setHorizontalAlignment("center"); sheet.getRange("E2:E1000").setHorizontalAlignment("center"); sheet.getRange("G2:G1000").setHorizontalAlignment("center"); var newDate = new Date(); sheet.getRange("E3:E1000").setNumberFormat("dd-mmm-yyyy"); sheet.insertRowBefore(3); sheet .getRange("A3:G3") .setValues([ [9999, "Problem9999Z", "已解決", "無法實現我的直覺", newDate, "我理解遞歸是如何運作的", "遞歸,DP ,圖" ],]); return ContentService.createTextOutput( '{"status":"success","message":"使用格式、自訂列寬和新增的行初始化的標頭。"}' ).setMimeType(ContentService.MimeType.TEXT); } else { return ContentService.createTextOutput('{"status":"成功","message":"標頭已存在。"}').setMimeType(ContentService.MimeType.TEXT); } } else if (data.action === "addProblem") { try { const newRow = [data.problemRating, data.problemName, data.problemStatus, data.remarks, data.dateSolved, data.takeaways, data.problemTopics] ; const lastRow =sheet.getLastRow() + 1; sheet.appendRow(newRow); const ProblemNameCell = Sheet.getRange(lastRow, 2); if (data.problemUrl) { ProblemNameCell.setValue(data.problemName).setFormula(`=HYPERLINK("${data.problemUrl}", "${data.problemName}")`); return ContentService.createTextOutput('{"status":"success","message":"使用超連結新增問題資料。"}').setMimeType( ContentService.MimeType.JSON ); } catch (addError) { return ContentService.createTextOutput('{"status":"error","message":"新增問題資料失敗。"}').setMimeType( ContentService.MimeType.TEXT ); } } } catch (error) { return ContentService.createTextOutput('{"status":"error","message":"' + error.message + '"}').setMimeType(ContentService.MimeType.TEXT); }}
開啟任意 Codeforces 問題頁面。
解決問題後,按一下「我的 Codeforces Journal」擴充圖標,然後按一下「新增問題」。
填寫表格,然後按「提交」。
問題詳細資訊將自動儲存到連接的電子表格中。
此擴充功能需要以下權限:
活動標籤:儲存問題時存取目前標籤的 URL。
儲存:儲存連接的電子表格詳細資訊。
腳本編寫:運行 JavaScript
原因:如果提交了不存在的 Codeforces ID,通常會發生這種情況。
解決方案:仔細檢查 ID 並確保其正確。
原因:此錯誤通常表示提供的 AppScript URL 不正確。
解決方案:驗證 URL 並使用正確的 AppScript URL。
其他提示:如果您的 AppScript 專案尚未獲得正確授權,也可能會發生此錯誤。為確保正確授權:
在電子表格設定期間,部署您的 AppScript 專案兩次;第二次部署將有助於確認 AppScript 專案已獲得完全授權。
原因:如果您嘗試新增的問題在 Codeforces 上的最近 40 次提交中尚未解決,就會發生這種情況。
解決方案:確保您最近已經解決了該問題。如果沒有,請在將其添加到電子表格之前在 Codeforces 上嘗試。