05의 개발 계발

[GoogleSheet] Github repos, 공개여부 Check Solution (public / private) 본문

카테고리 없음

[GoogleSheet] Github repos, 공개여부 Check Solution (public / private)

생각하는 코댕이 2024. 6. 10. 09:00
728x90

Goal

  • Github repos url 이 주어졌을 때, GAS를 사용해 JS로 코딩하여 (public / private) 공개여부를 파악 할 수 있다.

1) 문제점 (Problem)

repos 가 공개되어있는지 확인이 필요하다.

제출된 Github repos url 중 private(비공개) 처리 되어 확인이 불가한 경우, public(공개) 변환 조치가 필요했다.
직접 클릭해서 확인 한다는 것은... 용납할 수 없게 너무나 비효율적인 일이기에 자동화를 시도하였다.


2) 시도해본 것들 (Try)

▶시도1

우리의 친구 wrtn(뤼튼) 과 진중한 대화를 주고 받았다.
한번에 답을 주진 못했지만, JS로 API 통신을 해봤기에 뼈대에서 조금 수정해서 시트에 적용시켰다.


3) 해결 (Solution)

Google App Script 로 해결

function checkReposStatus() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('public체크'); // 적용시킬 시트의 이름
  var startRow = 2; // 데이터가 있는 첫 번째 행의 번호 (헤더를 제외한 첫 번째 행)
  var numRows = sheet.getLastRow() - 1; // 데이터가 있는 행의 수를 계산

  // C열에서 URL 목록을 가져옵니다.
  var dataRange = sheet.getRange(startRow, 3, numRows, 1);
  var data = dataRange.getValues();

  for (var i = 0; i < data.length; i++) {
    var url = data[i][0];
    if (url) {
      // GitHub API의 URL 형식에 맞게 사용자 이름과 레파지토리 이름을 추출합니다.
      var matches = url.trim().match(/github\.com\/([^\/]+)\/([^\/]+?)(?:\.git)?(?:\/|$)/);
      if (matches) {
        var apiUrl = "https://api.github.com/repos/" + matches[1] + "/" + matches[2]; // apiUrl 변수를 추가합니다.
        var response = UrlFetchApp.fetch(apiUrl, {
          'method': 'get',
          'muteHttpExceptions': true, // HTTP 예외 발생 시 스크립트가 중단되지 않도록 설정
          'headers': {
            'Accept': 'application/vnd.github.v3+json'
          }
        });

        // 응답 코드를 확인하여 공개 여부를 결정합니다.
        if (response.getResponseCode() == 200) {
          var json = JSON.parse(response.getContentText());
          var repoStatus = (json.private) ? "Private" : "Public";
          // 결과를 같은 행의 D열에 기록합니다.
          sheet.getRange(startRow + i, 4).setValue(repoStatus);
        } else {
          // 응답 코드가 200이 아닐 경우 에러 메시지를 기록합니다.
          sheet.getRange(startRow + i, 4).setValue("Error: " + response.getResponseCode());
        }
      } else {
        // URL이 GitHub 레파지토리의 표준 형식과 일치하지 않는 경우
        sheet.getRange(startRow + i, 4).setValue("Invalid URL");
      }
    }
  }
}

Google App Script에서 위 코드를 실행한 결과

+ [한걸음 더] Script 작동 버튼 생성

스케줄링을 통해 주기적으로 작동하게 할 수 도 있지만, 실시간 트래킹이 필요한 업무는 아니니 트리거를 생성해 보았다.
매번 확장을 들어가 실행하는 수고로움을 줄일 수 있다. 앞으로 애용할 코드니깐 기억해야겠다.

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  // 메뉴를 추가합니다.
  ui.createMenu('GitHub Checker')
    .addItem('Check Repositories', 'checkReposStatus')
    .addToUi();
}

Google Sheet에서 확인되는 결과


4) 알게 된 점  (Learnd)

추가적으로 고민으로 메뉴에 트리거를 추가하는 기능을 알게되었다. 앞으로 자주 애용할 것 같다.

개발자도구를 통해 Status를 확인해보니, Tistory를 포함한 대부분의 비공개글에서는 ResponseCode로 404를 리턴한다.
이를 활용한다면 Github 뿐만 아니라 대부분의 사이트에서도 활용이 가능할 것 같다.

728x90