
5차시: 스프레드시트 Range 다루기
셀 범위를 효율적으로 다루는 고급 기법
📚 학습 목표
- Range 객체의 다양한 메서드 이해하기
- 여러 셀을 한번에 읽고 쓰는 방법 배우기
- 셀 서식(색상, 폰트, 정렬) 적용하기
- 실전 예제: 데이터 일괄 처리 및 보고서 자동 생성
📖 Range란 무엇인가?
1
Range 객체 이해하기
Range는 스프레드시트의 셀 또는 셀 범위를 나타내는 객체입니다. 한 개의 셀부터 여러 행과 열을 포함하는 범위까지 다룰 수 있습니다.
Range 지정 방법:
• A1 표기법: getRange("A1") - A1 셀 하나
• 범위 표기법: getRange("A1:C5") - A1부터 C5까지
• 행열 번호: getRange(1, 1) - 1행 1열 (A1)
• 범위 지정: getRange(1, 1, 3, 2) - 1행1열부터 3행2열 영역
• A1 표기법: getRange("A1") - A1 셀 하나
• 범위 표기법: getRange("A1:C5") - A1부터 C5까지
• 행열 번호: getRange(1, 1) - 1행 1열 (A1)
• 범위 지정: getRange(1, 1, 3, 2) - 1행1열부터 3행2열 영역
🚀 실습 1: 다양한 Range 접근 방법
2
단일 셀 다루기
여러 방법으로 셀에 접근해봅시다:
실행하고 각 셀의 변화를 확인하세요.
function 단일셀연습() {
let sheet = SpreadsheetApp.getActiveSheet();
// 방법 1: A1 표기법
sheet.getRange("A1").setValue("A1 표기법");
// 방법 2: 행열 번호 (1행 2열 = B1)
sheet.getRange(1, 2).setValue("행열 번호");
// 방법 3: 값 읽기
sheet.getRange("C1").setValue(100);
let 값 = sheet.getRange("C1").getValue();
Logger.log("C1의 값: " + 값);
// 방법 4: 여러 메서드 체이닝
sheet.getRange("D1")
.setValue("체이닝")
.setBackground("#ffeb3b")
.setFontWeight("bold");
SpreadsheetApp.getActiveSpreadsheet().toast("단일 셀 설정 완료!", "완료", 3);
}
3
범위로 여러 셀 다루기
여러 셀을 한번에 다룰 수 있습니다:
실행하면 표 형태의 데이터가 만들어집니다.
function 범위연습() {
let sheet = SpreadsheetApp.getActiveSheet();
sheet.clear();
// 방법 1: A1:C1 범위에 값 설정
sheet.getRange("A1:C1").setValues([["이름", "나이", "점수"]]);
// 방법 2: 행열로 범위 지정 (2행 1열부터 3행 3열)
let 데이터 = [
["홍길동", 25, 85],
["김철수", 23, 90],
["이영희", 24, 88]
];
sheet.getRange(2, 1, 3, 3).setValues(데이터);
// 방법 3: 특정 범위에 서식 적용
sheet.getRange("A1:C1")
.setBackground("#4285f4")
.setFontColor("#ffffff")
.setFontWeight("bold")
.setHorizontalAlignment("center");
// 방법 4: 테두리 추가
sheet.getRange("A1:C4").setBorder(
true, true, true, true, true, true,
"#000000", SpreadsheetApp.BorderStyle.SOLID
);
Logger.log("범위 설정 완료!");
}
4
getValues()로 여러 값 한번에 읽기
많은 데이터를 효율적으로 읽는 방법입니다:
실행하면 테이블 데이터를 읽어서 처리합니다.
function 데이터읽기() {
let sheet = SpreadsheetApp.getActiveSheet();
// 범위의 모든 값을 2차원 배열로 가져오기
let 범위 = sheet.getRange("A2:C4");
let 데이터 = 범위.getValues();
Logger.log("=== 전체 데이터 ===");
Logger.log(데이터);
// 각 행 처리
for (let i = 0; i < 데이터.length; i++) {
let 행 = 데이터[i];
let 이름 = 행[0];
let 나이 = 행[1];
let 점수 = 행[2];
Logger.log((i+1) + "번: " + 이름 + ", " + 나이 + "세, " + 점수 + "점");
}
// 특정 열만 추출
Logger.log("=== 이름 목록 ===");
for (let i = 0; i < 데이터.length; i++) {
Logger.log(데이터[i][0]); // 0번 인덱스 = 이름
}
// 점수 합계
let 총점 = 0;
for (let i = 0; i < 데이터.length; i++) {
총점 += 데이터[i][2]; // 2번 인덱스 = 점수
}
Logger.log("총점: " + 총점);
Logger.log("평균: " + (총점 / 데이터.length));
}🎨 셀 서식 다루기
5
색상과 폰트 설정
셀의 외관을 꾸며봅시다:
실행하면 다양한 서식이 적용된 셀들을 볼 수 있습니다.
function 서식적용() {
let sheet = SpreadsheetApp.getActiveSheet();
sheet.clear();
// 제목 작성
sheet.getRange("A1").setValue("서식 예제");
// 배경색
sheet.getRange("A2").setValue("빨간 배경").setBackground("#ffcdd2");
sheet.getRange("A3").setValue("파란 배경").setBackground("#bbdefb");
sheet.getRange("A4").setValue("녹색 배경").setBackground("#c8e6c9");
// 글자색
sheet.getRange("B2").setValue("빨간 글자").setFontColor("#d32f2f");
sheet.getRange("B3").setValue("파란 글자").setFontColor("#1976d2");
sheet.getRange("B4").setValue("녹색 글자").setFontColor("#388e3c");
// 폰트 크기와 스타일
sheet.getRange("C2").setValue("크고 굵게").setFontSize(14).setFontWeight("bold");
sheet.getRange("C3").setValue("이탤릭").setFontStyle("italic");
sheet.getRange("C4").setValue("밑줄").setTextStyle(
SpreadsheetApp.newTextStyle().setUnderline(true).build()
);
// 정렬
sheet.getRange("D2").setValue("왼쪽").setHorizontalAlignment("left");
sheet.getRange("D3").setValue("가운데").setHorizontalAlignment("center");
sheet.getRange("D4").setValue("오른쪽").setHorizontalAlignment("right");
// 열 너비 자동 조정
sheet.autoResizeColumns(1, 4);
Logger.log("서식 적용 완료!");
}
6
조건부 서식 적용하기
값에 따라 자동으로 색상을 변경합니다:
실행하면 점수에 따라 자동으로 색상이 적용됩니다.
function 조건부서식() {
let sheet = SpreadsheetApp.getActiveSheet();
sheet.clear();
// 제목
sheet.getRange("A1:B1").setValues([["학생", "점수"]]);
sheet.getRange("A1:B1").setBackground("#4285f4").setFontColor("#ffffff");
// 데이터
let 학생데이터 = [
["김민수", 95],
["이지은", 78],
["박준호", 62],
["최유진", 88],
["정하늘", 45]
];
sheet.getRange(2, 1, 5, 2).setValues(학생데이터);
// 점수에 따라 색상 적용
for (let row = 2; row <= 6; row++) {
let 점수 = sheet.getRange(row, 2).getValue();
let 셀 = sheet.getRange(row, 2);
if (점수 >= 90) {
셀.setBackground("#c8e6c9").setFontWeight("bold"); // 녹색
} else if (점수 >= 80) {
셀.setBackground("#fff9c4"); // 노란색
} else if (점수 >= 70) {
셀.setBackground("#ffecb3"); // 주황색
} else if (점수 >= 60) {
셀.setBackground("#ffccbc"); // 연한 빨강
} else {
셀.setBackground("#ffcdd2").setFontColor("#d32f2f"); // 빨강
}
}
Logger.log("조건부 서식 적용 완료!");
}🎯 실습 2: 월간 매출 보고서 자동 생성
7
매출 데이터 입력 및 계산
매출 보고서를 자동으로 생성하는 프로그램을 만들어봅시다:
실행하면 전문적인 매출 보고서가 생성됩니다.
function 매출보고서생성() {
let sheet = SpreadsheetApp.getActiveSheet();
sheet.clear();
// 제목
sheet.getRange("A1:F1").merge();
sheet.getRange("A1").setValue("2024년 12월 월간 매출 보고서");
sheet.getRange("A1")
.setBackground("#1a73e8")
.setFontColor("#ffffff")
.setFontSize(16)
.setFontWeight("bold")
.setHorizontalAlignment("center")
.setVerticalAlignment("middle");
sheet.setRowHeight(1, 50);
// 헤더
let 헤더 = [["날짜", "제품명", "수량", "단가", "금액", "비고"]];
sheet.getRange("A2:F2").setValues(헤더);
sheet.getRange("A2:F2")
.setBackground("#4285f4")
.setFontColor("#ffffff")
.setFontWeight("bold")
.setHorizontalAlignment("center");
// 매출 데이터
let 매출데이터 = [
["2024-12-01", "노트북", 5, 1200000, "", ""],
["2024-12-03", "마우스", 20, 25000, "", ""],
["2024-12-05", "키보드", 15, 80000, "", ""],
["2024-12-07", "모니터", 8, 350000, "", ""],
["2024-12-10", "노트북", 3, 1200000, "", ""],
["2024-12-12", "마우스", 30, 25000, "", ""],
["2024-12-15", "키보드", 10, 80000, "", ""],
["2024-12-18", "모니터", 6, 350000, "", ""]
];
sheet.getRange(3, 1, 매출데이터.length, 6).setValues(매출데이터);
// 금액 계산 (수량 × 단가)
for (let i = 0; i < 매출데이터.length; i++) {
let row = i + 3;
let 수량 = sheet.getRange(row, 3).getValue();
let 단가 = sheet.getRange(row, 4).getValue();
let 금액 = 수량 * 단가;
sheet.getRange(row, 5).setValue(금액);
// 100만원 이상이면 비고에 "고액" 표시
if (금액 >= 1000000) {
sheet.getRange(row, 6).setValue("고액");
sheet.getRange(row, 5, 1, 2).setBackground("#fff9c4");
}
}
// 숫자 서식 (천단위 구분)
sheet.getRange("D3:E10").setNumberFormat("#,##0");
// 테두리
sheet.getRange("A2:F10").setBorder(
true, true, true, true, true, true,
"#000000", SpreadsheetApp.BorderStyle.SOLID
);
Logger.log("매출 보고서 생성 완료!");
}
8
통계 및 요약 추가하기
보고서 하단에 통계 정보를 추가합니다:
실행하면 보고서 하단에 통계 정보가 추가됩니다.
function 통계추가() {
let sheet = SpreadsheetApp.getActiveSheet();
// 금액 데이터 읽기
let 금액범위 = sheet.getRange("E3:E10");
let 금액데이터 = 금액범위.getValues();
// 통계 계산
let 총매출 = 0;
let 최고매출 = 금액데이터[0][0];
let 최저매출 = 금액데이터[0][0];
for (let i = 0; i < 금액데이터.length; i++) {
let 금액 = 금액데이터[i][0];
총매출 += 금액;
if (금액 > 최고매출) 최고매출 = 금액;
if (금액 < 최저매출) 최저매출 = 금액;
}
let 평균매출 = Math.round(총매출 / 금액데이터.length);
// 통계 영역 작성
let 통계시작행 = 12;
sheet.getRange(통계시작행, 1).setValue("【 매출 통계 】");
sheet.getRange(통계시작행, 1)
.setFontSize(14)
.setFontWeight("bold")
.setBackground("#e8f5e9");
let 통계내용 = [
["총 매출액", 총매출 + " 원"],
["평균 매출액", 평균매출 + " 원"],
["최고 매출액", 최고매출 + " 원"],
["최저 매출액", 최저매출 + " 원"],
["거래 건수", 금액데이터.length + " 건"]
];
sheet.getRange(통계시작행 + 1, 1, 5, 2).setValues(통계내용);
// 통계 영역 서식
sheet.getRange(통계시작행 + 1, 1, 5, 1).setFontWeight("bold");
sheet.getRange(통계시작행 + 1, 2, 5, 1).setHorizontalAlignment("right");
// 총 매출액 강조
sheet.getRange(통계시작행 + 1, 1, 1, 2)
.setBackground("#4285f4")
.setFontColor("#ffffff")
.setFontWeight("bold");
// 테두리
sheet.getRange(통계시작행, 1, 6, 2).setBorder(
true, true, true, true, true, true,
"#000000", SpreadsheetApp.BorderStyle.SOLID
);
// 열 너비 자동 조정
sheet.autoResizeColumns(1, 6);
SpreadsheetApp.getActiveSpreadsheet().toast(
"총 매출: " + 총매출.toLocaleString() + "원",
"통계 완료",
5
);
}💡 Range 사용 팁
- 일괄 처리: 반복문에서 getValue/setValue보다 getValues/setValues가 훨씬 빠릅니다
- 메서드 체이닝: 여러 서식을 한 줄로 연결하여 적용할 수 있습니다
- 범위 지정: 넓은 범위는 A1 표기법, 동적 범위는 행열 번호가 편리합니다
- 성능 최적화: 가능한 한 번에 많은 데이터를 읽고 쓰는 것이 효율적입니다
⚠️ 주의사항
- getValues()는 2차원 배열을 반환합니다 (데이터[행][열] 형태)
- 배열의 인덱스는 0부터 시작하지만, 행열 번호는 1부터 시작합니다
- 범위를 벗어나면 오류가 발생하므로 lastRow(), lastColumn()을 활용하세요
- 너무 많은 반복문 안에서 Range 접근은 속도가 느려질 수 있습니다
🎯 5차시 정리
이번 시간에는 Range 객체를 다루는 다양한 방법과 셀 서식 적용 방법을 배웠습니다.getValues/setValues를 활용하면 대량의 데이터를 효율적으로 처리할 수 있습니다.
다음 차시에서는 스프레드시트의 시트(Sheet) 관리와 데이터 정렬, 필터링을 배워보겠습니다.
'AppSheet' 카테고리의 다른 글
| 구글 앱스크립트 7차시 - 사용자 정의 함수와 메뉴 (2) | 2025.12.20 |
|---|---|
| 구글 앱스크립트 6차시 - 시트 관리와 데이터 정렬 (1) | 2025.12.20 |
| 구글 앱스크립트 4차시 - 함수와 매개변수 (1) | 2025.12.20 |
| 구글 앱스크립트 3차시 - 조건문과 반복문 (1) | 2025.12.20 |
| 구글 앱스크립트 2차시 - 변수와 데이터 타입 (2) | 2025.12.20 |