본문 바로가기
AppSheet

구글 앱스크립트 6차시 - 시트 관리와 데이터 정렬

by 에버리치60 2025. 12. 20.

 

구글 앱스크립트 6차시 - 시트 관리와 데이터 정렬

6차시: 시트 관리와 데이터 정렬

여러 시트 다루기와 데이터 정렬, 필터링 기법

📚 학습 목표
  • 여러 시트를 생성, 삭제, 이동하는 방법 배우기
  • 시트 간 데이터 복사 및 이동하기
  • 데이터 정렬과 필터링 자동화하기
  • 실전 예제: 부서별 데이터를 시트로 분리하고 관리하기

📖 시트(Sheet) 관리하기

1 시트의 개념과 접근 방법
스프레드시트는 여러 개의 시트로 구성됩니다. 각 시트는 독립적인 표 형태의 데이터를 담을 수 있습니다.
시트 접근 방법:
getActiveSheet(): 현재 활성화된 시트
getSheetByName("이름"): 이름으로 시트 찾기
getSheets(): 모든 시트 배열로 가져오기
insertSheet("이름"): 새 시트 만들기

🚀 실습 1: 시트 생성과 관리

2 시트 생성하기
새로운 시트를 만들고 이름을 설정해봅시다:
function 시트생성() {
  let ss = SpreadsheetApp.getActiveSpreadsheet();
  
  // 새 시트 만들기
  let 새시트1 = ss.insertSheet("영업부");
  let 새시트2 = ss.insertSheet("개발부");
  let 새시트3 = ss.insertSheet("인사부");
  
  // 시트에 간단한 데이터 추가
  새시트1.getRange("A1").setValue("영업부 데이터");
  새시트2.getRange("A1").setValue("개발부 데이터");
  새시트3.getRange("A1").setValue("인사부 데이터");
  
  Logger.log("3개의 시트가 생성되었습니다.");
  SpreadsheetApp.getActiveSpreadsheet().toast("시트 생성 완료!", "완료", 3);
}
실행하면 하단에 3개의 새 시트가 생성됩니다.
3 시트 정보 가져오기
스프레드시트의 모든 시트 정보를 확인합니다:
function 시트목록확인() {
  let ss = SpreadsheetApp.getActiveSpreadsheet();
  let 모든시트 = ss.getSheets();
  
  Logger.log("=== 시트 목록 ===");
  Logger.log("전체 시트 개수: " + 모든시트.length);
  
  for (let i = 0; i < 모든시트.length; i++) {
    let 시트 = 모든시트[i];
    let 이름 = 시트.getName();
    let 행수 = 시트.getLastRow();
    let 열수 = 시트.getLastColumn();
    
    Logger.log((i+1) + ". " + 이름 + 
               " (행: " + 행수 + ", 열: " + 열수 + ")");
  }
  
  // 특정 시트 접근
  let 영업부시트 = ss.getSheetByName("영업부");
  if (영업부시트) {
    Logger.log("영업부 시트를 찾았습니다!");
  }
}
실행하면 모든 시트의 정보가 로그에 표시됩니다.
4 시트 이름 변경 및 색상 설정
시트를 시각적으로 구분하기 쉽게 만듭니다:
function 시트꾸미기() {
  let ss = SpreadsheetApp.getActiveSpreadsheet();
  
  // 영업부 시트 - 빨간색
  let 영업부 = ss.getSheetByName("영업부");
  if (영업부) {
    영업부.setTabColor("#ff0000");
    영업부.setName("영업부_2024");
  }
  
  // 개발부 시트 - 파란색
  let 개발부 = ss.getSheetByName("개발부");
  if (개발부) {
    개발부.setTabColor("#0000ff");
  }
  
  // 인사부 시트 - 녹색
  let 인사부 = ss.getSheetByName("인사부");
  if (인사부) {
    인사부.setTabColor("#00ff00");
  }
  
  Logger.log("시트 색상 설정 완료!");
}
실행하면 시트 탭에 색상이 적용됩니다.
5 시트 간 데이터 복사하기
한 시트의 데이터를 다른 시트로 복사합니다:
function 시트간데이터복사() {
  let ss = SpreadsheetApp.getActiveSpreadsheet();
  
  // 원본 시트에 데이터 준비
  let 원본시트 = ss.getSheetByName("영업부_2024");
  원본시트.clear();
  
  let 데이터 = [
    ["이름", "매출", "달성률"],
    ["홍길동", 5000000, "120%"],
    ["김철수", 4500000, "110%"],
    ["이영희", 3800000, "95%"]
  ];
  원본시트.getRange(1, 1, 4, 3).setValues(데이터);
  
  // 대상 시트로 복사
  let 대상시트 = ss.getSheetByName("개발부");
  대상시트.clear();
  
  // 범위 복사
  let 복사범위 = 원본시트.getRange("A1:C4");
  let 복사값 = 복사범위.getValues();
  대상시트.getRange(1, 1, 4, 3).setValues(복사값);
  
  // 서식도 함께 복사하려면
  복사범위.copyTo(대상시트.getRange("A1"), 
                   SpreadsheetApp.CopyPasteType.PASTE_NORMAL, 
                   false);
  
  Logger.log("데이터 복사 완료!");
  SpreadsheetApp.getActiveSpreadsheet().toast("데이터가 복사되었습니다!", "완료", 3);
}
실행하면 영업부 데이터가 개발부 시트로 복사됩니다.

🔀 데이터 정렬하기

6 기본 정렬 기능
데이터를 특정 열 기준으로 정렬합니다:
function 데이터정렬() {
  let sheet = SpreadsheetApp.getActiveSheet();
  sheet.clear();
  
  // 테스트 데이터 준비
  let 데이터 = [
    ["이름", "점수", "등급"],
    ["김민수", 85, "B"],
    ["이지은", 95, "A"],
    ["박준호", 78, "C"],
    ["최유진", 92, "A"],
    ["정하늘", 88, "B"]
  ];
  sheet.getRange(1, 1, 6, 3).setValues(데이터);
  
  // 점수 기준 내림차순 정렬 (높은 점수가 위로)
  let 정렬범위 = sheet.getRange("A2:C6"); // 제목 제외
  정렬범위.sort({column: 2, ascending: false});
  
  Logger.log("점수 기준 정렬 완료!");
  SpreadsheetApp.getActiveSpreadsheet().toast("정렬 완료!", "완료", 3);
}
실행하면 점수가 높은 순서대로 정렬됩니다.
7 다중 조건 정렬
여러 기준으로 동시에 정렬할 수 있습니다:
function 다중정렬() {
  let sheet = SpreadsheetApp.getActiveSheet();
  sheet.clear();
  
  // 더 복잡한 데이터
  let 데이터 = [
    ["부서", "이름", "연봉", "입사년도"],
    ["영업", "홍길동", 4500, 2020],
    ["개발", "김철수", 5500, 2019],
    ["영업", "이영희", 4200, 2021],
    ["개발", "박민수", 5800, 2018],
    ["영업", "최지우", 4500, 2019],
    ["인사", "정하늘", 4000, 2022],
    ["개발", "강동원", 6000, 2017]
  ];
  sheet.getRange(1, 1, 8, 4).setValues(데이터);
  
  // 1순위: 부서(오름차순), 2순위: 연봉(내림차순)
  let 정렬범위 = sheet.getRange("A2:D8");
  정렬범위.sort([
    {column: 1, ascending: true},   // 부서 오름차순
    {column: 3, ascending: false}   // 연봉 내림차순
  ]);
  
  // 헤더 서식
  sheet.getRange("A1:D1")
    .setBackground("#4285f4")
    .setFontColor("#ffffff")
    .setFontWeight("bold");
  
  Logger.log("다중 조건 정렬 완료!");
}
실행하면 부서별로 묶이고, 같은 부서 내에서 연봉순으로 정렬됩니다.

🎯 실습 2: 부서별 데이터 자동 분류 시스템

8 통합 데이터 준비 및 부서별 분리
하나의 시트에 있는 데이터를 부서별로 자동 분리합니다:
function 부서별분리시스템() {
  let ss = SpreadsheetApp.getActiveSpreadsheet();
  
  // 메인 시트 준비
  let 메인시트 = ss.getActiveSheet();
  메인시트.setName("전체직원");
  메인시트.clear();
  
  // 전체 직원 데이터
  let 직원데이터 = [
    ["이름", "부서", "직급", "연봉", "평가"],
    ["홍길동", "영업", "대리", 4500, "A"],
    ["김철수", "개발", "과장", 5500, "B"],
    ["이영희", "영업", "사원", 3500, "A"],
    ["박민수", "개발", "부장", 7000, "A"],
    ["최지우", "인사", "대리", 4200, "B"],
    ["정하늘", "영업", "과장", 5200, "A"],
    ["강동원", "개발", "대리", 5000, "C"],
    ["송혜교", "인사", "과장", 4800, "A"],
    ["전지현", "영업", "사원", 3800, "B"],
    ["이병헌", "개발", "사원", 4000, "B"]
  ];
  
  메인시트.getRange(1, 1, 직원데이터.length, 5).setValues(직원데이터);
  
  // 헤더 서식
  메인시트.getRange("A1:E1")
    .setBackground("#1a73e8")
    .setFontColor("#ffffff")
    .setFontWeight("bold")
    .setHorizontalAlignment("center");
  
  // 부서 목록 추출
  let 부서목록 = {};
  for (let i = 1; i < 직원데이터.length; i++) {
    let 부서 = 직원데이터[i][1];
    if (!부서목록[부서]) {
      부서목록[부서] = [];
    }
    부서목록[부서].push(직원데이터[i]);
  }
  
  // 부서별 시트 생성 및 데이터 입력
  for (let 부서 in 부서목록) {
    // 기존 시트 삭제 (있으면)
    let 기존시트 = ss.getSheetByName(부서);
    if (기존시트 && 기존시트.getName() !== "전체직원") {
      ss.deleteSheet(기존시트);
    }
    
    // 새 시트 생성
    let 부서시트 = ss.insertSheet(부서);
    
    // 헤더 입력
    부서시트.getRange(1, 1, 1, 5).setValues([직원데이터[0]]);
    부서시트.getRange("A1:E1")
      .setBackground("#4285f4")
      .setFontColor("#ffffff")
      .setFontWeight("bold");
    
    // 해당 부서 직원 데이터 입력
    let 부서직원 = 부서목록[부서];
    부서시트.getRange(2, 1, 부서직원.length, 5).setValues(부서직원);
    
    // 연봉 기준 정렬 (내림차순)
    if (부서직원.length > 1) {
      부서시트.getRange(2, 1, 부서직원.length, 5)
        .sort({column: 4, ascending: false});
    }
    
    // 열 너비 자동 조정
    부서시트.autoResizeColumns(1, 5);
    
    // 시트 색상 설정
    if (부서 === "영업") 부서시트.setTabColor("#ff0000");
    else if (부서 === "개발") 부서시트.setTabColor("#0000ff");
    else if (부서 === "인사") 부서시트.setTabColor("#00ff00");
  }
  
  Logger.log("부서별 분리 완료!");
  SpreadsheetApp.getActiveSpreadsheet().toast(
    "부서별 시트가 생성되었습니다!", 
    "완료", 
    5
  );
}
실행하면 부서별로 시트가 자동 생성되고 데이터가 분류됩니다!
💡 시트 관리 팁
  • 시트 이름 규칙: 날짜나 버전을 포함하면 관리가 쉽습니다 (예: "영업_2024_12")
  • 색상 활용: 시트 탭 색상으로 카테고리를 구분하면 시각적으로 편리합니다
  • 정렬 전 백업: 중요한 데이터는 정렬 전에 시트를 복사해두는 것이 안전합니다
  • 성능 고려: 시트가 너무 많으면 느려질 수 있으니 적절히 관리하세요
⚠️ 주의사항
  • 시트를 삭제할 때는 실수로 중요한 시트를 지우지 않도록 주의하세요
  • 같은 이름의 시트는 생성할 수 없습니다 (오류 발생)
  • 정렬 시 제목 행(헤더)을 포함하지 않도록 범위를 정확히 지정하세요
  • sort() 메서드의 column은 범위 내 상대 위치입니다 (1부터 시작)
🎯 6차시 정리
이번 시간에는 여러 시트를 관리하고, 시트 간 데이터를 복사하며, 정렬 기능을 배웠습니다.
부서별 데이터 자동 분류 시스템을 통해 실전에서 활용할 수 있는 기법을 익혔습니다.
다음 차시에서는 사용자 정의 함수와 메뉴를 만들어 더욱 편리한 스프레드시트를 구축해보겠습니다.