업무자동화

구글 스프레드시트 Apps Script 트리거: 반복 작업을 안전하게 자동화하는 법

직장에서 구글 스프레드시트를 쓰다 보면 "매일 아침 특정 행을 복사하고 싶다"거나, "동료가 상태를 '완료'로 바꾸면 나한테 자동으로 알림이 왔으면 좋겠다"는 생각을 한 번쯤 해보셨을 겁니다. 이런 단순 반복 수작업을 클릭 한 번 없이 100% 자동화해주는 치트키가 바로 구글 Apps Script(GAS)의 트리거(Trigger)입니다.

💡 단순 트리거(Simple Trigger) vs 설치형 트리거(Installable Trigger)

Apps Script 트리거는 실행 방식에 따라 크게 두 가지로 나뉩니다.

  • 단순 트리거: 코드 내에 onEdit(e), onOpen(e) 등 예약된 함수명을 작성하면 별도의 설정 없이 시트 편집 시 자동으로 실행됩니다. 외부 API를 호출하거나 권한이 필요한 작업에는 제약이 있습니다.
  • 설치형 트리거: Apps Script 에디터 좌측의 트리거(시계 아이콘) 메뉴에서 수동으로 등록하며, 1시간마다 혹은 매일 새벽 3시 등 정해진 주기(Time-driven)로 작동하게 만들거나 더 넓은 수정 범위 권한을 획득해 작동시킬 수 있습니다.

🛠️ 실전 활용 1: 상태가 '완료'로 변경 시 셀 색상 자동 강조 (onEdit)

아래 코드는 단순 트리거를 활용해, 담당자가 특정 열의 상태 값을 '완료'로 변경했을 때 해당 셀의 배경색을 연한 초록색으로 즉시 자동 강조해 주는 스크립트입니다.

function onEdit(e) {
  var range = e.range;
  var sheet = range.getSheet();
  
  // '업무목록' 시트에서 작업이 일어났고, 4번째 열(D열)이 편집된 경우에만 작동
  if (sheet.getName() === "업무목록" && range.getColumn() === 4) {
    var status = range.getValue();
    if (status === "완료") {
      range.setBackground("#d4edda"); // 연한 초록색
      range.setFontColor("#155724");
    } else {
      range.setBackground(null); // 색상 초기화
      range.setFontColor(null);
    }
  }
}

⏰ 실전 활용 2: 매일 아침 전날 마감 데이터를 다른 시트로 백업하기

매일 정해진 시각에 데이터를 보존하거나 보고서를 작성해야 한다면 시간 기반 트리거를 생성해야 합니다. 에디터에서 아래 백업 함수를 작성한 뒤, [트리거 추가 > 이벤트 소스: 시간 기반 > 일일 타이머 > 오전 9시~10시]로 설정하시면 됩니다.

function dailyBackup() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sourceSheet = ss.getSheetByName("일일실적");
  var backupSheet = ss.getSheetByName("백업아카이브");
  
  // 데이터가 있는 마지막 행 번호 획득
  var lastRow = sourceSheet.getLastRow();
  if (lastRow < 2) return; // 백업할 데이터 없음
  
  var sourceRange = sourceSheet.getRange(2, 1, lastRow - 1, sourceSheet.getLastColumn());
  var values = sourceRange.getValues();
  
  // 백업 시트의 맨 아래에 데이터 추가
  var backupLastRow = backupSheet.getLastRow();
  backupSheet.getRange(backupLastRow + 1, 1, values.length, values[0].length).setValues(values);
  
	  // 기존 입력 데이터 비우기 (누적 영역 제외)
	  sourceRange.clearContent();
	}

업무 자동화는 작은 실패부터 막아야 오래 쓴다

Apps Script 자동화는 처음에는 코드 몇 줄로 충분해 보이지만, 실제 업무에 붙이면 예상보다 많은 예외가 생깁니다. 누군가 시트 이름을 바꾸거나, 빈 행이 섞이거나, 같은 트리거가 두 번 등록되거나, 권한 승인이 풀리면 자동화가 조용히 멈출 수 있습니다.

그래서 업무용 자동화는 “한 번 돌아가는 코드”보다 “조금 이상해도 크게 망가지지 않는 코드”가 더 중요합니다. 처리할 시트가 없으면 종료하고, 백업할 행이 없으면 넘어가고, 같은 날짜에 두 번 실행되지 않게 막고, 실패했을 때 로그를 남기는 식으로 작은 안전장치를 넣어두는 편이 좋습니다.

  • 시트 이름 확인: 대상 시트가 없을 때 오류를 내기보다 종료하도록 만듭니다.
  • 빈 데이터 처리: 마지막 행이 1 이하이면 백업이나 복사 작업을 실행하지 않습니다.
  • 시간대 확인: 프로젝트 시간대를 Asia/Seoul로 맞춰야 매일 실행 시간이 어긋나지 않습니다.
  • 권한 승인 확인: 설치형 트리거는 최초 실행 때 필요한 권한을 명확히 승인해야 합니다.
  • 중복 등록 방지: 같은 함수가 여러 트리거에 물려 있으면 백업과 알림이 중복됩니다.

매일 한 번만 실행되게 만드는 예시

매일 백업이나 보고서 발송처럼 한 번만 실행되어야 하는 작업은 마지막 실행일을 기록해두는 편이 안전합니다. 아래 예시는 같은 날짜에 다시 실행되면 바로 종료하는 최소한의 보호 코드입니다.

function runOncePerDay() {
  var props = PropertiesService.getScriptProperties();
  var today = Utilities.formatDate(new Date(), "Asia/Seoul", "yyyy-MM-dd");
  var lastRun = props.getProperty("lastRunDate");

  if (lastRun === today) {
    return;
  }

  dailyBackup();
  props.setProperty("lastRunDate", today);
}

자주 묻는 질문

onEdit 트리거와 설치형 편집 트리거는 무엇이 다른가요?

onEdit(e)는 함수명만 맞으면 바로 작동하는 단순 트리거입니다. 설치형 편집 트리거는 별도로 등록해야 하지만 더 넓은 권한이 필요한 작업에 유리합니다.

시간 기반 트리거는 정확히 지정한 시각에 실행되나요?

일일 타이머는 보통 선택한 시간대 안에서 실행됩니다. 분 단위까지 정확한 스케줄러가 아니라는 점을 감안하고, 보고서나 백업처럼 약간의 오차를 허용할 수 있는 작업에 쓰는 편이 좋습니다.

자동 백업이 두 번씩 생기면 어떻게 해야 하나요?

트리거 메뉴에서 같은 함수가 중복 등록되어 있는지 먼저 확인합니다. 중복 등록이 없다면 위 예시처럼 마지막 실행일을 저장하는 보호 코드를 추가하면 됩니다.

회사 계정에서 권한 승인 오류가 나면 어떻게 하나요?

관리자가 Apps Script 권한이나 외부 연결을 제한했을 수 있습니다. 이 경우 개인 계정으로 우회하기보다 조직 관리자에게 필요한 권한 범위를 확인하는 편이 안전합니다.

트리거를 붙이기 전에 정해야 할 것

자동화는 코드부터 쓰기보다 “언제, 무엇을, 한 번만, 실패하면 어떻게”를 먼저 정해야 오래 갑니다. 구글폼 응답을 받는 업무라면 새 응답이 들어왔을 때만 실행할지, 매일 아침 모아서 처리할지부터 다릅니다. 보고서 업무라면 원본 탭을 건드리지 않고 별도 백업 탭에 기록하는 구조가 더 안전합니다.

  • 입력: 직접 입력인지, 구글폼 응답인지, 다른 파일에서 가져오는 데이터인지 구분합니다.
  • 실행 조건: 편집 즉시 실행할지, 하루 한 번 실행할지, 버튼을 눌렀을 때만 실행할지 정합니다.
  • 중복 방지: 같은 날짜, 같은 행, 같은 응답 ID를 다시 처리하지 않게 기준값을 남깁니다.
  • 알림: 실패했을 때 조용히 멈추지 않도록 슬랙, 메일, 카카오 알림 중 하나를 연결합니다.

자동화 흐름으로 이어서 보기: 스프레드시트 함수와 구조 기본기에서 원본/계산/보고서 탭을 나눈 뒤, 구글폼 응답 수집, Apps Script 트리거 오류 체크리스트, 슬랙 알림 자동화, 카카오 알림톡 연동으로 확장할 수 있습니다.


본 포스팅은 제휴 마케팅 활동의 일환으로 일정수수료를 지급받을 수 있습니다.