시작하기 전에 준비할 것
- 1텔레그램 계정 폰에 텔레그램 앱이 깔려 있고 로그인돼 있으면 됩니다. 알림을 여기서 받습니다.
- 2구글 계정 하나 Gmail 주소가 있으면 됩니다. 스프레드시트와 앱스스크립트가 무료로 딸려 옵니다.
- 3웹 브라우저 크롬을 권장합니다. 시트와 코드 작업은 전부 브라우저 안에서 일어납니다.
- 4코드 지식은 필요 없습니다 코드 하나를 이 페이지에서 복사해 붙여넣고, 토큰과 chat_id 두 곳만 바꿉니다.
텔레그램에서 알림 봇 만들기
알림을 보내 줄 봇을 하나 만듭니다. 봇은 텔레그램이 정한 방법대로 BotFather라는 공식 봇에게 부탁해서 만듭니다.
- 텔레그램 검색창에
@BotFather를 치고, 파란 체크가 붙은 BotFather를 엽니다. - 아래 시작(Start)을 누른 뒤, 대화창에
/newbot을 보냅니다. - 봇 이름을 묻습니다. 아무 이름이나 적습니다(예: 주문 알림).
- 봇 아이디를 묻습니다. 영문으로 끝이
bot이어야 합니다(예:my_order_alert_bot). 이미 쓰는 이름이면 다른 걸 넣으라고 합니다.
다 되면 BotFather가 축하 메시지와 함께 토큰을 줍니다. 123456789:AAE...처럼 생긴 긴 문자열입니다. 이 토큰이 봇을 움직이는 열쇠입니다. 길게 눌러 복사해 둡니다.
BotFather가 준 토큰(숫자:영문 꼴)을 복사해 두었습니다.
봇에게 먼저 말 걸기
텔레그램에는 규칙이 하나 있습니다. 봇은 내가 먼저 말을 건 사람에게만 메시지를 보낼 수 있습니다. 그래서 내가 봇에게 먼저 한마디 보내 둬야 합니다.
- 텔레그램 검색창에 방금 만든 봇의 아이디(
@my_order_alert_bot)를 쳐서 엽니다. - 아래 시작(Start)을 누릅니다. 그리고 아무 글자나 하나 보냅니다(예:
안녕).
내가 만든 봇과의 대화에 내가 보낸 메시지 하나가 보입니다.
주문 표 만들기
알림을 만들 재료, 즉 주문이 쌓일 표를 만듭니다. 브라우저 주소창에 sheets.new를 치고 Enter를 누릅니다. 빈 구글 스프레드시트가 새로 열립니다.
맨 윗줄(1행)에 제목 다섯 칸을 넣습니다. A1 칸을 누르고 아래 한 줄을 복사해 붙여넣으면, 다섯 칸에 한 번에 나뉘어 들어갑니다.
주문일시 주문자 품목 수량 메모이 표가 알림의 재료입니다. 2행부터 실제 주문이 한 줄씩 들어오고, 코드는 맨 아래 줄을 읽어 알림을 만듭니다.
| 행 | 주문일시 | 주문자 | 품목 | 수량 | 메모 |
|---|---|---|---|---|---|
| 2 | 2026-08-22 14:03 | 김민수 | 아메리카노 | 2 | 덜 뜨겁게 |
| 3 | 2026-08-22 14:07 | 이서연 | 카페라떼 | 1 |
예약일시 이름 인원으로 바꾸면 알림 문구도 따라 바뀝니다.스프레드시트 1행에 다섯 칸 제목(주문일시 … 메모)이 들어 있습니다.
앱스스크립트 편집기 열기
시트와 봇을 이어 줄 코드를 넣을 곳을 엽니다. 위쪽 메뉴에서 확장 프로그램을 누르고 Apps Script를 고릅니다.
새 탭이 하나 뜹니다. 이것이 코드를 넣는 편집기입니다. 왼쪽에 Code.gs라는 파일이 있고, 가운데 코드 칸에 기본 코드(function myFunction() { })가 들어 있습니다.
새 탭에 편집기가 떴고, 왼쪽에 Code.gs 파일이 보입니다.
알림 코드 붙여넣고 토큰 넣기
가운데 코드 칸의 기본 코드를 모두 지웁니다. 코드 칸을 한 번 누르고 Ctrl + A(맥은 ⌘ + A)로 전부 선택한 뒤 Delete로 지웁니다.
그 자리에 아래 코드를 붙여넣습니다. 오른쪽 복사 버튼을 누른 다음, 빈 칸에서 Ctrl + V로 붙입니다. 코드 내용은 읽지 않아도 됩니다.
Code.gs 전체 코드 읽지 않아도 됩니다. 오른쪽 복사만 누르세요.
// 스프레드시트 -> 텔레그램 알림
// 원리: 시트가 바뀌면(트리거) 텔레그램 봇에게 요청을 한 번 보내(UrlFetchApp) 내 폰으로 메시지가 온다.
// 고칠 곳은 딱 두 줄이다. 아래 BOT_TOKEN 과 CHAT_ID.
var BOT_TOKEN = '여기에_봇_토큰_붙여넣기'; // BotFather가 준 토큰
var CHAT_ID = '여기에_내_chat_id_붙여넣기'; // getMyChatId()를 실행해 얻는다
// 텔레그램으로 글 한 덩이를 보낸다. 모든 알림이 이 함수 하나를 지난다.
function sendTelegram(text) {
var url = 'https://api.telegram.org/bot' + BOT_TOKEN + '/sendMessage';
UrlFetchApp.fetch(url, {
method: 'post',
payload: { chat_id: CHAT_ID, text: text },
muteHttpExceptions: true
});
}
// 내 chat_id 찾기. 텔레그램에서 봇에게 아무 말이나 한 번 보낸 뒤 이 함수를 실행한다.
// 실행 로그에 숫자가 찍힌다. 그 숫자를 위 CHAT_ID 자리에 넣는다.
function getMyChatId() {
var url = 'https://api.telegram.org/bot' + BOT_TOKEN + '/getUpdates';
var res = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
var data = JSON.parse(res.getContentText());
var list = data.result || [];
if (list.length === 0) {
Logger.log('메시지가 아직 안 보입니다. 텔레그램에서 봇에게 아무 말이나 보낸 뒤 다시 실행하세요.');
return;
}
var last = list[list.length - 1];
var msg = last.message || last.edited_message || last.channel_post;
Logger.log('내 chat_id: ' + msg.chat.id);
}
// 시트 맨 아래 한 줄을 제목과 짝지어 텔레그램으로 보낸다.
function notifyLastRow() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
var lastRow = sheet.getLastRow();
if (lastRow < 2) return; // 제목 줄만 있으면 보낼 것이 없다
var width = sheet.getLastColumn();
var head = sheet.getRange(1, 1, 1, width).getValues()[0];
var row = sheet.getRange(lastRow, 1, 1, width).getValues()[0];
var lines = ['새 주문이 들어왔습니다'];
for (var i = 0; i < head.length; i++) {
if (head[i] === '') continue;
var value = row[i];
if (Object.prototype.toString.call(value) === '[object Date]') { // 날짜 칸은 보기 좋게 다듬는다
value = Utilities.formatDate(value, Session.getScriptTimeZone(), 'yyyy-MM-dd HH:mm');
}
lines.push(head[i] + ': ' + value);
}
sendTelegram(lines.join('\n'));
}
// 알림을 한 번 보내 시험한다. 이 함수를 실행하면 지금 시트의 마지막 줄이 텔레그램으로 온다.
function testAlert() {
notifyLastRow();
}
// 시트가 편집되면 자동으로 마지막 줄 알림을 보낸다. 설치형 트리거가 이 함수를 부른다.
function onSheetChange(e) {
notifyLastRow();
}붙여넣은 뒤 딱 한 곳만 고칩니다. 맨 위 두 줄 중 첫 줄의 따옴표 안을, 1단계에서 복사한 봇 토큰으로 바꿉니다.
var BOT_TOKEN = '123456789:AAE...여기에_내_토큰...';바로 아래 CHAT_ID 줄은 다음 단계에서 채웁니다. 지금은 그대로 둡니다. 위쪽 저장 아이콘(디스크 모양)이나 Ctrl + S로 저장합니다.
BOT_TOKEN 줄에 내 토큰을 넣고 저장했습니다.코드가 가득 차 있고, 맨 위 BOT_TOKEN 줄에 내 토큰이 들어가 있으며, 저장했습니다.
내 chat_id 알아내서 넣기
봇이 나에게 보낼 주소, chat_id를 알아냅니다. 코드 안에 그걸 알려 주는 함수(getMyChatId)가 이미 들어 있습니다.
편집기 위쪽 가운데의 함수 고르는 칸(지금은 다른 함수 이름이 보입니다)을 눌러 getMyChatId를 고릅니다. 그리고 그 왼쪽의 실행(▶)을 누릅니다.
처음 실행하면 권한 승인 절차가 한 번 나옵니다. 화면이 좀 무섭게 생겼지만 정상이고, 맨 처음 딱 한 번만 하면 됩니다. 아래 네 화면을 순서 그대로 따라갑니다.
(1) 편집기 안에 "승인 필요" 창이 뜹니다. 오른쪽 권한 검토를 누릅니다.
(2) 새 창에 "Google에서 확인하지 않은 앱"이라는 경고가 뜹니다. 왼쪽 아래 고급을 누릅니다.
(3) 고급을 누르면 아래에 "(내 프로젝트 이름)(으)로 이동(안전하지 않음)"이라는 줄이 나타납니다. 그것을 누릅니다.
(4) 이 스크립트에 어떤 권한을 줄지 고르는 화면이 나옵니다. 맨 위 모두 선택을 체크하고, 아래로 내려 계속을 누릅니다.
승인이 끝나면 실행이 완료되고, 편집기 아래쪽에 실행 로그가 펼쳐집니다. 거기에 내 chat_id: 812345678처럼 숫자 한 줄이 찍힙니다.
그 숫자를 코드 맨 위 두 번째 줄, CHAT_ID의 따옴표 안에 넣습니다.
var CHAT_ID = '812345678';Ctrl + S로 저장합니다. 이제 봇 토큰(누구를 통해 보내나)과 chat_id(누구에게 보내나)가 다 채워졌습니다.
메시지가 아직 안 보입니다가 찍히면, 2단계의 "봇에게 말 걸기"를 안 한 것입니다. 텔레그램에서 봇에게 아무 말이나 한마디 보낸 뒤 getMyChatId를 다시 실행합니다.코드 맨 위 CHAT_ID 줄에 로그에서 본 숫자가 들어가 있고, 저장했습니다.
알림 한 번 시험하기
진짜로 알림이 오는지 눌러 봅니다. 코드는 늘 시트의 맨 아래 줄을 읽어 보내니, 시험용 주문이 한 줄 있어야 합니다. 스프레드시트 탭으로 가서 2행에 아무 주문이나 한 줄 적어 둡니다(예: 2026-08-23 11:20 김민수 아메리카노 2 덜 뜨겁게).
다시 편집기로 와서, 함수 칸에서 이번엔 testAlert를 고르고 실행(▶)을 누릅니다. 6단계에서 이미 권한을 승인했으니 이번엔 승인 창이 안 뜹니다.
실행이 끝나면 잠시 뒤 텔레그램에 알림이 도착합니다. 시트 마지막 줄이 "새 주문이 들어왔습니다"와 함께 옵니다.
텔레그램의 봇 대화에 "새 주문이 들어왔습니다" 알림이 도착했습니다.
자동으로 오게 트리거 걸기
지금은 버튼을 눌러야 알림이 옵니다. 이제 시트가 바뀌면 저절로 오게 만듭니다. 이 "언제 실행할지" 규칙을 트리거라고 합니다.
편집기 맨 왼쪽 세로줄에서 알람시계 모양(트리거)을 누릅니다. 그 위에 시계 아이콘(프로젝트 기록)이 하나 더 있으니 헷갈리지 않게, 아래쪽 알람시계를 고릅니다. 아이콘에 마우스를 올리면 이름표가 뜹니다.
트리거 화면이 열립니다. 오른쪽 아래 파란 트리거 추가 버튼을 누릅니다.
창이 뜹니다. 네 칸 중 세 칸을 이렇게 맞춥니다(나머지는 그대로 둡니다).
- 실행할 함수 선택: onSheetChange
- 이벤트 소스 선택: 스프레드시트에서
- 이벤트 유형 선택: 변경 시
아래 저장을 누릅니다. 권한 창이 다시 뜨면 6단계와 같은 순서로 넘어갑니다(대개 이미 승인해서 안 뜹니다).
트리거 목록에 onSheetChange · 변경 시 한 줄이 생겼습니다.
새 주문 넣어 자동 알림 확인
마지막으로, 진짜 새 주문처럼 시트에 한 줄을 더 적어 봅니다. 스프레드시트 탭으로 돌아가 3행에 새 주문을 한 줄 채웁니다(예: 2026-08-23 11:35 이서연 카페라떼 1).
잠시 뒤(보통 몇 초에서 십여 초), 버튼을 누르지 않았는데도 텔레그램에 그 주문 알림이 옵니다.
원리 한 장
따라 하면서 만진 네 조각이 알림 연동의 전부입니다. 이름만 알아 두면, 다음에 무엇을 바꿔야 할지 스스로 압니다.
UrlFetchApp.fetch)이 성립합니다. 그 요청을 언제 보낼지를 정하는 것이 트리거입니다. 정리하면, 트리거가 시트 변화를 감지해서(언제) sendMessage로 봇에게 보내면(어떻게) 그 봇이 chat_id 주인에게 전합니다(누구에게).
그래서 알림을 바꾸는 일은 늘 이 넷 중 하나를 만지는 일입니다. 보내는 문구를 바꾸려면 코드의 lines 부분을, 보내는 조건을 바꾸려면(예: 수량이 10 이상일 때만) notifyLastRow 안에 if 한 줄을, 받는 사람을 바꾸려면 CHAT_ID를 바꿉니다. 방법은 그대로입니다.
자주 막히는 곳
알림이 안 와요
가장 흔한 원인은 두 곳입니다. 하나, 2단계에서 봇에게 먼저 말을 안 걸어 chat_id가 비어 있는 경우입니다. 봇에게 한마디 보내고 getMyChatId를 다시 실행해 숫자를 넣습니다. 둘, 토큰이나 chat_id를 붙일 때 따옴표 밖에 넣었거나 앞뒤 공백이 섞인 경우입니다. var BOT_TOKEN = '...';처럼 값이 따옴표 안에 있는지 봅니다.
한 번 편집했는데 알림이 여러 번 와요
트리거는 시트가 바뀔 때마다 돕니다. 한 줄을 칸마다 나눠 채우면 그때마다 알림이 갈 수 있습니다. 실제 주문은 폼이나 붙여넣기로 한 줄이 통째로 들어오는 경우가 많아 대개 문제가 안 됩니다. 폼으로 받는다면 트리거 유형을 양식 제출 시(On form submit)로 걸면 한 응답에 알림 한 번으로 깔끔해집니다.
알림 문구를 바꾸고 싶어요
코드에서 notifyLastRow 함수 안의 var lines = ['새 주문이 들어왔습니다']; 줄을 원하는 첫 문장으로 바꿉니다. 그 아래는 시트 제목과 값을 자동으로 붙이는 부분이라 손대지 않아도 됩니다. 고친 뒤 저장하면 다음 알림부터 바뀝니다.
토큰을 남이 보면 어떻게 되나요
그 사람이 내 봇 이름으로 아무 메시지나 보낼 수 있습니다(내 시트를 보진 못합니다). 토큰이 새어 나갔다면 텔레그램에서 @BotFather를 열어 /revoke로 옛 토큰을 무효화하고 새 토큰을 받아, 코드의 BOT_TOKEN만 바꾸면 됩니다.
여러 사람이 같이 알림을 받고 싶어요
팀 단체방을 만들고 거기에 봇을 초대한 뒤, 그 방에서 아무 말이나 한마디 보내고 getMyChatId를 다시 실행하면 방의 chat_id(보통 앞에 -가 붙는 숫자)가 찍힙니다. 그 값을 CHAT_ID에 넣으면 방 전체가 알림을 받습니다.
윈도우·맥 어디서든
이 가이드는 텔레그램 앱과 브라우저 안에서 일어납니다. 윈도우든 맥이든 화면과 순서가 같습니다. 저장 단축키만 다릅니다. 윈도우는 Ctrl + S, 맥은 ⌘ + S입니다.
이제 원하는 알림으로 바꾸기
여기까지 왔다면 시트를 텔레그램으로 잇는 흐름을 손에 익힌 것입니다. 이 틀로 다른 알림을 만듭니다. 앞의 신청 접수 웹앱으로 폼을 받고 있다면, 그 시트에 이 코드를 붙이고 트리거만 걸면 신청이 들어올 때마다 알림이 옵니다. 재고 시트라면 notifyLastRow에 "수량이 5 미만이면 보낸다"는 if 한 줄을 더해 품절 임박 알림으로 씁니다. 만드는 방법이 막히면, AI에게 "이 코드가 수량 5 미만일 때만 알림 보내게 고쳐 줘"라고 물어 받은 코드를 같은 자리에 붙이면 됩니다. 방법은 바뀌지 않습니다. 바꾸는 것은 조건과 문구뿐입니다.