# 3-3-1.실습-Apps Script 웹 앱

# 📑 실습: 프로모션 쿠폰 발급 웹 앱

- **목표**: 고객이 이름·이메일 입력 → 고유 쿠폰 코드 발급 & 이메일 전송

- **구조**:

    - `index.html` → 입력 폼

    - `Code.gs` → 코드 생성 + 이메일 발송

- **성과**: 자동 쿠폰 발급 → 반응률 실시간 추적 가능

---

### 1. 실습 목표

- 사용자가 웹 앱에 접속 → 이름·이메일 입력

- Apps Script가 **쿠폰 코드 생성** → Google Sheet에 저장

- 동시에 입력한 이메일 주소로 **쿠폰 코드 발송**

👉 마케팅 현장에서 자주 쓰이는 **신규 고객 확보 이벤트**를 직접 구현해보는 경험

---

### 2. 파일 구성

1. **Code.gs**

- 쿠폰 코드 생성

- Google Sheet에 저장

- Gmail API로 메일 발송

2. **index.html**

- 이름, 이메일 입력폼 제공

- 제출 시 `Code.gs` 함수 호출

---

### 3. 코드 예제

- 크롬 브라우저 > "sheet.new" > 확장 프로그램 > Apps Script

**Code.gs**

```
function doGet() {
  return HtmlService.createHtmlOutputFromFile('index');
}

function generateCouponCode() {
  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  let code = '';
  for (let i = 0; i < 8; i++) {
    code += chars.charAt(Math.floor(Math.random() * chars.length));
  }
  return code;
}

function saveAndSend(formData) {
  const sheet = SpreadsheetApp.openById('스프레드시트_ID').getActiveSheet();
  const coupon = generateCouponCode();

  // 시트에 저장
  sheet.appendRow([formData.name, formData.email, coupon, new Date()]);

  // 이메일 발송
  GmailApp.sendEmail(
    formData.email,
    "프로모션 쿠폰 코드",
    `${formData.name}님, 쿠폰 코드: ${coupon}`
  );

  return coupon;
}
```

**index.html**

```
<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>프로모션 쿠폰 발급</title>
  <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;600&display=swap" rel="stylesheet">
  <style>
    body {
      font-family: 'Poppins', 'Noto Sans KR', sans-serif;
      background: linear-gradient(135deg, #74ebd5 0%, #ACB6E5 100%);
      display: flex;
      justify-content: center;
      align-items: center;
      height: 100vh;
      margin: 0;
    }
    .card {
      background: #fff;
      border-radius: 20px;
      padding: 40px;
      max-width: 400px;
      width: 100%;
      box-shadow: 0 10px 30px rgba(0,0,0,0.1);
      text-align: center;
    }
    h2 {
      margin-bottom: 20px;
      color: #333;
    }
    input[type="text"], input[type="email"] {
      width: 100%;
      padding: 12px;
      margin: 10px 0 20px;
      border: none;
      border-bottom: 2px solid #ccc;
      outline: none;
      font-size: 14px;
      transition: border-color 0.3s;
    }
    input[type="text"]:focus, input[type="email"]:focus {
      border-color: #74ebd5;
    }
    button {
      background: linear-gradient(135deg, #74ebd5 0%, #ACB6E5 100%);
      border: none;
      padding: 12px 20px;
      color: #fff;
      font-size: 16px;
      border-radius: 30px;
      cursor: pointer;
      transition: transform 0.2s, box-shadow 0.2s;
    }
    button:hover {
      transform: translateY(-2px);
      box-shadow: 0 5px 15px rgba(0,0,0,0.2);
    }
    #result {
      margin-top: 20px;
      font-weight: 600;
      color: #333;
    }
  </style>
</head>
<body>
  <div class="card">
    <h2>✨ 프로모션 쿠폰 발급 ✨</h2>
    <form id="couponForm">
      <input type="text" name="name" placeholder="이름을 입력하세요" required>
      <input type="email" name="email" placeholder="이메일을 입력하세요" required>
      <button type="submit">쿠폰 받기</button>
    </form>
    <p id="result"></p>
  </div>

  <script>
    document.getElementById("couponForm").addEventListener("submit", function(e){
      e.preventDefault();
      google.script.run.withSuccessHandler(function(coupon){
        document.getElementById("result").innerText = 
          "🎉 발급된 쿠폰 코드: " + coupon + " (이메일로도 발송되었습니다)";
      }).saveAndSend({
        name: this.name.value,
        email: this.email.value
      });
      this.reset();
    });
  </script>
</body>
</html>
```

---

- Apps Script 생성

![Image](https://upload.cafenono.com/image/slashpageHome/20250926/200305_s2iLF3rGF99ZIIuh81?q=80&s=1280x180&t=outside&f=webp)

- "+" > HTML > "Index.html" 생성

![Image](https://upload.cafenono.com/image/slashpageHome/20250926/200331_xoDm0He89q0kY6Qvsg?q=80&s=1280x180&t=outside&f=webp)

- "새 배포" 

![Image](https://upload.cafenono.com/image/slashpageHome/20250926/200957_5Q4hueAleY3NdnO6dK?q=80&s=1280x180&t=outside&f=webp)

- "웹 앱"

![Image](https://upload.cafenono.com/image/slashpageHome/20250926/201021_VHQSwlY4wIACpvXQIY?q=80&s=1280x180&t=outside&f=webp)

- 실습에선 "모든 사용자" 선택

![Image](https://upload.cafenono.com/image/slashpageHome/20250926/201120_lro26a4FPY6yDPNZpT?q=80&s=1280x180&t=outside&f=webp)

- "액세스 승인" > "Allow" 허용하기

![Image](https://upload.cafenono.com/image/slashpageHome/20250926/201228_b9OhfceGbUHDfqKMqX?q=80&s=1280x180&t=outside&f=webp)

- 웹 앱 URL 복사

![Image](https://upload.cafenono.com/image/slashpageHome/20250926/201309_8v6YqVfSeRNCCsh1V7?q=80&s=1280x180&t=outside&f=webp)

- 완성된 index.html 화면

![Image](https://upload.cafenono.com/image/slashpageHome/20250926/201401_XhG7b5oDr1xizudf5N?q=80&s=1280x180&t=outside&f=webp)

---

### 4. 실행 흐름

1. 고객이 웹 주소 접속 → 입력폼 표시 (`doGet()`)

2. 이름·이메일 입력 후 제출 → `saveAndSend()` 실행

3. 랜덤 쿠폰 코드 생성 → Google Sheet에 저장

4. Gmail API를 통해 고객 이메일로 쿠폰 발송

5. 화면에 발급된 쿠폰 코드 표시

---

### 5. 배포 과정

1. Apps Script 에디터 상단 → **배포 → 새 배포**

2. 유형 선택 → **웹 앱**

3. 접근 권한 설정 (예: 링크가 있는 모든 사용자)

4. URL 생성 → 공유 가능

👉 이제 누구나 링크에 접속해서 이름·이메일을 입력하면, 자동으로 Google Sheet에 저장됨

---

---

# 📑 Apps Script 웹 앱 보안 & 배포

- **배포 = 웹 주소(URL) 만들기**

- **접근 권한 옵션**: 나만 / 조직 내 / 링크 있는 사람 누구나

- **보안 개념**: 권한 동의(OAuth), 데이터 접근 제한

- **주의사항**: 민감 정보 저장 X, 공유 권한 신중히 설정

---

### 1. 배포란?

- 작성한 Apps Script를 **웹에서 쓸 수 있도록 공개하는 과정**

- 배포하면 **웹 주소(URL)** 가 생기며, 그 주소를 통해 사람들이 접속 가능

👉 비유: 원고(코드)를 책으로 출판하는 것 → 출판해야 다른 사람이 읽을 수 있음

---

### 2. 배포 단계

1. **에디터 상단 메뉴** → "배포" 클릭

2. **새 배포 → 웹 앱(Web App)** 선택

3. **접근 권한 설정**

- **나만(Me)**: 로그인한 나만 실행 가능

- **내 조직만**: 같은 회사/학교 도메인 사람만 접속 가능

- **링크가 있는 누구나**: 주소를 아는 사람은 누구든 접속 가능

---

### 3. 보안과 권한

- Apps Script 웹 앱은 **사용자의 Google 계정 데이터**(Gmail, Sheets, Drive 등)에 접근할 수 있음

- 그래서 처음 실행할 때는 **"이 앱이 권한을 요청합니다"** 라는 팝업(OAuth 동의창)이 뜸

- 사용자는 **허용/거부**를 선택해야 앱이 정상 동작

👉 쉽게 말해, 앱이 "내 이메일/문서에 접근해도 돼?" 하고 묻는 것

---

### 4. 주의사항

1. **민감 정보 저장 금지**

- 주민번호, 비밀번호 같은 민감 데이터는 수집하지 말 것

2. **공유 범위 최소화**

- 꼭 필요한 경우에 "링크 있는 누구나" 

3. **테스트 후 배포**

- 코드 오류가 없는지 반드시 확인 후 공유

---

---

# 📑 Apps Script 웹 앱 확장 아이디어 (마케팅 실무 활용)

- **캠페인 리드 수집** → 입력폼 → 시트 자동 저장

- **데이터 집계·대시보드** → 실시간 성과 확인

- **자동 보고서 생성** → 이메일로 정리 발송

- **알림 서비스** → KPI 변동 시 Slack/메일 알림

---

### 1. 캠페인 리드(잠재 고객) 수집

- 웹 앱을 **랜딩페이지 폼**처럼 활용 → 이름, 이메일, 관심 상품 입력 받기

- 데이터가 자동으로 Google Sheet에 저장

- 장점: 광고 캠페인별로 입력폼을 구분해두면 **채널별 성과 추적**이 가능

👉 예: 페이스북 광고 클릭 → 웹 앱 폼 → 리드 저장

---

### 2. 마케팅 데이터 집계 & 대시보드

- Google Ads, Meta Ads, 네이버 광고 등에서 데이터를 가져와 Google Sheet에 저장

- Apps Script로 매일 자동 업데이트

- 웹 앱으로 간단한 **성과 대시보드(노출·클릭·전환)** 제공

👉 비유: 매일 아침 **자동으로 업데이트되는 성적표**

---

### 3. 자동 보고서 생성 & 배포

- 매일/매주 광고 성과를 요약 → PDF나 구글 슬라이드 형태로 자동 생성

- 담당자에게 이메일 발송

- 장점: 반복 보고 작업 최소화, 팀원은 바로 확인 가능

👉 예: 매주 월요일 오전 9시 → 전주 광고 성과 보고서 자동 발송

---

### 4. 알림 서비스 (실시간 KPI 모니터링)

- 예산 소진, 클릭률 급락, 전환율 변화 같은 특정 조건 발생 시 자동 알림

- Slack, 이메일, 카카오톡 채널(Webhook)으로 전달

- 빠른 대응 가능 → **광고 낭비 방지**

---

### 5. 고객 참여 이벤트 페이지

- **예시**: "이메일 남기면 쿠폰 제공", "간단 퀴즈 참여 → 추첨 응모"

- 입력폼(웹 앱)으로 고객 정보 수집 → Google Sheet에 자동 저장

- 장점: **CRM 데이터 확보 + 캠페인별 참여도 추적 가능**

---

### 6. 프로모션 코드/쿠폰 발급

- 웹 앱에서 고객이 이름·이메일 입력 → **고유 쿠폰 코드 자동 생성 & 이메일 발송**

- 장점: 프로모션 반응률을 **실시간 모니터링** 가능

---

### 7. 고객 피드백·리뷰 수집

- 구매 후 고객에게 웹 앱 링크 제공 → 간단한 만족도 조사 입력

- 결과는 자동 집계 → 차트로 요약

- 장점: **리뷰 기반 인사이트 확보 + 빠른 대응**

---

### 8. 세일즈/재고 알림

- 고객이 관심 상품 등록 → 품절 시 알림 or 재입고 시 메일 자동 발송

- 장점: **재구매 유도 & 고객 충성도 강화**

---

### 9. 멤버십/이벤트 예약 시스템

- 웹 앱에서 행사/세미나 신청 → 참가자 명단 자동 생성

- 참가자 확인 메일 자동 발송

- 장점: **이벤트 운영 효율화**

---

📌 **핵심 포인트**
B2C 마케터는 웹 앱을 통해 **리드 확보 → 참여 유도 → 피드백 수집 → 성과 분석 → 고객 유지**까지 **마케팅 파이프라인 자동화 **가능

- Google Apps Script는 거창한 프로그래밍 지식이 없어도 작은 자동화와 간단한 웹 앱을 손쉽게 만들 수 있는 도구

- Apps Script와 같은 자동화 도구를 활용하고, 여러분은 더 중요한 일—브랜드를 이야기하고, 고객과 소통하며, 창의적 전략을 세우는 일—에 집중

---

For the site tree, see the [root Markdown](https://slashpage.com/lion.md).
