Google 스프레드시트 자동 데이터 연동 (ChatGPT 활용)

조아연·2025년 11월 19일

JavaScript 공부

목록 보기
24/24

게임을 플레이하면서 매일 사냥으로 얻은 재화들의 가치를 자동으로 계산하고,
일별 데이터를 한눈에 확인할 수 있는 문서를 만들면 편리하겠다고 생각하여,
이를 구연할 수 있는 수식 문서를 만들어보기로 결심했다.


목표

일별 사냥을 통해 획득한 아이템의 가치를 게임 내 재화인 "메소"로 환산
추가로, 매일 누적되는 "메소"의 데이터를 하나의 시트에서 확인 할 수 있도록 구현
 

1. 대상 항목 선정 및 분류

  • 대상 아이템 파악

먼저 일정 금액 이상의 가치를 가지고 있는 아이템만 추려 파악을 먼저 진행했다.

  

  • 아이템 분류 및 서식 설계

이후에는 어떤 서식으로, 어떤 수식을 통해 문서를 작성할지 기본 가안을 잡았다.
 

2. 기본 수식 입력 및 서식 수정

필요한 기본 데이터를 다 입력 한 후에는 기본적인 SUM 등의 함수를 입력하며 기본 수식을 생성했다.

인 게임 데이터를 대조하며 금액을 입력하던 중, 만약 금액이 커지면 가독성이 떨어 질 것 같다는 생각이 들어 인 게임 노출 단위처럼 수정하고자 마음을 먹었다.

그래서 스프레드시트 맞춤 숫자 형식을 통해 수정하려고 했지만, 숫자와 문자가 여러개가 들어가서 맘처럼 서식이 완성되지 않았다.

방법을 찾다가 스크립트를 직접 추가하면 될 것 같아서 Apps Script내 GTP를 통해 짠 스크립트를 추가해서 저장했다.

코드 원문

  value = Number(value);

  if (isNaN(value)) return "";

  var 억 = Math.floor(value / 100000000);
  var 만 = Math.floor((value % 100000000) / 10000);
  var 원 = value % 10000;

  var 억_str = 억.toString();
  var 만_str = Utilities.formatString("%04d", 만);
  var 원_str = Utilities.formatString("%04d", 원);

  return 억_str + "억" + 만_str + "만" + 원_str;
}


모든 금액에 스크립트를 불러오면 문서의 로딩이 느려질 수 있을 것 같아서
결국 최종적으로 확인하게 되는 일 획득 총액에만 스크립트를 불러 올 수 있도록 설정했다.

  
 

3. 자동 데이터 연동 및 갱신

초반 목표했던 자동 환산 시트는 만들었지만,
해당 시트가 매 일마다 누적 될 경우 하나하나 직접 들어가서 금액을 확인해야 하는 불편함이 있기에 데이터를 한번에 확인하고 동기화 할 수 있는 스크립트를 추가했다'

GPT에게 어떤것을 만들고자 여러번 설명한 끝에, 원하던 스크립트를 알아 낼 수 있었지만 시트를 수정 할 때마다 변경 데이터가 수시로 누적되어 원하던 일 별 데이터만 파악할 수가 없었다.

심지어 어떤 기준으로 나열되는지도 모르겠어서 JS 스크립트를 직접 배운적은 없지만 조금씩 찾아가면서 틀린 부분을 GPT에게 다시 설명하고 물어보면서 새로 스크립트를 받았다.

스크립트를 저장 후 실행해보려 하는데, 이번엔 권한이 없다고 해서 google 권한을 추가로 받고 다시 시도하니 정상적으로 실행로그가 찍혔다.

데이터를 갱신 시킬 시점을 시간으로 정할까, 버튼 형식으로 할까, 새로고침 형식으로 할까 고민하며 이것 저것 스크립트를 물어보고 실행했는데, 제대로 동작되지 않아 또 찾아보다가 결국 원인을 찾았다.

그래서 아에 스크립트를 실행 시킨 시점으로 갱신 될 수 있는 스크립트로 바꿔달라고 부탁했다.

코드 원문

function updateMasterFromSheets() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var masterSheet = ss.getSheetByName("마스터");

  // 마스터 시트 없으면 생성
  if (!masterSheet) {
    masterSheet = ss.insertSheet("마스터");
    masterSheet.appendRow(["시트이름", "일자", "총액"]);
  }

  var sheets = ss.getSheets();
  var newMasterValues = [];

  // 1️⃣ 서식 시트만 처리, 생성 순서대로
  for (var i = 0; i < sheets.length; i++) {
    var sheet = sheets[i];
    var name = sheet.getName();
    if (!name.startsWith("서식(")) continue;

    var dateValue = sheet.getRange("D5").getValue();
    var totalValue = sheet.getRange("E3").getValue();
    newMasterValues.push([name, dateValue, totalValue]);
  }

  // 2️⃣ 마스터 시트 초기화 후 새 값 채우기
  // 기존 데이터 삭제
  if (masterSheet.getLastRow() > 1) {
    masterSheet.getRange(2, 1, masterSheet.getMaxRows() - 1, 3).clearContent();
  }

  // 새 데이터 입력
  if (newMasterValues.length > 0) {
    masterSheet.getRange(2, 1, newMasterValues.length, 3).setValues(newMasterValues);
  }

  SpreadsheetApp.getUi().alert("마스터 시트 동기화 완료! 총 " + newMasterValues.length + "개 시트 반영됨.");
}

상단 "실행"을 통해 수동으로 갱신을 해주면 아래와 같은 팝업이 뜨며 갱신이 완료된다.

이러한 작업 덕분에 많은 시트들을 수동으로 들어가지 않고, 일자별로 총액을 한눈에 확인 할 수 있다.
또한, 일별로 누적되기에 각 아이템의 값어치도 같이 기록되어 쉽게 파악 할 수 있었다.


문서를 만들면서 느꼈던 점은 JavaScript 코드를 처음부터 끝까지 직접 짤 순 없지만 무언가 만들고 싶다는 목표가 생기면 문서화 작업이든 결과물을 만드는 작업이든 시간가는 줄도 모르고 몰입해서 만들게 되는 것 같다.
아직 많이 부족하지만 오늘도 하나 더 배우고 성장했다는 점이 기쁘다.

profile
비전공자 QA의 자기개발 공부노트

0개의 댓글