GAS에서 제공하는 스크립트 자동 실행 서비스이다. 스프레드 시트 수정과 열기 등 스프레드 시트 기반, 시간 기반, 캘린더 기반의 이벤트로 스크립트를 자동실행할 수 있다. 이번 포스팅에서는 가장 많이 사용 될 시간기반을 알아 보겠다. 트리거는 스크립트 편집기 페이지의 왼편에 있는 시계 모양의 아이콘을 클릭하면 접근 가능하다.
트리거 페이지로 이동해 새 트리거를 만들어보자.
저번 포스팅에서 사용한 scraper 함수를 선택해주자. 현재 따로 배포는 없기 때문에 그대로 두면 된다. 시간 기반 중에서도 일 단위 타이머를 선택해 하루마다 스크립트를 실행하도록 설정해주자. 시간대는 원하는 시간대를 골라주면 해당 시간대에 자동으로 실행이 된다. 실패 시 아래 사진 처럼 구글 메일로 알림이 온다.
스크립트에 코드를 추가하여 Installable Trigger를 사용해보자. 공식문서에 명시된 내용을 토대로 installabe trigger를 작성해보자.
scaper.gs
function setInstallableTrigger() {
ScriptApp.newTrigger("scraper")
.timeBased()
.atHour(8)
.nearMinute(30)
.create();
}
...
newTrigger("scraper")
: 새 트리거를 생성한다. 파라미터로 실행 시킬 함수 이름을 정해주어야한다..timeBased()
: 트리거 이벤트를 시간 기반으로 정한다..nearMinute(30)
: 위의 코드에선 약 오전 8시 15분 ~ 8시 45분 사이에 트리거가 실행된다. 설정된 시간에서 약 15분 정도 오차가 발생할 수 있다고 한다.해당 Trigger를 사용하려면 이전에 생성했던 트리거 설정을 수정하여 실행할 함수를 setInstallableTrigger()
로 바꿔주거나 수동으로 실행시켜주자.
그런데 이렇게 하면 동일한 트리거가 계속 생성 될 수 있기 때문에 이를 체크하는 함수를 만들어 사용하자.
scaper.gs
function checkIfTriggerExists(eventType, handlerFunction) {
var triggers = ScriptApp.getProjectTriggers();
var triggerExists = false;
triggers.forEach(function (trigger) {
if(trigger.getEventType() === eventType &&
trigger.getHandlerFunction() === handlerFunction)
triggerExists = true;
});
return triggerExists;
}
function setInstallableTrigger() {
if (!checkIfTriggerExists(ScriptApp.EventType.CLOCK, "scraper")) {
ScriptApp.newTrigger("scraper")
.timeBased()
.atHour(9)
.nearMinute(30)
.everyDays(1)
.create();
}
else {
console.log("[scraper] trigger already Exist.")
}
}
...
ScriptApp.EventType.CLOCK
: 시간 기반 트리거를 의미한다handlerFunction
: ScriptApp.newTrigger("scraper")
에서 인자로 넘긴 문자열(scraper)를 넣어주면된다.이렇게 하면 여러번 실행해도 트리거가 중복으로 생성되지 않는다.
왼쪽 아이콘에서 트리거 바로 아래의 아이콘을 클릭하면 스크립트 실행 로그를 확인할 수 있다.
실행 유형, 실행 시간, 상태 등을 확인 가능하다.
트리거로 직접 실행시키지 않고도 자동으로 편리하게 스크립트를 실행시킬 수 있게 되었다. 다만 트리거 실행에는 일일 제한량이 있다. 기본 계정은 하루에 총 90분 실행이 가능하고, workspace 계정이면 하루에 총 6시간 실행가능하다. 다른 여러 제한은 링크를 확인하자
Quotas for Google Services - https://developers.google.com/apps-script/guides/services/quotas
Create triggers programmatically using Apps Script - https://spreadsheet.dev/create-triggers-programmatically-using-apps-script
Google apps script time-driven_events - https://developers.google.com/apps-script/guides/triggers/events#time-driven_events