스프레드시트 활용

[자동화 스크립트 4] 자동 실행 트리거 설정

JS's Spreadsheets 2025. 9. 2. 14:08

🔗 지금 바로 사용해보세요!

📥 자동화와 매크로 스프레드시트 바로가기

클릭  번으로 바로 접속해서 복사하여 사용하실  있습니다

 

Apps Script 환경 진입

1.      확장 프로그램 → Apps Script 클릭

2.     새 프로젝트 생성: "자동화 마스터" 이름 설정

3.      코드 편집기 환경 확인

    - 파일에서 스크립트 선택

    - 이름을 '자동 실행 트리거 설정.gs'라고 저장

    - 아래 함수를 입력

 

시간 기반 트리거 생성

function setupAutomationTriggers() {
  //
기존 트리거들 삭제 (중복 방지)
  var triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < triggers.length; i++) {
    ScriptApp.deleteTrigger(triggers[i]);
  }
 
  // 1.
매주 월요일 오전 9 - 주간 보고서 자동 발송
  ScriptApp.newTrigger('sendWeeklyReport')
    .timeBased()
    .everyWeeks(1)
    .onWeekDay(ScriptApp.WeekDay.MONDAY)
    .atHour(9)
    .create();
 
  // 2.
매일 오전 8 - 재고 모니터링
  ScriptApp.newTrigger('monitorInventory')
    .timeBased()
    .everyDays(1)
    .atHour(8)
    .create();
 
  // 3.
시간마다 - 고객 문의 자동 처리
  ScriptApp.newTrigger('processFormResponses')
    .timeBased()
    .everyHours(1)
    .create();
 
  // 4.
매일 오후 6 - 데이터 백업
  ScriptApp.newTrigger('backupImportantData')
    .timeBased()
    .everyDays(1)
    .atHour(18)
    .create();
 
  Logger.log("
모든 자동화 트리거가 설정되었습니다.");
}

//
데이터 백업 함수
function backupImportantData() {
  try {
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var backupName = "
백업_" + new Date().toISOString().slice(0,10) + "_자동화워크북";
   
    //
현재 파일을 복사하여 백업 생성
    var backupFile = DriveApp.getFileById(spreadsheet.getId()).makeCopy(backupName);
   
   
// 백업 폴더로 이동 (폴더가 있다면)
    try {
      var backupFolder = DriveApp.getFoldersByName("자동화백업").next();
      backupFile.moveTo(backupFolder);
    } catch (e) {
      // 백업 폴더가 없으면 루트에 저장
      Logger.log("백업 폴더를 찾을 수 없어 루트에 저장합니다.");
    }
   
    Logger.log("데이터 백업 완료: " + backupName);
   
  } catch (error) {
    Logger.log("백업 실패: " + error.toString());
  }
}

 

이벤트 기반 트리거 설정

// 셀 편집 시 자동 실행되는 함수
function onEdit(e) {
  var sheet = e.source.getActiveSheet();
  var range = e.range;
  var sheetName = sheet.getName();
 
  // 재고관리 시트에서 현재재고 값 변경 시
  if (sheetName === "재고관리" && range.getColumn() === 2) { // B열: 현재재고
    var row = range.getRow();
    if (row > 1) { // 헤더가 아닌 경우
      var currentStock = range.getValue();
      var safetyStock = sheet.getRange(row, 3).getValue(); // C열: 안전재고
     
      // 재고 상태 자동 업데이트
      var status;
      if (currentStock <= safetyStock * 0.5) {
        status = "위험";
      } else if (currentStock <= safetyStock) {
        status = "부족";
      } else {
        status = "정상";
      }
     
      // 상태 열 업데이트 (F열)
      sheet.getRange(row, 6).setValue(status);
      sheet.getRange(row, 7).setValue(new Date()); // 최종수정일
     
      // 위험 상태일 때 즉시 알림
      if (status === "위험") {
        var productName = sheet.getRange(row, 1).getValue();
        sendUrgentStockAlert(productName, currentStock, safetyStock);
      }
    }
  }
 
  // 고객문의 시트에서 새 문의 추가 시
  if (sheetName === "고객문의" && range.getColumn() === 1) { // A열: 접수일시
    var row = range.getRow();
    if (row > 1 && range.getValue()) {
      // 5초 후 자동 처리 실행 (데이터 입력 완료 대기)
      Utilities.sleep(5000);
      processFormResponses();
    }
  }
}

function sendUrgentStockAlert(productName, current, safety) {
  var subject = "🔥 긴급: " + productName + " 재고 위험 수준!";
  var body = "긴급 상황입니다!\n\n";
  body += productName + "의 재고가 위험 수준으로 떨어졌습니다.\n\n";
  body += "• 현재 재고: " + current + "개\n";
  body += "• 안전 재고: " + safety + "개\n\n";
  body += "즉시 발주 처리가 필요합니다.\n\n";
  body += "재고 관리 자동화 시스템";
 
  GmailApp.sendEmail("manager@####.com", subject, body);
  Logger.log("긴급 재고 알림 발송: " + productName);
}