구글 시트로 고객에게 문자 자동으로 보내는 방법 (AI 활용)
왜 이걸 만들게 됐을까?
내가 겪었던 문제
회사에서 고객들에게 문자를 보낼 때마다 이런 일을 반복했어요:
엑셀에서 "VIP 고객 중에 최근 한 달 동안 안 산 사람" 찾기 → 30분 소요
그 사람들한테 보낼 문자 내용 쓰기 → 20분 소요
번호 하나하나 복사해서 문자 보내기 → 1시간 소요
이런 번거로운 일을 자동화 할수 있다는 허세임 스터디장님의 말에 매료되어 하게되었습니다.
만든 결과
✅ "VIP 고객 중 최근 한 달 미구매자"라고 말로 입력하면 AI가 알아서 찾아줌
✅ "할인 이벤트 합니다"라고 대충 쓰면 AI가 멋진 문자로 바꿔줌
✅ 버튼 하나로 선택한 고객들에게 자동 발송
✅ 구글 시트만 있으면 OK (프로그래밍 몰라도 됨!)
실제 작동 화면 보기
1. 메시지 미리보기
감사 메시지와 함께 한국어로 된 메시지
AI가 만든 문자를 미리 확인할 수 있어요. 실제로 보낼 때 어떻게 보일지 미리 볼 수 있습니다.
2. 고객 선택 화면
총 18명의 고객이 필터링됐고, 원하는 사람만 선택해서 보낼 수 있어요. 체크박스로 간편하게!
3. 발신번호 등록 화면
항목 목록을 보여주는 웹페이지의 스크린샷
네이버 클라우드에서 발신번호를 등록하고 승인받는 화면이에요. "처리 대기중" 상태가 보이죠?
4. 발송 결과 확인
"선택된 1명 중 - 성공: 0명 - 실패: 1명" 이렇게 결과가 나와요. 성공/실패 여부를 바로 확인 가능!
어떻게 만들었나?
사용한 도구
구글 시트 (엑셀 같은 거): 무료, 팀원들 다 쓸 줄 알아서 선택
Gemini AI (구글이 만든 AI): 구글 시트랑 찰떡궁합
구글 Apps Script (코드 쓰는 곳): AI한테 코드 달라고 하면 됨
네이버 클라우드 SMS (문자 발송): 저렴하고 안정적
현재 가입하니 3000크레딧을 주더라구요(500건 정도 무료 전송가능)
왜 Gemini를 선택했나?
지난주 스터디 모임에서 Claude라는 AI를 쓰다가 너무 느려서 답답했어요. 그래서 Gemini로 바꿨더니:
답변 속도가 3배 빨라짐 🚀
구글 시트 코드를 물어보면 바로 정답이 나옴
Gemini Enterprise 할인 이벤트 때 가입해서 더 저렴하게 사용
=> 아무래도 모든게 구글 tool이라서 더 오류사항을 어떻게 해결할지 친절하게 알려주더라구요. 다만, 과정을 캡쳐화면이라도 보여드리고 싶은데 기록이 남겨있지 않아서 보여드릴수가 없군요..하핫;;
만들면서 겪은 문제들 (솔직 후기)
🔥 문제 1: "시트를 찾을 수 없습니다"
뭐가 문제였나?
오류: TypeError: Cannot read properties of null
이런 이상한 메시지가 계속 떴어요.
내가 시도한 것들:
1단계: 시트 이름을 정확히 써봄
시트 이름: "CRM메시지 발송"
→ 안 됨 😢
2단계: 실제 이름이 뭔지 확인(띄어쓰기도 잘못해도 인식을 못해요)
실제 시트 이름: "CRM메시지발송" (띄어쓰기 없었음!)
→ 그래도 안 됨 😭
3단계: 아예 다른 방법 사용
// 이름으로 찾지 말고, 지금 열려있는 시트 쓰기
const sheet = SpreadsheetApp.getActiveSheet();
→ 성공! 🎉
배운 점:
시트 이름에 띄어쓰기 하나만 달라도 못 찾음
이름으로 찾는 것보다 "지금 열린 시트"를 쓰는 게 안전함
🔥 문제 2: 고객이 절반만 나옴
문제 상황:
실제 고객: 100명
프로그램이 읽은 고객: 16명
반만 읽혀서 결과가 이상했어요.
해결 과정:
먼저 뭐가 문제인지 확인:
// 로그 찍어보기 (확인용 메모)
Logger.log('읽은 고객 수: ' + data.length);
Logger.log('첫 번째 고객: ' + data[0][6]);
Logger.log('마지막 고객: ' + data[data.length-1][6]);
발견한 문제:
빈 줄도 읽고 있었음
제목 행도 고객으로 세고 있었음
해결 방법:
// 한글로 설명:
// 2번째 줄부터 마지막 줄까지만 읽기
// (1번째 줄은 제목이니까 빼기)
const lastRow = sheet.getLastRow(); // 마지막 줄 번호
const data = sheet.getRange(2, 1, lastRow - 1, 30).getValues();
// 확인용 로그 꼭 쓰기!
Logger.log('✅ 고객 수: ' + data.length);
배운 점:
뭔가 이상하면 로그를 찍어서 확인하는 게 제일 중요함
처음, 중간, 끝 데이터를 다 확인해봐야 정확함
🔥 문제 3: 발신번호 승인 대기
증상:
위 화면처럼 "처리 대기중" 상태가 계속됨.
왜 이렇게 됐나?
문자를 보내려면 발신번호를 먼저 등록해야 함
등록하면 1~3일 정도 심사를 받아야 함
심사가 끝나야 실제 문자 발송 가능
대기하면서 한 일:
AI 메시지 생성 시스템 완성
고객 필터링 기능 완성
테스트 모드로 시뮬레이션
배운 점:
실제 서비스 하려면 법적 절차가 필요함
승인 기다리는 동안 다른 기능부터 만들면 시간 낭비 안 함
🔥 문제 4: 첫 발송에서 실패
상황:
"성공: 0명 / 실패: 1명" 이렇게 나옴
시도한 것들:
1단계: 발신번호 확인
발신번호: 02-XXXX-XXXX
상태: 승인 완료
→ 문제없음
2단계: API 키 확인
네이버 클라우드 콘솔에서 API 키 재생성
→ 문제없음
3단계: 로그 확인
Logger.log('발송 시도: ' + customerPhone);
Logger.log('발송 결과: ' + response);
→ "인증 오류" 발견!
최종 해결: 네이버 클라우드 콘솔에서 서비스 ID를 잘못 입력했던 게 문제였어요.
배운 점:
API 연동할 때는 ID, 키, 시크릿 모두 정확해야 함
로그로 어디서 막혔는지 확인하는 게 핵심
핵심 코드 설명 (쉽게)
1. 고객 데이터 제대로 읽기
function getCustomers() {
// 1. 고객 DB 시트 열기
const dbUrl = '고객DB_시트_주소';
const dbSheet = SpreadsheetApp.openByUrl(dbUrl)
.getSheetByName('고객DB');
// 2. 마지막 줄 찾기
const lastRow = dbSheet.getLastRow();
// 3. 2번째 줄부터 마지막까지 읽기
// (1번째 줄은 제목이니까 제외)
const data = dbSheet.getRange(2, 1, lastRow - 1, 30).getValues();
// 4. 확인 로그
Logger.log('읽은 고객: ' + data.length + '명');
Logger.log('첫 고객: ' + data[0][6]); // 이름
Logger.log('마지막 고객: ' + data[data.length-1][6]);
return data;
}
이해하기 쉽게:
고객 명단 시트 열기
몇 줄까지 있는지 확인
제목 빼고 데이터만 읽기
잘 읽혔는지 확인
2. 문자 발송하기
function sendSMS(phoneNumber, message) {
// 1. 네이버 클라우드 정보
const serviceId = '내_서비스_ID';
const accessKey = '내_액세스_키';
const secretKey = '내_시크릿_키';
const senderNumber = '02-1234-5678'; // 승인받은 번호
// 2. 발송 정보 만들기
const smsData = {
type: 'SMS',
from: senderNumber,
content: message,
messages: [{
to: phoneNumber
}]
};
// 3. 발송 시도
try {
const response = callNaverSmsApi(smsData);
if (response.statusCode === '202') {
Logger.log('✅ 발송 성공: ' + phoneNumber);
return true;
} else {
Logger.log('❌ 발송 실패: ' + phoneNumber);
return false;
}
} catch (error) {
Logger.log('❌ 오류 발생: ' + error);
return false;
}
}
3. 필터링 + 발송 한 번에
function filterAndSend() {
const sheet = SpreadsheetApp.getActiveSheet();
// 1. AI가 만든 필터링 코드 가져오기
const filterCode = sheet.getRange('C17').getValue();
// 2. AI가 만든 메시지 가져오기
const message = sheet.getRange('C8').getValue();
// 3. 고객 데이터 읽기
const customers = getCustomers();
// 4. 필터링 실행
eval(filterCode);
const filtered = filterCustomers(customers);
Logger.log('보낼 고객: ' + filtered.length + '명');
// 5. 한 명씩 발송
let success = 0;
let fail = 0;
for (let customer of filtered) {
const phone = customer[8]; // 전화번호
const name = customer[6]; // 이름
// 변수 치환 ({{고객명}} → 실제 이름)
const personalMessage = message.replace('{{고객명}}', name);
// 발송
if (sendSMS(phone, personalMessage)) {
success++;
} else {
fail++;
}
// 0.5초 쉬기 (API 제한 방지)
Utilities.sleep(500);
}
// 6. 결과 알림
SpreadsheetApp.getUi().alert(
'📱 발송 완료!\n\n' +
'성공: ' + success + '명\n' +
'실패: ' + fail + '명'
);
}
실제로 써본 예시
한국어 텍스트가 포함된 Google 스프레드시트의 스크린샷
시트 구조 설명
<실제 시트 화면>
우리가 만든 시트는 크게 2개 섹션으로 나뉘어요:
1. CRM 메시지 섹션
내가 대충 쓴 내용: 원본 문자 초안
내용 작성 프롬프트: AI한테 어떻게 다듬어달라고 할지 (스마트칩 연결)
AI가 다듬어준 내용 결과: 최종 메시지
2. 타겟 고객 섹션
타겟 설명: 프리랜서 (어떤 고객을 찾을지)
고객 DB: 고객 명단 시트 (스마트칩으로 연결)
시트명: DB
조건식 생성 프롬프트: AI가 필터링 코드를 만들도록 하는 프롬프트 (스마트칩 연결)
조건식: AI가 만든 실제 필터링 코드
예시 1: 프리랜서 타겟 마케팅
1단계: 내가 대충 쓴 문자
좋이 명함은 이제 그만! NFC 카링명 명함으로 스마트하게 비즈니스를 시작하세요.(오타도 있고 띄어쓰기도 엉망이에요 😅)
2단계: AI한테 다듬기 부탁
프롬프트에 이렇게 써있어요:
좋이 명함은 이제 그만! NFC 카링명 명함으로 스마트하게 비즈니스를 시작하세요.
톡- 갓다 대는 1초면
프로필·포트폴리오·SNS가 즉시 열려요.
잉어버리지도, 버려지지도 않는
가장 스마트한 명함입니다.3단계: AI 결과
📇 SMS 마케팅문구 프롬프트
좋이 명함은 이제 그만! NFC 카링 명함으로 스마트하게 비즈니스를 시작하세요.
'톡' 1초 터치면 프로필·포트폴리오·SNS가 즉시 공유됩니다!
잉어버린 일도, 버려질 일도 없는 혁신적인 명함, 지금 경험하세요!4단계: 고객 필터링
조건식 생성 프롬프트:
📋 19 crm 스터디 신청자 프롬프트 조건식AI가 만든 필터링 코드:
javascript
function filterCustomers(data) {
return data.filter(row => {
return row[10] === "프리워커";
});
}
```
**결과:**
- 전체 고객: 100명
- 프리워커(프리랜서): 18명 추출
- 1명 선택
- 실패 발송: 1명 (현재 sms api 가 정상적으로 연결이 안된 상태)
---
그 외 다양한 조건 조합
복잡한 조건 예시:
타겟 1: VIP이면서 30대
javascript
function filterCustomers(data) {
return data.filter(row => {
return row[22] === "VIP" && row[11] >= 30 && row[11] < 40;
});
}타겟 2: 서울 거주 + 마케팅 동의
javascript
function filterCustomers(data) {
return data.filter(row => {
return row[13].includes("서울") && row[20] === "Y";
});
}타겟 3: 이탈 위험 고객
javascript
function filterCustomers(data) {
return data.filter(row => {
const days = (new Date() - new Date(row[0])) / (1000*60*60*24);
return days > 90 && row[28] === "높음";
});
}
```
---
### 실제 화면 흐름
**1. 메시지 작성**
```
[내가 대충 쓴 내용]
→ AI 다듬기 버튼 클릭
→ [AI가 만든 전문 메시지]
```
**2. 고객 필터링**
```
[타겟 설명: 프리랜서]
→ 조건식 생성 버튼 클릭
→ [AI가 만든 필터 코드]
```
**3. 발송**
```
[고객 선택 화면]
✓ 윤채야 (010-8027-7916) SILVER
✓ 서도윤 (010-1361-0249) SILVER
→ 선택된 고객에게 SMS 발송 버튼
→ [발송 결과 확인]프롬프트 템플릿 활용 팁
SMS 마케팅문구 프롬프트 (스마트칩)
Google Docs에 저장
시트에서
@문서이름입력자동으로 프롬프트 내용 불러옴
수정은 문서에서만 하면 됨
조건식 생성 프롬프트 (스마트칩)
30개 컬럼 정보 다 들어있음
시트에서
@문서이름입력AI가 정확한 컬럼 인덱스로 코드 생성
장점:
프롬프트 버전 관리 쉬움
팀원들과 공유 가능
한 곳만 수정하면 전체 적용
배운 점
스마트칩이 진짜 편해요
프롬프트를 문서 로 관리
시트가 깔끔해짐
수정 시 한 곳만 변경
컬럼 인덱스 꼭 확인
row[10]: 직업
row[22]: 등급
row[28]: 이탈위험도
하나라도 틀리면 이상한 결과 나옴
테스트는 소수로 먼저
처음엔 2-3명한테만 보내기
잘 되면 전체 발송
실수해도 피해 적음
Gemini vs Claude 비교 (내 경험)
스터디 모임에서 있었던 일
Claude 쓸 때:
✅ 코드 설명은 엄청 자세함
⚠️ Apps Script 환경 특성 이해 부족
⚠️ 응답이 느려지거나 끊김
❌ 틀린 코드 줘서 오류 남
Gemini로 바꾼 후:
✅ Apps Script 코드를 정확하게 생성
✅ Google Sheets 연동 질문에 바로 답변
✅ 응답 속도 2-3배 빠름
✅ 실행했을 때 바로 작동함
특히 좋았던 점: "C13 셀 값으로 고객 필터링해줘" 이런 질문에:
Claude: 일반적인 코드 제공 (시트 연동 부분 수정 필요)
Gemini: Apps Script에 맞는 정확한 코드 바로 제공
결론: 구글 제품 쓸 거면 Gemini가 훨씬 편해요!
앞으로 할 일
완료된 것 ✅
AI 메시지 생성
고객 필터링 자동화
문자 발송 연동
발송 결과 추적
곧 할 일 📋
웹페이지 만들기 (제일 하고 싶은 거!)
고객이 직접 "할인 알림 받고 싶어요" 클릭
자동으로 시트에 저장
관리자는 시트만 보면 됨
자동 스케줄링
매주 월요일 오전 10시에 자동 발송
공휴일은 건너뛰기
성과 측정
문자 열람률 확인
링크 클릭률 측정
효과 좋은 메시지 찾기
꿀팁 정리
1. 로그는 많이, 자세하게
나쁜 예:
Logger.log('오류');
좋은 예:
Logger.log('=== 발송 시작 ===');
Logger.log('대상 고객: ' + customers.length + '명');
Logger.log('발송 메시지: ' + message);
Logger.log('발신번호: ' + senderNumber);
이렇게 쓰면 문제 찾기 진짜 쉬워요!
2. 한 번에 하나씩만
// 단계별로 나눠서 테스트
function test1_고객읽기() { ... }
function test2_필터링() { ... }
function test3_메시지생성() { ... }
function test4_발송() { ... }
한꺼번에 하면 어디서 문제인지 모름!
3. 실패해도 괜찮아요
발송 실패한 사람들 기록하기:
const failedList = [];
if (!sendSMS(phone, message)) {
failedList.push({
name: name,
phone: phone,
reason: '발송 실패'
});
}
// 나중에 다시 시도
참고 자료
내가 만든 것들
공식 가이드
스터디장님이 tip으로 알려주셨는데, 공식문서를 넣어서 ai를 이해를 먼저 시키는게 중요했어요. (apps script, 구글 스마트칩, 네이버 sms api 등의 공식문서를 첨부하기!!)
마무리
제일 중요한 것들
로그가 답이다
문제의 80%는 로그 보면 해결됨
발송 성공/실패도 로그로 확인
한 번에 완성하려 하지 말기
처음: 메시지만 만들기
다음: 고객 찾기
마지막: 발송 연결
법적 절차 꼭 지키기
발신번호 등록 필수
고객 동의 확인
야간 발송 금지 (21시~8시)
Gemini 추천!
구글 제품 쓸 거면 Gemini가 최고
빠르고 정확함
단, 프로젝트 기능으로 문서 백업및 보관은 클로드가 용이했습니다.
이걸 만들려는 사람들에게
✅ 프로그래밍 몰라도 됨: AI가 코드 만들어줌
✅ 실제 화면 보면서 따라하면 됨
✅ 실패해도 괜찮음: 로그 보면서 해결
⚠️ 발신번호 승인 시간 고려하기
궁금한 거 있으면 댓글 달아주세요! 특히 웹사이트 만드는 부분 조언 환영합니다 🙌
#CRM자동화 #AI문자발송 #구글시트 #네이버클라우드 #Gemini활용 #실전활용