본문 바로가기
AppSheet

구글 앱스크립트 5차시 - 스프레드시트 Range 다루기

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

구글 앱스크립트 5차시 - 스프레드시트 Range 다루기

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열 영역

🚀 실습 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) 관리와 데이터 정렬, 필터링을 배워보겠습니다.