Google Apps Script로 Gemini AI 문자 메시지 다듬기 자동화

구글 시트로 고객에게 문자 자동으로 보내는 방법 (AI 활용)

왜 이걸 만들게 됐을까?

내가 겪었던 문제

회사에서 고객들에게 문자를 보낼 때마다 이런 일을 반복했어요:

  1. 엑셀에서 "VIP 고객 중에 최근 한 달 동안 안 산 사람" 찾기 → 30분 소요

  2. 그 사람들한테 보낼 문자 내용 쓰기 → 20분 소요

  3. 번호 하나하나 복사해서 문자 보내기 → 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일 정도 심사를 받아야 함

  • 심사가 끝나야 실제 문자 발송 가능

대기하면서 한 일:

  1. AI 메시지 생성 시스템 완성

  2. 고객 필터링 기능 완성

  3. 테스트 모드로 시뮬레이션

배운 점:

  • 실제 서비스 하려면 법적 절차가 필요함

  • 승인 기다리는 동안 다른 기능부터 만들면 시간 낭비 안 함


🔥 문제 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;
}

이해하기 쉽게:

  1. 고객 명단 시트 열기

  2. 몇 줄까지 있는지 확인

  3. 제목 빼고 데이터만 읽기

  4. 잘 읽혔는지 확인


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가 정확한 컬럼 인덱스로 코드 생성

장점:

  • 프롬프트 버전 관리 쉬움

  • 팀원들과 공유 가능

  • 한 곳만 수정하면 전체 적용


배운 점

  1. 스마트칩이 진짜 편해요

    • 프롬프트를 문서로 관리

    • 시트가 깔끔해짐

    • 수정 시 한 곳만 변경

  2. 컬럼 인덱스 꼭 확인

    • row[10]: 직업

    • row[22]: 등급

    • row[28]: 이탈위험도

    • 하나라도 틀리면 이상한 결과 나옴

  3. 테스트는 소수로 먼저

    • 처음엔 2-3명한테만 보내기

    • 잘 되면 전체 발송

    • 실수해도 피해 적음


Gemini vs Claude 비교 (내 경험)

스터디 모임에서 있었던 일

Claude 쓸 때:

  • ✅ 코드 설명은 엄청 자세함

  • ⚠️ Apps Script 환경 특성 이해 부족

  • ⚠️ 응답이 느려지거나 끊김

  • ❌ 틀린 코드 줘서 오류 남

Gemini로 바꾼 후:

  • Apps Script 코드를 정확하게 생성

  • ✅ Google Sheets 연동 질문에 바로 답변

  • 응답 속도 2-3배 빠름

  • ✅ 실행했을 때 바로 작동함

특히 좋았던 점: "C13 셀 값으로 고객 필터링해줘" 이런 질문에:

  • Claude: 일반적인 코드 제공 (시트 연동 부분 수정 필요)

  • Gemini: Apps Script에 맞는 정확한 코드 바로 제공

결론: 구글 제품 쓸 거면 Gemini가 훨씬 편해요!


앞으로 할 일

완료된 것 ✅

  • AI 메시지 생성

  • 고객 필터링 자동화

  • 문자 발송 연동

  • 발송 결과 추적

곧 할 일 📋

  1. 웹페이지 만들기 (제일 하고 싶은 거!)

    • 고객이 직접 "할인 알림 받고 싶어요" 클릭

    • 자동으로 시트에 저장

    • 관리자는 시트만 보면 됨

  2. 자동 스케줄링

    • 매주 월요일 오전 10시에 자동 발송

    • 공휴일은 건너뛰기

  3. 성과 측정

    • 문자 열람률 확인

    • 링크 클릭률 측정

    • 효과 좋은 메시지 찾기


꿀팁 정리

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 등의 공식문서를 첨부하기!!)


마무리

제일 중요한 것들

  1. 로그가 답이다

    • 문제의 80%는 로그 보면 해결됨

    • 발송 성공/실패도 로그로 확인

  2. 한 번에 완성하려 하지 말기

    • 처음: 메시지만 만들기

    • 다음: 고객 찾기

    • 마지막: 발송 연결

  3. 법적 절차 꼭 지키기

    • 발신번호 등록 필수

    • 고객 동의 확인

    • 야간 발송 금지 (21시~8시)

  4. Gemini 추천!

    • 구글 제품 쓸 거면 Gemini가 최고

    • 빠르고 정확함

    • 단, 프로젝트 기능으로 문서 백업및 보관은 클로드가 용이했습니다.

이걸 만들려는 사람들에게

  • ✅ 프로그래밍 몰라도 됨: AI가 코드 만들어줌

  • ✅ 실제 화면 보면서 따라하면 됨

  • ✅ 실패해도 괜찮음: 로그 보면서 해결

  • ⚠️ 발신번호 승인 시간 고려하기

궁금한 거 있으면 댓글 달아주세요! 특히 웹사이트 만드는 부분 조언 환영합니다 🙌

#CRM자동화 #AI문자발송 #구글시트 #네이버클라우드 #Gemini활용 #실전활용

3

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요