Apps Script로 시작하는 마케팅 자동화의 첫 걸음: SNS 콘텐츠 소스 데이터베이스 구축기

소개

시도하고자 했던 것과 그 이유를 알려주세요.

항상 사례글을 작성할 때마다, 제목에 "첫걸음,," "처음 시도기",.들어가네요... ㅎㅎ
아직도 매번 초보자 사례글만 쓰고 있습니다....
배운건 많은거 같은데... 도대체 뭘 하고 있는지,,ㅎㅎㅎ
암튼, 어제 목요일 1주차 타이칸님의 자동화 기본 구조설계 가의와 여행가J님의 apps script 강의로, 처음으로 apps script로 코드를 작성하여, 병원 마케팅 데이터 소스로 사용할 데이터 베이스를 구축해 보았어요...

SNS 콘텐츠를 기획하고 제작하는 과정에서 매번 새로운 아이디어를 떠올리고, 자료를 찾고, 트렌드를 분석하는 건 생각보다 많은 시간과 에너지를 소모합니다. 저 역시 콘텐츠를 만들다 보니, 아이디어나 레퍼런스를 정리할 수 있는 체계적인 데이터베이스(DB)의 필요성을 절실히 느꼈습니다.

단순히 자료를 저장하는 수준을 넘어, 이 콘텐츠 소스 DB는 마케팅의 출발점이자 자산이라고 생각했습니다. 그래서 반복적인 수작업을 줄이고, 지속 가능한 콘텐츠 생산 구조를 만들기 위해 Google Apps Script 기반의 자동화를 시도하게 되었습니다.

진행 방법

사용한 도구

  • Google Apps Script: 스프레드시트 기반 자동화 스크립트 작성

  • Google Spread Sheet: 콘텐츠 소스를 저장할 DB 역할

  • Google AI Studio: 콘텐츠 아이디어 및 분류 자동화의 가능성 탐색

핵심 구현 흐름

  • 구글 시트에 콘텐츠 아이디어 및 자료를 수집할 수 있는 양식(Form)과 구조 설계

  • onFormSubmit 트리거를 활용해 수집 즉시 자동 정리되도록 Apps Script 설정

  • 향후 확장성을 고려해, 생성형 AI(Google AI Studio)로 콘텐츠 분류 및 태그 자동화 탐색 중

function onFormSubmit(e) {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ContentSources");
  const row = e.range.getRow();
  const data = sheet.getRange(row, 1, 1, sheet.getLastColumn()).getValues();
  // 여기에 자동 태깅 또는 알림 기능 추가 가능
}

🔗 외부 자동화 도구(n8n, Make) 연동을 위한 Apps Script 웹앱 예시

/**
 * =================================================================
 * 🤖 외부 자동화 도구(n8n, Make) 연동을 위한 API 함수 섹션
 * =================================================================
 * 이 스크립트를 웹 앱으로 배포해야 n8n/Make에서 호출할 수 있습니다.
 * [배포] > [새 배포] > 유형: 웹 앱 > 액세스 권한: '나만' 또는 '내 도메인 사용자'
 */

function doPost(e) {
  try {
    const params = JSON.parse(e.postData.contents);

    if (params.action === 'generate' && params.row) {
      const rowNum = parseInt(params.row, 10);
      if (isNaN(rowNum) || rowNum < 2) {
        throw new Error('유효하지 않은 행 번호입니다. 2 이상의 숫자를 입력해주세요.');
      }

      const result = generateContentForSingleRow(rowNum);

      return ContentService
        .createTextOutput(JSON.stringify({ status: 'success', message: '콘텐츠 생성이 완료되었습니다.', data: result }))
        .setMimeType(ContentService.MimeType.JSON);
    } else {
      throw new Error("잘못된 요청입니다. 'action'과 'row' 파라미터가 필요합니다.");
    }
  } catch (error) {
    Logger.log(error);
    return ContentService
      .createTextOutput(JSON.stringify({ status: 'error', message: error.message }))
      .setMimeType(ContentService.MimeType.JSON);
  }
}

function generateContentForSingleRow(rowNum) {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const rowData = sheet.getRange(rowNum, 1, 1, 4).getValues()[0];

  const topic = rowData[0];
  const keyword = rowData[1];
  const hospitalName = rowData[2];

  if (!topic || !keyword || !hospitalName) {
    throw new Error(`${rowNum}행의 주제, 키워드, 병원명 정보가 비어있습니다.`);
  }

  let openAI_API_KEY = sheet.getRange('R1').getValue();
  if (!openAI_API_KEY) {
    openAI_API_KEY = PropertiesService.getScriptProperties().getProperty('OPENAI_API_KEY');
  }
  if (!openAI_API_KEY) {
    throw new Error('OpenAI API 키를 찾을 수 없습니다.');
  }

  const masterPrompt = getMasterPrompt(topic, keyword, hospitalName);
  const aiResponse = generateAIResponse(masterPrompt, openAI_API_KEY, false);

  const jsonString = extractJson(aiResponse);
  const content = JSON.parse(jsonString);

  const shortsStoryboardsText = (content.shortsStoryboards || []).join('\n');
  let storyboardInEnglish = '';
  if (shortsStoryboardsText) {
    const storyboardPrompt = `다음 한글 스토리보드 프롬프트를 시네마틱하고 전문적인 '영어'로 변환해줘. 각 프롬프트는 "Story board N: " 형식으로 번호를 매겨줘.\n\n${shortsStoryboardsText}`;
    storyboardInEnglish = generateAIResponse(storyboardPrompt, openAI_API_KEY, false);
  }

  const outputRow = [
    filterProhibitedWords(content.title),
    filterProhibitedWords(content.summary),
    filterProhibitedWords(content.blogPost),
    `${filterProhibitedWords(content.instaCaption)}\n\n${(content.instaImagePrompts || []).join('\n')}`,
    filterProhibitedWords(content.threadsCaption),
    `${filterProhibitedWords(content.shortsScript)}\n\n${shortsStoryboardsText}`,
    storyboardInEnglish,
    filterProhibitedWords(content.newsletter),
    content.imagePromptEN || '',
    content.imagePromptKR || '',
    content.videoPromptEN || '',
    content.videoPromptKR || '',
    ''
  ];

  sheet.getRange(rowNum, 5, 1, outputRow.length).setValues([outputRow]);

  return content;
}

결과와 배운 점

GPT와 질문하고 답변 받는 과정에서 여러분도 느끼셨나요?

GPT는 답변 결과를 준 다음에 항상 뭘 더해주겠다고 합니다.....
"아~~ 그런 기능도 더 넣으면 좋지!!" 조금만 프롬프느를 더 수정하고 요청하고... 또 그러면 필요하다면 이것 저것 더해 준다고 또 꼬시고 꼬시고...
그러다보면 작은 프로젝트가 엄청 멋지게 만들어질 것 같은 기대감과 함께 비개발자가 감당 못 할 "거대 개발 프로젝트"로 바뀌고 있다는 것이죠!!

그리고 개발이 될 것 같아 AI agent를 사용해보고, Cursor를 만지고, claude code, vooster.ai, 그리고는 프롬프트만 더 잘 짜면 실무에 적용할 멋진 개발 프로젝트를 만들 수 있다는 착각 아닌 착각에 스스로 시간만 허비하고.... 결국, "포기할까? 될 줄 알았는데 왜 자꾸 오류가 나지?" "처음부터 다시 코드를 배워야하나? 그럴 순 없고....," "나는 역시 개발자가 아닌데 공든탑만 쌓았구나!!" 하며 낙담하는...ㅎㅎㅎ

결국은 바이브코딩도 그런 할루시네이션이 있다는 걸 2달을 이것 저것 공부해 가면서 얻은 결론입니다...
한번에 '딸각' 만들어지는 건 없습니다.... 물론 간단한 시나리오면 그럴수도 있지만, 나중엔 에러와 디버깅으로 시간 다 보내게 됩니다... 물론 내가 원하는 기능의 프로젝트가 만들어지는 것도 아닌데 말이죠....

그래서, 결국 깨달은 건요??? ㅎㅎ

항상 개발자님이 말씀하시고 누누히 충고하시던, 작은 단위로 쪼개서 하나씩 MVP를 완성해 나가야 한다는 거죠..!!! 성취감도 있지만, 파싱하지 않으면 결국 힘들어 진다는.....ㅎㅎ
근데, 알면서도 GPT의 후킹에 넘어가곤 합니다.... 진짜 후킹을 하려는 마케터한테 결국 GPT에게 후킹 당하고 있죠.....

그리고, 개발과 자동화도 모두 중요하지만, STP와 내 제품,서비스에 대한 가치 파악을 못하고 시작하는 마케팅 자동화는 아무 쓸데 없는 "노가다"일 뿐입니다....
바이브 코딩? 할 수록 어렵습니다....

항상 도구와 씨름하며, 새로운 방법에 귀 기울이고 쳐다보다, 내 사업과 서비브, 제품의 가치를 더 분석하고 준비해야 된다는 생각이 계속 드네요.... 여행가J님과 타이칸님의 마케팅 본질의 강의들과 가치철학의 강의들은 이런 무지한 비개발자들의 오류를 수정해 줍니다... 함께 스터디해서 너무 고맙습니다... 그리고 든든한 버디님(세임님) 개발자(F님,댕멍)님들이 함께하니 뭐든 언젠가는 제대로 만들어 내리라 믿습니다...

오늘도 또 생각하고, 고민해 봅니다..... 난 뭘 자동화하고, 그게 왜 필요한거지? 고객에게 어떻게 어필이 될 수 있을까? 감성 마케팅을 어느 포인트에서 구현해야 좋을까? 후킹되는 카피라이팅은 어떻게 만들고, 고객의 눈길을 끄는 카피라이팅과 인포그래픽을 어떻게 묘사할까.....????

이런 생각들이 정리 되어야, 랜딩페이지로, 타입봇으로, 뉴스레터로, SNS 콘텐츠 게시글로 고객에게 보여지고, 다가갈 수 있지 않을까 생각해 봅니다.....

참으로 마케터는 다 알아야 합니다....,
기획과 전략, 제품과 서비스의 가치를 창조하는 브랜드 마케팅까지..... 그리고 후킹되는 카피라이팅과 글쓰기, 인포그래픽, 이미지, 영상,,,, ㅠㅠ 숨이 헐떡거리네요,,,;;;

이제 다시,

사업의 본질과 마케팅의 본질에서부터 출발하는, 18기 마케팅 자동화를 제대로 구현해 보고 싶습니다... 스타트업실험실은 협업과 지식나눔, 그리고 사랑이 있으니 다 가능하겠지요???

단순히 "자동화했다!"라는 기술적 성과보다 더 큰 배움을,,,, 마케팅 자동화의 본질,,, 양질의 콘테츠로 고객에게 가치로 인정되는 콘텐츠 자체에 더 큰 가치를 부여하겠습니다.

  • 양질의 콘텐츠 없이 자동화만 잘한다고 성과는 나오지 않습니다.

  • 고객의 관심사와 니즈를 분석하고, 그에 맞는 고품질 콘텐츠를 제작해야 진짜 마케팅 효과가 생깁니다.

  • 퍼널 구조(Lead → Switch → Conversion)를 고려한 콘텐츠 설계가 핵심이며,

  • 이를 위해선 고객 페르소나, SEO/AEO 최적화, 시각적 설계까지 통합적으로 고민해야 합니다.

앞으로의 계획

  • 콘텐츠 수집 → 분류 → 제작 → 게시까지 자동화하는 End-to-End 콘텐츠 퍼널 자동화 구축

  • SEO 키워드 기반 콘텐츠 큐레이션 자동화

  • GPT, Gemini 기반 요약 및 시각화 기능 추가

  • Google Ai Studio의 좋은 기능을 최대한 활용하기

  • 안과(병의원용)SNS_Contents_자동작성기_App개발

  • 병원 랜딩페이지 구축

  • 타입봇 시나리오 설계-> 뉴스레터 자동화 구현

  • 안과 SNS_Contents_자동작성기를 자동화 도구(n8n,Make)로 연결한 자동화 시나리오 설계 구현

  • 안과 병원의 AI 기반 디지털 마케팅 전환-> 고객 서비스 만족도 향상 (CRM,ERM과 연동한 자동 발송 시스템 구현하여 병원 브랜딩 및 재진률증가, 신규전환 실현)

도움 받은 글


5
6개의 답글

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요