
6차시: 시트 관리와 데이터 정렬
여러 시트 다루기와 데이터 정렬, 필터링 기법
📚 학습 목표
- 여러 시트를 생성, 삭제, 이동하는 방법 배우기
- 시트 간 데이터 복사 및 이동하기
- 데이터 정렬과 필터링 자동화하기
- 실전 예제: 부서별 데이터를 시트로 분리하고 관리하기
📖 시트(Sheet) 관리하기
1
시트의 개념과 접근 방법
스프레드시트는 여러 개의 시트로 구성됩니다. 각 시트는 독립적인 표 형태의 데이터를 담을 수 있습니다.
시트 접근 방법:
• getActiveSheet(): 현재 활성화된 시트
• getSheetByName("이름"): 이름으로 시트 찾기
• getSheets(): 모든 시트 배열로 가져오기
• insertSheet("이름"): 새 시트 만들기
• getActiveSheet(): 현재 활성화된 시트
• getSheetByName("이름"): 이름으로 시트 찾기
• getSheets(): 모든 시트 배열로 가져오기
• insertSheet("이름"): 새 시트 만들기
🚀 실습 1: 시트 생성과 관리
2
시트 생성하기
새로운 시트를 만들고 이름을 설정해봅시다:
실행하면 하단에 3개의 새 시트가 생성됩니다.
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
시트 정보 가져오기
스프레드시트의 모든 시트 정보를 확인합니다:
실행하면 모든 시트의 정보가 로그에 표시됩니다.
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차시 정리
이번 시간에는 여러 시트를 관리하고, 시트 간 데이터를 복사하며, 정렬 기능을 배웠습니다.부서별 데이터 자동 분류 시스템을 통해 실전에서 활용할 수 있는 기법을 익혔습니다.
다음 차시에서는 사용자 정의 함수와 메뉴를 만들어 더욱 편리한 스프레드시트를 구축해보겠습니다.
'AppSheet' 카테고리의 다른 글
| 구글 앱스크립트 8차시 - 이메일 자동화와 트리거 (1) | 2025.12.20 |
|---|---|
| 구글 앱스크립트 7차시 - 사용자 정의 함수와 메뉴 (2) | 2025.12.20 |
| 구글 앱스크립트 5차시 - 스프레드시트 Range 다루기 (1) | 2025.12.20 |
| 구글 앱스크립트 4차시 - 함수와 매개변수 (1) | 2025.12.20 |
| 구글 앱스크립트 3차시 - 조건문과 반복문 (1) | 2025.12.20 |