My Codeforces Journal 은 Codeforces 사용자가 해결한 문제를 추적하는 데 도움이 되는 Chrome 확장 프로그램입니다. 단 한 번의 클릭만으로 확장 프로그램은 현재 문제의 세부정보를 사용자가 연결한 Google 스프레드시트에 저장합니다. 이를 통해 시간이 지남에 따라 해결된 문제에 대한 개인 로그를 쉽게 유지할 수 있습니다.
이 크롬 확장 프로그램에 기여하고 싶으십니까? 이 저장소로 이동하십시오:My Codeforces Journal Development
원클릭 스토리지 : 현재 해결한 Codeforces 문제를 한 번의 클릭으로 저장합니다.
스프레드시트 통합 : 자신의 Google 스프레드시트를 연결하여 자신에게 맞는 형식으로 문제를 저장하고 정리하세요.
캡처된 문제 세부 정보 : 확장 프로그램은 문제 URL, 문제 이름, 문제 등급과 같은 주요 정보를 저장합니다.
YouTube 비디오 시청: My Codeforces Journal을 시작하는 방법
확장 기능을 사용하기 전에 다음 사항을 확인하세요.
문제가 저장될 Google 스프레드시트입니다.
Codeforces Journal Chrome 확장 프로그램이 설치되었으며 스프레드시트에 액세스할 수 있도록 승인되었습니다.
마지막에 있는 일반적인 오류 섹션을 꼭 읽어보세요.
다음 링크에서 dist
폴더를 다운로드하십시오: My Codeforces Journal
Chrome을 열고 chrome://extensions/
로 이동합니다.
오른쪽 상단에서 개발자 모드를 활성화합니다.
압축해제된 항목 로드 를 클릭하고 dist
폴더가 저장된 폴더를 선택합니다.
이제 확장 프로그램 페이지에 확장 프로그램이 표시됩니다.
쉽게 사용할 수 있도록 도구 모음에 확장 프로그램을 고정하세요.
새 Google 스프레드시트를 만듭니다.
원하는 대로 스프레드시트의 이름을 지정하십시오.
"확장" 메뉴를 클릭한 다음 "앱 스크립트"를 클릭하세요.
'제목 없음'을 클릭하고 이 앱 스크립트 파일의 이름을 스프레드시트 이름과 일치하도록 변경하세요.
아래 코드를 복사하여 App Script 편집기에 붙여넣고 cmd + S
/ ctrl + S
키를 눌러 저장하세요.
오른쪽 상단의 "배포" 버튼을 클릭하고 "새 배포"를 선택합니다.
선택한 설명을 추가합니다(SpreadSheet 이름과 동일할 수 있음).
'액세스 권한이 있는 사람'을 '누구나'로 설정하세요.
'배포'를 클릭하고 앱 스크립트를 승인합니다.
승인을 클릭하고 SpreadSheet를 만드는 데 사용한 Google 계정을 선택하면 "Google에서 이 앱을 확인하지 않았습니다"라는 메시지가 표시됩니다.
하단의 고급을 클릭하고,
표시된 AppScript 프로젝트의 이름을 클릭한 다음 허용을 클릭하세요.
프로젝트가 제대로 승인되었는지 확인하기 위해 AppScript 프로젝트를 재배포하세요.
AppScript URL이므로 스크립트 URL을 복사하고 나중에 확장 프로그램에서 사용할 수 있도록 저장합니다.
다시 "배포"버튼을 클릭하십시오
"배포 관리"를 선택하면 모달이 표시됩니다.
"편집" 버튼(펜 아이콘)을 클릭하면 이제 하단의 "배포" 버튼이 활성화됩니다.
배포를 클릭하세요
승인에 오류가 있는 경우 승인 버튼이 다시 표시되거나 그렇지 않으면 스크립트 URL을 복사하라는 메시지가 표시됩니다.
function doPost(e) { try { var sheet = 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 문제Exists = 문제NameColumn.includes(data.problemName); return ContentService.createTextOutput(JSON.stringify({ 상태: "성공", 존재: 문제Exists })).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("코드포스 시트"); 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 = 새로운 날짜(); sheet.getRange("E3:E1000").setNumberFormat("dd-mmm-yyyy"); sheet.insertRowBefore(3); sheet .getRange("A3:G3") .setValues([ [9999, "Problem9999Z", "Solved", "직관을 구현할 수 없습니다.", newDate, "재귀 작동 방식을 이해했습니다.", "재귀, DP, 그래프" ], ]); return ContentService.createTextOutput( '{"status":"success","message":"형식, 사용자 정의 열 너비 및 추가된 행으로 헤더가 초기화되었습니다."}' ).setMimeType(ContentService.MimeType.TEXT); } else { return ContentService.createTextOutput('{"status":"success","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 문제NameCell = sheet.getRange(lastRow, 2); if (data.problemUrl) { 문제이름Cell.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(오류) { return ContentService.createTextOutput('{"status":"error","message":"' + error.message + '"}').setMimeType(ContentService.MimeType.TEXT); }}
Codeforces 문제 페이지를 엽니다.
문제를 해결한 후 My Codeforces Journal 확장 아이콘을 클릭한 다음 "문제 추가"를 클릭하세요.
양식을 작성하고 "제출"을 누르세요.
문제 세부정보는 연결된 스프레드시트에 자동으로 저장됩니다.
이 확장 프로그램에는 다음 권한이 필요합니다.
활성 탭 : 문제 저장 시 현재 탭의 URL에 접근합니다.
저장공간 : 연결된 스프레드시트 세부정보를 저장합니다.
스크립팅 : JavaScript를 실행하기 위해
원인 : 이는 일반적으로 존재하지 않는 Codeforces ID가 제출된 경우에 발생합니다.
해결 방법 : ID가 올바른지 다시 확인하세요.
원인 : 이 오류는 일반적으로 제공된 AppScript URL이 올바르지 않음을 의미합니다.
해결 방법 : URL을 확인하고 올바른 AppScript URL을 사용하십시오.
추가 팁 : AppScript 프로젝트가 제대로 인증되지 않은 경우에도 이 오류가 나타날 수 있습니다. 적절한 승인을 보장하려면 다음을 수행하세요.
스프레드시트 설정 중에 AppScript 프로젝트를 두 번 배포합니다. 두 번째 배포는 AppScript 프로젝트가 완전히 인증되었는지 확인하는 데 도움이 됩니다.
원인 : 이 문제는 추가하려는 문제가 Codeforces에 대한 지난 40개의 제출 내에서 해결되지 않은 경우 발생합니다.
해결 방법 : 최근에 문제를 해결했는지 확인하세요. 그렇지 않은 경우 스프레드시트에 추가하기 전에 Codeforces에서 시도해 보십시오.