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); } // (这里是您现有的 'initialize' 和 'addProblem' 逻辑) 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); sheet.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 上尝试。