Apps Script로 만드는 CS 자동 응대 Gmail

소개

  • 기업 CS 메일을 받는 gmail을 가정

  • 고객 메일 제목에 '문의'라는 단어가 포함되는 메일을 CS 대상 메일로 가정.

  • Apps script를 통해서 두 가지 작업 자동화

    • '문의' 메일들만 선별하여 Google Sheet에 기록

    • '문의' 메일들의 본문 키워드를 통해서 유형을 나누고, 유형별로 자동 회신 메일 발송

  • 문의 유형 / 본문 키워드 : '환불', '배송', '계정', '기타' - 일단 4가지로 분류토록 함

  • 자동 메일 형식 ('환불' 예시)

안녕하세요, 고객님 😊

고객님의 문의를 접수하였습니다. 아래와 같이 안내드립니다.

📌 문의 내용:
━━━━━━━━━━━━━━━━━
💬 고객명: [고객명]
📧 이메일: [고객 이메일]
📝 문의 내용: 환불 문의드립니다 - 안녕하세요, 주문한 상품을 환불받고 싶어요. 어떻게 하면 될까요?
━━━━━━━━━━━━━━━━━

📢 자동 응답:
고객님의 환불 요청을 접수하였습니다. 영업일 기준 3일 이내에 처리가 완료됩니다.

추가로 궁금한 점이 있으시면 언제든지 문의해 주세요! 😊

[회사명] 고객 지원팀 드림.

📞 고객센터: [고객센터 번호]  
📧 이메일: [회사 이메일]  
🌍 웹사이트: [회사 웹사이트 링크]

진행 방법

1.제목에 '문의'가 포함된 메일을 선별하여, 구글 시트로 가져오는 함수 생성.
Apps Script

function saveCustomerInquiries() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("고객문의");
  if (!sheet) {
    sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet("고객문의");
  }

  // 🚀 [헤더 설정] 1행에 정확한 제목 생성 + 스타일 적용
  if (sheet.getLastRow() === 0) {
    sheet.appendRow(["날짜", "고객명", "이메일 주소", "메일 제목", "문의 내용"]);
    formatSheet(sheet); // 스타일 적용 함수 호출
  }

  var threads = GmailApp.search('subject:문의 newer_than:7d'); // 제목에 '문의'가 포함된 최근 7일 이메일 검색
  var messages = threads.map(thread => thread.getMessages()).flat();

  var existingData = sheet.getDataRange().getValues().map(row => ({
    date: row[0] ? new Date(row[0]).toDateString() : "", // 날짜 (yyyy-mm-dd 형식)
    email: row[2] || "", // 이메일
    subject: row[3] || "" // 제목
  }));

  messages.forEach(message => {
    var date = new Date(message.getDate()).toISOString().split("T")[0]; // YYYY-MM-DD 형식
    var fromRaw = message.getFrom(); 
    var subject = message.getSubject();
    var body = message.getPlainBody();

    // 이메일과 고객명 분리
    var emailMatch = fromRaw.match(/<(.*?)>/);
    var customerEmail = emailMatch ? emailMatch[1] : fromRaw;
    var customerName = fromRaw.replace(/<.*?>/g, "").trim() || "고객명 없음"; 

    var isDuplicate = existingData.some(entry => 
      entry.date === date && entry.email === customerEmail && entry.subject === subject
    );

    if (!isDuplicate) {
      sheet.appendRow([date, customerName, customerEmail, subject, body]);
    }
  });

  formatSheet(sheet); // 📌 새로운 데이터가 추가될 때마다 스타일 적용
  Logger.log("고객 문의 저장 완료!");
}

2.구글 시트를 예쁘게 정렬하는 함수

// ✅ 스타일을 적용하는 함수
function formatSheet(sheet) {
  var range = sheet.getRange("A1:E1"); // 헤더 범위 선택
  range.setFontWeight("bold")  // 글자 굵게
       .setBackground("#d3d3d3") // 배경색 회색
       .setHorizontalAlignment("center"); // 가운데 정렬

  // 데이터 셀 스타일 적용
  var dataRange = sheet.getDataRange();
  dataRange.setVerticalAlignment("middle"); // 세로 정렬

  // 열 너비 자동 조정
  sheet.setColumnWidth(1, 120); // 날짜
  sheet.setColumnWidth(2, 150); // 고객명
  sheet.setColumnWidth(3, 200); // 이메일
  sheet.setColumnWidth(4, 300); // 메일 제목
  sheet.setColumnWidth(5, 500); // 문의 내용 (넓게)

  // 본문 내용(E열) 자동 줄 바꿈 설정
  sheet.getRange("E:E").setWrap(true);
}

- 구글 시트 결과 화면(1, 2번 결과)

한국 TV 가이드 - 스크린 샷

3.문의 유형에 따라서 자동 회신 메일 함수 - Apps Script

function sendAutoReplyEmail(customerEmail, customerName, inquiryMessage) {
  var subject = "[문의 접수 완료] 고객님의 문의에 대한 답변입니다! 😊";
  var responseMessage = getPredefinedResponse(inquiryMessage);
  
  var body = "안녕하세요, " + customerName + "님 😊\n\n" +
             "고객님의 문의를 접수하였습니다. 아래와 같이 안내드립니다.\n\n" +
             "📌 문의 내용:\n" +
             "━━━━━━━━━━━━━━━━━\n" +
             "💬 고객명: " + customerName + "\n" +
             "📧 이메일 주소: " + customerEmail + "\n" +
             "📝 문의 내용: " + inquiryMessage + "\n" +
             "━━━━━━━━━━━━━━━━━\n\n" +
             "📢 자동 응답:\n" +
             responseMessage + "\n\n" +
             "추가로 궁금한 점이 있으시면 언제든지 문의해 주세요! 😊\n\n" +
             "[회사명] 고객 지원팀 드림.\n\n" +
             "📞 고객센터: [고객센터 번호]\n" +
             "📧 이메일: [회사 이메일]\n" +
             "🌍 웹사이트: [회사 웹사이트 링크]";
  
  GmailApp.sendEmail(customerEmail, subject, body);
}

// 🔹 고객 문의 유형별 사전 정의된 응답을 반환하는 함수
function getPredefinedResponse(inquiryMessage) {
  Logger.log("📌 문의 내용 확인: " + inquiryMessage); // 로그 추가

  var responseTemplates = {
    "환불": "고객님의 환불 요청을 접수하였습니다. 영업일 기준 3일 이내에 처리가 완료됩니다.",
    "배송": "배송 관련 문의 감사합니다. 현재 배송 상태는 [배송 상태 조회 링크]에서 확인할 수 있습니다.",
    "계정": "계정 관련 문제를 해결하려면 [계정 복구 페이지 링크]를 방문해 주세요.",
    "기타": "문의 내용을 확인하였으며, 빠른 시일 내에 답변드리겠습니다."
  };
  
  if (inquiryMessage.includes("환불")) {
    Logger.log("✅ '환불' 감지됨! 자동 응답 전송");
    return responseTemplates["환불"];
  } else if (inquiryMessage.includes("배송")) {
    Logger.log("✅ '배송' 감지됨! 자동 응답 전송");
    return responseTemplates["배송"];
  } else if (inquiryMessage.includes("계정")) {
    Logger.log("✅ '계정' 감지됨! 자동 응답 전송");
    return responseTemplates["계정"];
  } else {
    Logger.log("❌ 문의 유형을 감지하지 못함. '기타' 응답 전송");
    return responseTemplates["기타"];
  }
}

위 1~ 3번 함수를 Apps Script > Editor > Code.gs 에 삽입

4.트리거 메뉴에서 타이머 설정

  • 구글 시트에 저장하는 함수(1) : saveCustomerInquiries (하루에 2번씩, 12h마다)

  • 자동 분류 / 회신 함수(3) : sendAutoReplyEmail (하루에 2번씩, 12h마다)

  • 결과적으로 아침, 저녁 두 번씩 자동 분류/발송.

Google Analytics Dashboard의 스크린 샷

5.결과와 배운 점

  • 원래는 GPT API를 연동해서 문의 메일마다 GPT가 자동 회신하는 메일 발송 시스템 구현이 목적

  • 하지만, GPT API 연동은 했으나 회신 메일의 완성도가 문제가 있음. 해당 도메인 지식이 없으니 당연한 결과일 듯.

  • GPTs를 만들어 연동하려 했으나, 아쉽게도 Apps Script와 GPTs를 연동하는 방법 찾지 못함

  • 기업의 CS 메일 형식/스타일을 알려주고, 기존의 회신 메일 내용 아카이브를 학습시킨 GPTs를 만들어서, App Script와 연동시킨다면 좀 더 완성도 있고, 실용적일 듯

도움 받은 글 (옵션)

너무 쉬운 사례라 특별할게 없어서 죄송합니다!

2

👉 이 게시글도 읽어보세요