본문으로 건너뛰기
취준생을 위한 n8n 실전 워크플로우 레시피 · 40/44시리즈 보기 →

구글시트에 쌓인 데이터를 인스타그램 카드뉴스로 — n8n 시트 인스타그램 자동발행

· 약 9분
Datapopcorn CEO / AI automation educator
이 글과 연결된 글 보기
35편 · 157개 연결
100%
구내식당 식단표 사진 대신 API로 — 매일 메뉴를 AI가 분석해 알림까지 보내는 n8n 워크플로우고객 문의 메일, AI가 분류하고 답장 초안까지 — CS 이메일 자동응답 워크플로우매일 아침 대통령 일정을 긁어 구글시트에 쌓는 n8n 워크플로우 — 최초 적재와 매일 증분을 나누는 이유수집·정제·분석 한 바퀴 — 포켓몬 API로 배우는 n8n 데이터 분석n8n Data Table 처음 써보기 — 트렌드 3개를 합쳐 매일 아침 분석 주제 뽑는 워크플로우경제지표 API로 매일 투자 리포트 받기 — AI에게 cURL부터 만들게 하는 n8n 워크플로우n8n 워크플로우가 조용히 죽지 않게 — Error Trigger로 실패를 슬랙으로 받는 에러 알림 만들기페이스북 광고 효율, AI가 매일 분석해서 알려주는 n8n 워크플로우 — 시리즈의 마지막 레시피제주 농지 데이터 수집기 — 문서 없는 공공 사이트를 n8n으로 내 데이터셋으로 옮기는 법받은 메일을 AI가 자동 분류해 DB에 쌓기 — n8n Gmail 자동 분류 워크플로우구글 뉴스 RSS 링크는 왜 안 열리나 — n8n 서브워크플로우로 원문 URL 디코드해서 노션에 쌓기구글시트 매출 데이터, AI가 매일 인사이트 리포트로 — 수작업 보고서에서 벗어나는 n8n 워크플로우호텔 가격 추이를 AI가 요약해주는 n8n 워크플로우 — OAuth 토큰이 필요한 API 다루기코드 없이 베스트셀러 긁기 — n8n HTML 노드로 배우는 웹 스크래핑n8n으로 정적 웹서버 운영하기 — 수료증 발급부터 진위 확인까지, 멱등 처리로 안전하게인스타그램 카드뉴스 자동 발행 — n8n으로 HTML을 이미지로, 이미지를 피드로벡터DB 없이 실시간으로 사이트를 읽는 챗봇 — 경복대학교 안내 챗봇 해부재고 10개 미만이면 슬랙으로 알려주는 n8n 워크플로우 — 첫 자동화로 이걸 추천하는 이유n8n으로 MCP 서버 만들기 — AI Agent와 무엇이 다른가녹음 파일 하나로 회의록·노션까지 — n8n으로 만드는 회의 요약 파이프라인명함 사진을 드라이브에 올리면 구글시트에 자동 정리 — n8n + Mistral OCR 명함 입력 자동화NFC 태그를 찍으면 AI 명언 페이지가 뜨는 n8n 웹훅 — n8n을 나만의 API 서버로 쓰기물컵 사진을 찍으면 습관 시트에 체크 — n8n 웹훅으로 이미지 받아 OpenAI로 분류하기n8n으로 반복업무 자동화 포트폴리오 만들기403이 뜨는 사이트 가격 추적하기 — 스크래핑이 막혔을 때 n8n으로 우회하고 어제 가격과 비교하기제품 사진 한 장으로 광고 영상 만들기 — n8n + Firecrawl + Veo 3.1 영상 생성 자동화공공데이터를 대시보드까지 — 중대재해 사고 현황을 n8n으로 모아 Tableau에 연결하기내 문서로 답하는 RAG 챗봇 — n8n으로 임베딩부터 검색까지레딧 인기글을 3시간마다 슬랙으로 요약해 받기 — n8n 커뮤니티 모니터링 자동화실패해도 안 죽는 슬랙 알림 — n8n의 재시도(retryOnFail)와 에러 분기(continueErrorOutput)매일 아침 뉴스 5개를 메일 한 통으로 — n8n RSS 이메일 자동화와 여러 아이템 합치는 법결제가 일어나면 바로 디스코드 알림 — n8n 결제 웹훅으로 외부 서비스 이벤트 받기따릉이 대여소 데이터 수집·전처리·적재 — 서울 열린데이터 API로 n8n 첫 데이터 파이프라인 만들기로그인이 필요한 사이트도 CSRF 토큰과 세션 쿠키로 긁어오기 — 매주 통계 페이지에 자동 로그인하는 n8n 워크플로우구글시트에 쌓인 데이터를 인스타그램 카드뉴스로 — n8n 시트 인스타그램 자동발행

드래그로 이동 · 휠/두 손가락으로 확대 · 방향키로 글 선택 · 0으로 맞춤. 실선: 본문 링크, 점선: 시리즈·주제의 대표 연결.

표시된 글 35편 목록
전체 글 연결 탐색

구글시트에 매일 쌓이는 데이터가 있다면, n8n Code 노드로 그날 치 행을 카드 이미지 하나에 조립하고 Instagram Graph API로 자동 발행할 수 있습니다. 손으로 고른 사진 대신 시트 데이터 자체가 이미지의 재료가 되는 것이 핵심이고, 이 워크플로우는 수집과 발행 사이를 잇는 다리 역할을 합니다.

이 워크플로우 하나로 보여줄 수 있는 것​

매일 아침 대통령 일정을 긁어 구글시트에 쌓는 편이 "수집"이었고, 인스타그램 카드뉴스 자동 발행 편이 "발행"이었다면, 이 워크플로우는 그 둘을 잇는 파이프라인입니다. 시트의 한 행이 아니라 하루치 행 전체를 카드 이미지 한 장으로 조립해 그대로 인스타그램에 올립니다. 드러나는 역량은 세 가지입니다.

  • 반복 데이터를 콘텐츠로 조립하는 능력 — 시트에서 읽은 여러 행을 카드 이미지 하나로 합치는 Code 노드 설계
  • 중복 발행 방지 — 같은 날짜를 다시 처리하지 않도록 시트 자체에 처리 상태를 기록하고 되읽는 패턴
  • 써드파티 노드의 한계 판단 — 공식 API로 되는 일과 커뮤니티 노드가 필요한 일을 구분하는 감각

세 번째가 실무에서 자주 부딪히는 지점입니다. 이미지 발행과 스토리·릴스 발행은 API 성격부터 다르고, 이 캔버스에는 그 차이를 시도하다 만 흔적이 남아 있습니다.

배경 — 쌓인 데이터를 다시 사람이 옮기지 않으려면​

시트에 데이터를 매일 쌓는 것과 그 데이터를 콘텐츠로 발행하는 것은 별개의 작업입니다. 수집 워크플로우가 자동으로 돌아도, 결과를 카드뉴스로 만드는 일을 사람이 매번 시트를 열어 옮겨 적는다면 자동화의 절반만 한 것입니다. 이 워크플로우는 매일 아침 대통령 일정을 긁어 구글시트에 쌓는 편이 채워 넣는 바로 그 시트를 읽어, 사람이 손대지 않고 카드뉴스까지 이어 붙입니다. 이미지 소스가 미리 만든 사진이 아니라 구조화된 시트 행 자체라는 점이 인스타그램 카드뉴스 자동 발행 편과의 가장 큰 차이입니다. 설치나 기본 노드 설명은 n8n으로 반복업무 자동화 포트폴리오 만들기에 정리돼 있으니, 이 글은 시트에서 카드까지 이어지는 조립 로직에 집중합니다.

구조 — Trigger / Task / Target​

캔버스에는 노드가 32개 있지만 실제로 이어져서 매일 도는 경로는 한 줄입니다. 나머지는 꺼져 있거나 연결되지 않은 실험 흔적이고, 아래에서 따로 다룹니다.

  • Trigger — 매일 아침 8시 10분 스케줄
  • Task — 시트 전체 읽기 → 최신 날짜의 행을 카드 하나로 조립 → 이미지 변환 → 토큰 체크 → 컨테이너 생성·발행
  • Target — 인스타그램 피드, 그리고 처리 완료를 표시하는 구글시트

만들기​

1. Google Sheets Get row(s) — 필터 없이 전체를 읽습니다​

Get row(s) in sheet 노드는 수집 편이 채워 넣는 시트를 그대로 가리키고, Operation은 Get Row(s)입니다. 필터 없이 쌓인 행 전부를 매번 가져오고, 최신 날짜·발행 여부 판단은 다음 Code 노드로 넘어갑니다.

2. Generate Card HTML — 여러 행을 카드 한 장으로​

이 워크플로우의 핵심 노드입니다. 시트 행 하나하나가 카드 하나가 되는 게 아니라, 같은 날짜의 행들을 모아 카드 한 장 안의 타임라인으로 조립합니다. 전체 행에서 가장 최근 날짜를 찾고, 그 날짜의 행 중 하나라도 카드뉴스 업로드 값이 'y'이면 빈 배열을 반환해 여기서 멈춥니다.

const allDates = inputData
.map(item => item.json['날짜'])
.filter(date => date)
.sort((a, b) => new Date(b) - new Date(a));

let targetDateStr = allDates.length > 0 ? allDates[0] : new Date().toISOString().split('T')[0];

const isAlreadyUploaded = inputData.some(item =>
item.json['날짜'] === targetDateStr && item.json['카드뉴스 업로드'] === 'y'
);

if (isAlreadyUploaded) {
return [];
}

시트 전체를 다시 읽고도 중복 발행이 안 되는 이유가 이 가드 하나입니다. 마지막 단계에서 업로드 완료 표시를 남기면, 다음날은 최신 날짜가 바뀌어 있으니 자연스럽게 다음 카드로 넘어갑니다.

가드를 통과하면 그 날짜의 행만 걸러 타임라인 HTML을 조립합니다. 시간 값이 있으면 그대로 쓰고, 비어 있으면 내용 맨 앞에 "11:00 대통령 취임"처럼 시간이 붙어 있는지 정규식으로 찾아 분리합니다.

if (!time) {
const timeMatch = content.match(/^(\d{1,2}:\d{2})\s+(.*)/);
if (timeMatch) {
time = timeMatch[1];
content = timeMatch[2];
}
}

내용에 "오찬", "회담", "방문" 같은 키워드가 있으면 어울리는 이모지를 붙이는 함수도 같이 들어 있습니다. 이렇게 만든 타임라인을 1080×1350 크기의 HTML 문서 하나로 감싸 html_content로 돌려주는데, 입력은 items(예전 문법)로 받으므로 지금 새로 만든다면 $input.all()을 쓰세요.

3. HTML to 이미지 — hcti.io, 값도 35편과 동일합니다​

html_content를 hcti.io에 그대로 넘겨 이미지로 바꾸는 방식은 카드뉴스 발행 편과 같은 서비스, 같은 Basic Auth credential 구조입니다. 뷰포트 값(viewport_width: 1080, viewport_height: 1350)도 카드 HTML의 body 크기에 맞춰 그대로 재사용했습니다.

4. IG 토큰 유효성 체크 — Data Table로 옮기려던 흔적​

발행 전에 /me 엔드포인트를 access_token과 함께 호출해 응답에 id가 있는지 확인하는 패턴은 카드뉴스 발행 편에서 이미 다뤘습니다. id가 비어 있으면 If 노드가 Stop and Error로 보내 멈춥니다. 원본 스티키 노트에도 "'me'는 기본적인 API 호출 중 하나 — 여기에서 오류가 발생하면 수동으로 조정"이라고 적혀 있습니다.

이 워크플로우에는 한 겹이 더 있습니다. me 노드 앞에 Get TOKEN이라는 Data Table 노드가 연결돼 있습니다. Operation은 Get, Limit은 1, Order By를 켜서 "가장 최근 행 하나"를 가져오는 설정으로, 토큰을 Set 노드에 박아 두는 대신 Data Table에서 관리하려던 시도로 읽힙니다. 다만 이 노드는 비활성화 상태라 출력을 그대로 통과시킬 뿐이고, me의 access_token 값도 표현식이 아니라 고정 문자열이라 다시 켜도 그 값이 쓰이지 않습니다. Data Table로 옮기다 만 상태로 보입니다.

토큰 값 자체는 Set 노드와 me 노드 양쪽에 문자열로 박혀 있습니다. 카드뉴스 발행 편에서 권한 것과 같은 이유로, 새로 만든다면 credential로 옮기는 편이 안전합니다.

5. 미디어 컨테이너 생성 → 발행 → 시트에 완료 표시​

컨테이너를 먼저 만들고 creation_id로 발행을 확정하는 2단계 호출은 카드뉴스 발행 편과 동일한 패턴입니다. Instagram params Set 노드가 hcti.io 이미지 URL, me 응답의 id, 액세스 토큰을 모아 컨테이너를 만들고, 15초 Wait 뒤 발행을 확정합니다.

발행이 끝나면 Update row in sheet 노드가 매칭 컬럼을 날짜로 두고 그 날짜의 행에 카드뉴스 업로드: y를 씁니다. 2번의 가드가 여기서 완성되어, 다음 실행부터 같은 날짜는 건너뜁니다.

스토리·릴스로 확장하려면 — 커뮤니티 노드 갈림길​

html to image의 출력은 이미지 발행 흐름 말고도 세 갈래로 더 뻗어 있습니다. 그중 Story Publish, Reels Publish 두 노드는 타입이 n8n-nodes-base.httpRequest가 아니라 @mookielianhd/n8n-nodes-instagram.instagram입니다. n8n 내장 노드가 아니라 npm에 공개된 서드파티 커뮤니티 노드입니다.

n8n 공식 문서에 따르면 검증된(verified) 커뮤니티 노드만 n8n Cloud에서 관리자가 토글로 켤 수 있고, 검증되지 않은 노드는 자체 호스팅(self-hosted) 인스턴스에서만 설치할 수 있습니다. 이 인스타그램 노드는 검증 목록에 없어서, n8n Cloud를 쓰는 독자라면 애초에 설치할 수 없습니다.

이 워크플로우에서도 두 노드는 비활성화 상태입니다. 커뮤니티 노드로 스토리·릴스 발행을 시도한 흔적은 있지만 지금 실제로 도는 건 이미지 발행 하나뿐입니다. media container(STORIES), media container(REELS)라는 노드도 따로 있는데, 이미지 발행과 같은 컨테이너 생성 → Wait → 발행 패턴을 image_url 대신 video_url과 media_type: STORIES(또는 REELS)로 시도한 httpRequest 버전이지만 앞단 어디에도 연결돼 있지 않아 떠 있는 섬입니다.

그래서 이미지 카드뉴스만 필요하다면 IMAGE 경로처럼 커뮤니티 노드 없이 httpRequest로 Graph API를 직접 부르는 방식을 권합니다. 커뮤니티 노드는 self-hosted n8n이 전제조건이고, 스토리·릴스 같은 영상 컨테이너 API는 처리에 시간이 걸려 카드뉴스 발행 편에서 짚었듯 고정 Wait보다 상태 폴링이 안전합니다 — 이미지보다 다루기 까다로운 이유입니다.

원본 캔버스에 남아 있는 흔적​

이미지 발행 경로 말고도 켜져 있지 않은 노드가 더 있습니다. Convert to File 노드는 카드 HTML을 텍스트 파일로 저장하도록 만들어져 있는데 비활성화 상태고, Send a message Slack 노드는 hcti.io 이미지 URL을 테스트용 채널로 보내는 용도로 보이는데 이 역시 꺼져 있습니다. 개발 중 확인용으로 켜뒀다가 정식 경로가 안정된 뒤 꺼둔 흔적으로 보입니다.

캔버스 오른쪽 "Image to Video" 스티키 노트 아래에는 Cloudinary API로 정적 이미지를 짧은 영상으로 바꾸려던 Code 노드(비활성화), 로직이 채워지지 않은 default Code 노드, 설정이 비어 있는 SSH 노드가 있습니다. 셋 다 어디에도 이어져 있지 않아, 릴스·스토리용 영상을 만들어보려던 실험이 여러 갈래로 남은 것으로 보입니다.

"에셋(이미지, 영상) 불러오기 — 구글 드라이브 → 깃허브"라는 스티키 노트도 있는데, 실제로 드라이브나 깃허브를 부르는 노드는 캔버스에 없어 메모로만 남아 있습니다.

한계​

  • 캡션이 비어 있습니다 — Instagram params의 INSTAGRAM_POST_CAPTION 값이 빈 문자열이라, 지금 그대로면 발행 이미지에 캡션이 붙지 않습니다. 시트에 캡션 컬럼을 추가해 연결하면 해결됩니다.
  • 컨테이너 상태를 확인하지 않습니다 — 고정 15초 Wait 뒤 바로 발행합니다. 카드뉴스 발행 편과 같은 한계로, Meta는 컨테이너 상태가 FINISHED인지 확인할 것을 권장합니다.
  • 시트를 매번 전체 스캔합니다 — 필터 없이 전체 행을 읽고 Code 노드가 최신 날짜를 찾으므로, 시트가 몇 년치로 쌓이면 매일 읽는 양도 늘어납니다.
  • 스토리·릴스는 미완성입니다 — 커뮤니티 노드 경로도 httpRequest 경로도 지금은 동작하지 않습니다. 확장하려면 둘 중 하나를 골라 처음부터 연결을 완성해야 합니다.

포트폴리오·면접 포인트​

"시트 행 → 카드뉴스" 패턴은 다른 데이터에도 옮길 수 있습니다. 주간 매출 요약, 공지사항, 채용공고 목록처럼 시트에 정기적으로 쌓이는 데이터라면 Generate Card HTML의 날짜별 그룹핑과 업로드 플래그 가드를 재사용할 수 있습니다.

면접에서 "왜 행마다 카드를 만들지 않고 하루치를 한 장에 모았나요?"라는 질문이 오면, 인스타그램 발행은 이미지 한 장(또는 캐러셀)이 기본 단위인데 시트 행은 이벤트 단위라서, 행마다 카드를 만들면 하루에 여러 장이 올라가 피드가 시끄러워진다는 점을 답하면 됩니다. 날짜로 묶으면 하루 한 장으로 충분합니다.

다음 액션​

다음 편은 n8n Data Table을 처음 제대로 다루는 편입니다. 이 편의 Get TOKEN 노드가 옮기다 만 것처럼 Data Table은 시트보다 가벼운 상태 저장소로 쓰기 좋은데, 다음 편에서는 RSS 여러 개를 모아 AI로 분석 주제를 뽑고 그 결과를 Data Table에 저장하는 흐름을 처음부터 끝까지 만들어봅니다.