[자동화 스크립트 4] 자동 실행 트리거 설정
🔗 지금 바로 사용해보세요!
클릭 한 번으로 바로 접속해서 복사하여 사용하실 수 있습니다
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);
}