소개
허세임님의 이메일 자동화 사례를 따라 진행하던 중, 한 가지 욕심이 생겼습니다.
'내 주소록에 있는 그룹' 또는 '스마트칩으로 지정한 사람'에게 자동으로 메일을 보낼 수 없을까?
그래서 시작된 이번 프로젝트는 기존 Gmail 자동화에 구글 주소록과 시트 스마트칩 기능을 결합해, 더욱 실전형 CRM 자동화 시스템을 만드는 것이 목표였습니다.
(나노바나나프로로 CRM 자동화 인포그래픽을 만들었는데.. 음...)
"@사람 스마트칩을 찍거나, 그룹명을 쓰기만 해도 AI가 알아서 메일을 보내준다면 얼마나 편할까?"
진행 방법
사용한 도구 및 기술
Gemini - 캡쳐->해결해->또 캡쳐->해결해...
Google Apps Script
Google People API (주소록 접근)
Google Sheets API (스마트칩 파싱)
구현 포인트 요약
📌 그룹 발송: 구글 주소록의 그룹명을
C29 셀에 입력하면 해당 그룹 멤버 전체에게 메일 발송📌 스마트칩 발송:
C30 셀에 여러 명의@사람 스마트칩입력 시, 해당 인원에게 발송📌 이름 자동 치환: 본문
{이름}템플릿을 수신자의 실제 이름으로 변환하여 발송📌 중복 제거: 그룹과 스마트칩에 중복된 인원이 있을 경우, 1회만 발송되도록 정제
주요 트러블슈팅 사례
난관 1: "ContactsApp이 작동하지 않아요" (API 세대교체)
문제 상황: 기존에 익숙했던
ContactsApp서비스가 구글의 정책 변경으로 Deprecated(폐지)되어 사용할 수 없었습니다.해결: 최신 **
People API**로 로직을 전면 교체했습니다.단순히 이메일만 가져오는 것이 아니라,
resourceName(고유 ID)을 통해 그룹 멤버십을 확인하는 방식으로 변경하여 안정성을 높였습니다.
난관 2: "스마트칩을 읽었는데 빈 칸이에요" (데이터 파싱)
문제 상황: 시트에 입력된
@홍길동스마트칩을getValue()로 읽으면 텍스트만 읽히거나 데이터가 손실되었습니다.원인: 스마트칩은 단순 텍스트가 아니라 복잡한 JSON 객체(
RichValue)로 셀에 저장됩니다.해결: Google Sheets API를 직접 호출하여 셀 내부의
chipRuns데이터를 뜯어보았습니다.특히 사용자 환경마다 데이터가
peopleChip필드에 있기도 하고,personProperties필드에 숨어 있기도 한 점을 발견하여, 두 구조를 모두 체크하는 이중 파싱 로직을 구현했습니다.
난관 3: "이름이 전부 '담당자'로 떠요" (이름 누락 해결)
문제 상황: 스마트칩에서 이메일은 추출했지만, 정작 '이름' 정보가 비어있는 경우가 많았습니다. 이대로 보내면 "안녕하세요 담당자님"이라고 발송되어 CRM의 의미가 퇴색됩니다.
해결: "이메일 역검색(Reverse Lookup)" 기능을 개발했습니다.
스마트칩에서 이메일을 확보함 -> 이 이메일로 내 구글 주소록을 검색 -> 저장된 **'실명(예: 구기모)'**을 가져옴.
이 로직 덕분에 스마트칩에 이름 정보가 없어도, 내 주소록 기반으로 정확한 호칭을 사용할 수 있게 되었습니다.
난관 4: "그룹과 스마트칩에 겹치는 사람이 있어요"
문제 상황: 'VIP 그룹'에도 속해 있고, 스마트칩으로도 따로 추가한 사람은 메일을 두 번 받게 됩니다.
해결:
Map자료구조를 활용하여 이메일 주소를 기준(Key)으로 중복을 완벽하게 제거했습니다.
결과와 배운 점
✅ 앱스스크립트로 구글 주소록도 건드릴 수 있다는 점이 신기했습니다.
✅ 단순 자동화를 넘어서, 하이퍼 개인화 CRM 시스템을 직접 구성해보며 실무 활용도가 크게 높아졌습니다.
✅ 특히 스마트칩은 그냥 텍스트가 아니다! 라는 점을 알게 되었고, 반드시 Google Sheets API를 써야 정확한 정보를 얻을 수 있다는 교훈을 얻었습니다.
결국 CRM 자동화의 시작은 고객의 DB를 어떻게 관리하느냐 인 것 같아요. 다음엔 구글주소록을 건드려서 고객과의 히스토리를 자동으로 관리할 수 있는 시스템을 만들어보고 싶습니다.