앱스스크립트로 자동응답메일 보내기가 이렇게 복잡할 리가 없다구!!!

소개

19기 과정을 계기로 반복되는 모임의 CRM 프로세스를 세팅하고 자동화 하기를 목표로 삼음

1. 모임 안내 상세페이지

2. SNS홍보용 카드 뉴스

3. 진행 PPT

4. 신청폼

5. 참가비 입금

6. 신청완료 회신 및 안내 메일

7. D-1 행사 리마인드 메일

8. 참가 후기 취합

9. 4, 5, 8 >> 고객데이터 관리DB 취합

진행 방법

일단 첫 단계로 신청폼을 만들고 제출을 하면 신청이 되었다는 내용의 자동응답 메일을 구현

  • AppsScript, Google form, Google sheet >> 폼과 데이터 수집, 프로세스 명령 세팅

  • Claud Code, Antigravity >> 응답용 자동응답 메일 작성 및 디버깅

(과정)

  1. 먼저 모집 요강이 담긴 폼을 작성(들어가는 삽화 생성도 Canva AI로 시도하였으나 결국 골라서 수작업으로 완성)

  2. 신청 양식 작성후 '제출' 클릭을 트리거로 회신이 가도록 앱스스크립트를 작성(클로드 코딩)해서 넣어 줌

  3. 테스트 결과 정상적으로 작동

but... 작업 중간에 뻘모레가 남아 있는 조개요리 처럼, 바라는 대로 작동하지 않아 반복적인 디버깅을 하였음.

재설정이라는 단어가 포함된 웹사이트의 스크린샷
중국어로 된 Google 스프레드시트의 스크린샷

앱스 스크립트 세팅은 폼에서도 시트에서도 확장프로그램 메뉴(퍼즐모양아이콘)으로 할 수 있는데(아래 영상을 참고하였음) 결과적으로 구글시트에서 확장프로그램을 통해 하는 게 더 간단했음.

https://youtu.be/FvZ2tM0m7AY?si=f8B8x4AkBG5hDdUI

한국어로 된 문자 메시지의 스크린샷

지속적으로 에러가 났던 부분은 회신메일이 코딩텍스트 그대로 전달되는 것과 신청자의 이름이 제대로 호출되지 않는 것이었다. antigravity에게 계속 물어 디버깅을 했는데 좀처럼 해결되지 않아서 답답했다.(살짝 감정이입됨)

한국어 텍스트 편집기의 스크린샷
코칭 제타

이래저래 우여곡절 끝에 원하는 답을 찾아서 완성하였다.

"아 뭐 꼭 그렇게까지 해?" 라고 누군가 물을 수도 있겠으나,

이게 바로 내가 원했던 최소한의 결과여서 일단은 만족스럽다.

  • Antigravity가 최종적으로 수정해 준 코드

// [중요] 이 코드를 복사해서 기존 내용을 모두 지우고 붙여넣으세요.

function onFormSubmit(e) {
  try {
    var name = e.namedValues['신청자 이름(별명)'] ? e.namedValues['신청자 이름(별명)'][0] : "신청자";
    var email = e.namedValues['E-mail을 적어주세요.'] ? e.namedValues['E-mail을 적어주세요.'][0] : "";

    if (email) {
      sendEmail(email, name);
    } else {
      Logger.log("이메일 주소를 찾을 수 없습니다.");
    }
  } catch (error) {
    Logger.log("오류 발생: " + error.toString());
  }
}

function sendEmail(recipientEmail, name) {
  var htmlBody = getHtmlContent();
  htmlBody = htmlBody.replace('{{신청자 이름(별명)}}', name);
  
  // GmailApp 사용 (HTML 본문 전송)
  GmailApp.sendEmail(recipientEmail, 'Re:set 2026 신청 완료', 'HTML 메일을 지원하지 않는 환경입니다.', {
    htmlBody: htmlBody
  });
}

function testSendEmail() {
  var myEmail = Session.getActiveUser().getEmail();
  sendEmail(myEmail, "홍길동(테스트)"); 
  Logger.log("테스트 이메일 발송 완료: " + myEmail);
}

function getHtmlContent() {
  // [중요] 이메일에서는 <style> 태그가 무시될 수 있어서, 모든 디자인을 '인라인 스타일'로 바꿨습니다.
  // 이제 색상과 디자인이 제대로 보일 것입니다.
  return `
    <div style="font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background-color: #f5f5f5; padding: 20px; margin: 0;">
      <div style="max-width: 600px; margin: 0 auto; background-color: #ffffff; border-radius: 8px; overflow: hidden; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);">
        
        <!-- 헤더 -->
        <div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 40px 20px; text-align: center;">
            <div style="font-size: 24px; font-weight: bold; margin-bottom: 10px; letter-spacing: 2px;">COACHING JETTA</div>
            <div style="font-size: 13px; opacity: 0.9;">당신의 성장을 돕는 근사한 친구</div>
        </div>

        <!-- 본문 -->
        <div style="padding: 40px 30px;">
            <div style="font-size: 16px; color: #333; margin-bottom: 20px; line-height: 1.6;">안녕하세요 {{신청자 이름(별명)}} 님.</div>

            <div style="background-color: #e8f5e9; border-left: 4px solid #4caf50; padding: 15px 20px; margin-bottom: 30px; border-radius: 4px; font-weight: 600; color: #2e7d32;">
                ✓ Re:set 2026에 신청이 완료되었습니다.
            </div>

            <div style="font-size: 15px; color: #555; line-height: 1.8; margin-bottom: 30px; text-align: justify;">
                2025년 가는 해를 돌아보고,<br>
                2026 새해를 다짐하는 유익한 시간에 함께 해주셔서 감사합니다.<br>
                <br>
                행사 이틀 전 다시 한 번 리마인드 메일을 드릴 예정입니다.
            </div>

            <div style="font-size: 14px; font-weight: 600; color: #333; margin-bottom: 15px; text-decoration: underline;">[행사 안내]</div>

            <div style="background-color: #f9f9f9; border: 1px solid #e0e0e0; border-radius: 6px; padding: 20px; margin-bottom: 30px;">
                <div style="display: flex; margin-bottom: 12px; font-size: 14px; color: #333;">
                    <div style="font-weight: 600; min-width: 60px; margin-right: 15px; color: #667eea;">■ 일시</div>
                    <div style="flex: 1; color: #555;">2026년 12월 13일(토) 14:00-16:30</div>
                </div>
                <div style="display: flex; margin-bottom: 12px; font-size: 14px; color: #333;">
                    <div style="font-weight: 600; min-width: 60px; margin-right: 15px; color: #667eea;">■ 장소</div>
                    <div style="flex: 1; color: #555;">도곡 타워팰리스 C동 1층 주민회의실</div>
                </div>
            </div>

            <div style="font-size: 13px; color: #666; background-color: #fff9e6; border-left: 3px solid #ffc107; padding: 12px 15px; margin-bottom: 30px; border-radius: 4px;">
                &#128161; 행사 이틀 전에 리마인드 메일이 발송될 예정이니 참고하시기 바랍니다.
            </div>

            <div style="font-size: 14px; color: #666; line-height: 1.8; text-align: center; margin-bottom: 20px;">
                당신의 성장을 돕는 근사한 친구같은 바람..
            </div>

            <div style="font-style: italic; color: #667eea; font-weight: 600; text-align: right; margin-top: 20px;">
                COACHING JETTA 드림
            </div>
        </div>

        <!-- 푸터 -->
        <div style="background-color: #f5f5f5; padding: 20px; text-align: center; font-size: 12px; color: #999; border-top: 1px solid #e0e0e0;">
            © 2025 COACHING JETTA. All rights reserved.
        </div>
      </div>
    </div>
  `;
}

결과와 배운 점

  • 바이브 코딩이라고 해도 스스로 계속 문제해결을 위한 다각적인 의심가능성을 유추해보는 노력이 필요

  • 사소한 것들의 기초적 확인 (내가 한 실수, 폼과 코딩에 사용한 변수의 네이밍의 정확한 일치 확인 필요)

  • 추후 이어지는 단계에 대한 세팅작업을 계속 이어가 볼 예정

  • 추가적인 오지랖..

    - 클로드코드를 visual studio Code에서 불러서 사용하는데, antigravitiy도 클로드코드처럼 vibe coding을 하잖아.. 이 둘은 무슨차이야?
    - Claude Code와 Antigravity의 차이를 설명해드릴게요.

Claude Code는 Anthropic이 만든 공식 CLI 도구로, 터미널에서 Claude에게 코딩 작업을 위임하는 에이전틱 코딩 도구예요. VS Code에서 터미널을 열어서 사용하시는 거죠.

Antigravity는 Codeium이 만든 AI 코딩 어시스턴트인데, VS Code 익스텐션 형태로 작동해요. "vibe coding"이라는 유사한 경험을 제공하지만 몇 가지 차이가 있어요:

주요 차이점:

  • 통합 방식: Claude Code는 CLI 기반이고, Antigravity는 VS Code 익스텐션이라 IDE에 더 깊게 통합되어 있어요

  • AI 모델: Claude Code는 Claude 4 모델을 사용하고, Antigravity는 Codeium의 자체 AI 모델을 사용해요

  • 인터페이스: Claude Code는 터미널 중심, Antigravity는 VS Code UI 내에서 더 시각적으로 작동해요

  • 기능 범위: 둘 다 에이전틱하게 코드를 작성하지만, 각자의 강점과 특화된 기능이 달라요

-그럼 이 둘을 어떤 경우로 나누어 적용해 사용하면 좋을까?

- 두 도구를 상황에 맞게 나누어 쓰면 효율적일 것 같아요.

Claude Code를 쓰면 좋은 경우:

  • 프로젝트 전체를 처음부터 생성하거나 큰 구조 변경이 필요할 때 - Claude의 추론 능력이 뛰어나서 복잡한 아키텍처 결정에 강해요

  • 여러 파일에 걸친 대규모 리팩토링이나 기능 추가할 때

  • 명확한 작업 지시를 주고 자율적으로 완성하게 하고 싶을 때

  • 문서화나 테스트 코드 자동 생성처럼 문맥 이해가 중요한 작업

  • Google Sheets, HR 자동화처럼 타마님이 하시는 복잡한 비즈니스 로직 구현할 때

Antigravity를 쓰면 좋은 경우:

  • 실시간으로 코드 작성하면서 즉각적인 제안이 필요할 때

  • 빠른 코드 완성이나 작은 함수 작성할 때

  • VS Code UI 내에서 끊김 없이 작업하고 싶을 때

  • 반복적인 패턴 코딩이나 보일러플레이트 코드 생성

  • 가볍고 빠른 응답이 필요한 일상적인 코딩 작업

실전 조합 예시:

  1. Claude Code로 Google Apps Script 프로젝트 구조와 핵심 로직 생성

  2. Antigravity로 세부 함수들 빠르게 채워넣고 수정

타마님의 HR 자동화 작업 특성상, 기획과 설계는 Claude Code로, 실시간 수정과 디버깅은 Antigravity로 나누면 좋을 것 같아요.

(도움되었던 자료)

스터디장님의 조언 과 사례글

1

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요