엑셀 VBA에서 MsgBox 한 줄로 끝나던 알림창을 구글 스프레드시트에서 띄우려면 Apps Script의 UI 객체를 거쳐야 합니다. 매크로가 끝났다고 알려 주거나, 입력값이 잘못됐을 때 사용자에게 멈춰서 보여 줄 때 씁니다.
var ui = SpreadsheetApp.getUi();
ui.alert(‘text’);
주의할 점이 하나 있습니다. 위 코드의 ‘text’는 블로그 에디터가 작은따옴표를 둥근 따옴표(‘ ’)로 바꿔 놓은 모양이라, 스크립트 편집기에 그대로 붙여 넣으면 문법 오류가 납니다. 일반 따옴표로 고친 코드는 이렇습니다.
var ui = SpreadsheetApp.getUi();
ui.alert('text');
어디서 실행해야 뜨나
SpreadsheetApp.getUi()는 지금 열려 있는 스프레드시트 화면의 UI를 가져옵니다. 그래서 스프레드시트의 "확장 프로그램 → Apps Script"로 만든, 시트에 붙어 있는 스크립트에서만 의미가 있습니다. 함수를 스크립트 편집기에서 실행하면 창은 편집기가 아니라 스프레드시트 탭 쪽에 뜨니, 실행 버튼을 누르고 시트 화면으로 넘어가서 확인하세요. 창을 닫을 때까지 스크립트가 멈춰 있다가 확인을 누르면 다음 줄로 넘어갑니다.
시간 기반 트리거처럼 사람이 화면을 보고 있지 않은 상태로 돌아가는 함수 안에서 getUi()를 부르면, UI를 쓸 수 없는 상황이라는 오류가 나면서 멈춥니다. 자동 실행되는 작업이라면 알림창 대신 시트에 결과를 적거나 로그를 남기는 쪽으로 바꿔야 합니다.
예/아니오를 묻는 창으로 쓰기
alert는 제목, 내용, 버튼 묶음을 함께 받을 수도 있습니다. 버튼 묶음으로 ui.ButtonSet.YES_NO를 넘기면 사용자가 누른 버튼이 반환되므로, 삭제나 초기화처럼 되돌리기 힘든 작업 전에 확인을 받는 데 쓸 수 있습니다.
var ui = SpreadsheetApp.getUi();
var res = ui.alert('확인', '시트를 초기화할까요?', ui.ButtonSet.YES_NO);
if (res == ui.Button.YES) {
// 초기화 작업
}
이 확인창 예제는 원문에 없던 것으로, 응용 삼아 덧붙였습니다. 사용자에게 값을 입력받아야 한다면 같은 UI 객체의 prompt를 쓰면 됩니다. 메뉴에 함수를 연결해 두고(onOpen에서 ui.createMenu(...)) 그 안에서 알림창을 띄우면, 엑셀 매크로 버튼과 비슷한 사용감을 만들 수 있습니다.
참고: Google Apps Script: Create an Alert - Alice Keeler
값을 입력받는 prompt
prompt 는 입력 칸이 있는 창을 띄우고, 사용자가 누른 버튼과 입력한 글자를 함께 담은 응답 객체를 돌려줍니다. alert 와 달리 반환값이 버튼이 아니라 객체라서 getSelectedButton() 과 getResponseText() 로 꺼내 써야 합니다.
var ui = SpreadsheetApp.getUi();
var r = ui.prompt('담당자', '이름을 입력하세요', ui.ButtonSet.OK_CANCEL);
if (r.getSelectedButton() == ui.Button.OK) {
var name = r.getResponseText();
}
취소를 눌러도 입력 칸에 적어 둔 글자는 getResponseText() 로 읽히니, 버튼부터 확인하고 나서 값을 쓰는 순서를 지켜야 합니다.
메뉴에 연결하기
onOpen 은 스프레드시트를 열 때 자동으로 실행되는 함수라, 여기서 메뉴를 만들어 두면 시트 상단에 우리 메뉴가 생깁니다.
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('업무')
.addItem('시트 초기화', 'resetSheet')
.addToUi();
}
addItem 의 두 번째 인자는 실행할 함수 이름을 문자열로 적습니다. 메뉴가 안 보이면 시트를 새로 고침해야 onOpen 이 다시 돕니다.
창을 띄우지 않고 알리기
작업이 끝났다는 정도만 알리면 되는데 매번 확인을 누르게 하기 번거롭다면 SpreadsheetApp.getActiveSpreadsheet().toast('완료했습니다', '알림', 5) 를 쓰면 됩니다. 오른쪽 아래에 작은 알림이 몇 초(세 번째 인자) 떴다가 사라지고, 스크립트도 멈추지 않고 다음 줄로 넘어갑니다. 알림 내용에서 줄을 바꾸고 싶을 때는 alert 문자열 안에 \n 을 넣으면 됩니다.