본문 바로가기

Stack

MAKE 시나리오 설정: Make+채널톡+구글드라이브+구글시트+알림

도구 Make · 채널톡 · Google Drive · Google Sheets · Obsidian시나리오 아이디어_정리최종 확인 2026-09-26

채널톡 팀챗 ‘아이디어’ 방에 글이나 사진을 올리면, Make가 옵시디언용 md 파일을 드라이브에 만들고 구글 시트에 한 줄을 쌓은 뒤 ✅로 답합니다. 실제로 쓰고 있는 시나리오 설정을 모듈 순서대로 정리했습니다.

전체 구조

웹훅으로 받은 메시지를 변수로 정리한 뒤, Router에서 두 갈래로 나눕니다. 사진 경로가 먼저 돌아 사진 정보를 변수에 담고, 본문 경로가 그 변수를 꺼내 md·시트·답장을 처리합니다. 모듈 번호는 Make 화면의 번호입니다.

1
Webhooks › Custom webhook필터: 아이디어 방 메시지만
2
Tools › Set variables일시 · 파일일시 · 본문 · 제목 · 본문md
3
Router
1st 경로 · 사진 있음 (먼저 실행)
4Iterator
5HTTP 사진 주소 받기
6HTTP 사진 다운로드
7Drive 사진 업로드
8Array aggregator
9Set variables (사진md, 사진URL)
2nd 경로 · 항상 (필터 없음)
10Get multiple variables
11Drive md 파일 생성
12Sheets 한 줄 추가
13HTTP 채널톡 ✅ 답장

결과물

어디무엇이 들어가나
드라이브 md 파일메타정보 + 본문 + 사진 임베드 줄 (00. Inbox 폴더)
드라이브 첨부 폴더사진 파일 (20260926-142005_1.png 형식)
구글 시트메시지ID, 일시, 내용, 작성자, md링크, 사진URL, 상태
채널톡 아이디어 방봇의 ✅ 메시지

링크 1개와 사진 2장을 보냈을 때 만들어지는 md 파일입니다.

---
created: 2026-09-26 14:20:05
source: channeltalk
author: 석대표
status: 대기
tags: [idea]
message_id: 6ab7522a9d3057158e03
---

이건 나중에 검토할 것
코드넘버4는 찐이야
https://codenumber4.com

![[20260926-142005_1.png]]

![[20260926-142005_2.jpg]]

Make 입력 규칙: 가장 많이 틀리는 부분

칸에 값을 넣는 방법은 세 가지뿐입니다. 수식에 정규식이 들어가는지가 기준입니다.

방법언제성공 표시
매핑 패널에서 클릭1. entity: plainText, 2. 일시 같은 항목색깔 블록
{{ }}째로 붙여넣기정규식이 없는 수식회색 함수 블록 + 색깔 블록
함수는 클릭, 정규식은 타이핑정규식이 있는 수식 (본문md)정규식이 회색 글자 그대로
  • 칸 안에 {{일시}}처럼 글자 그대로 보이면 실패입니다. 빈칸이나 글자가 그대로 들어갑니다.
  • 정규식이 든 수식을 붙여넣으면 Make가 /와 \를 나눗셈으로 읽어 블록을 쪼갭니다.
  • replace( 원문 ; 정규식 ; 변환형식 )처럼 ; 순서가 한 칸만 밀려도 결과가 틀립니다.
  • 검은색 블록(예: P5.array)은 없는 모듈을 가리키는 오류입니다. 지우고 매핑 패널에서 다시 클릭하세요.
  • 같은 Set variables 안에서 방금 만든 변수는 다시 못 씁니다. 그래서 수식마다 1.entity.plainText를 직접 씁니다.

사전 준비

채널톡

  • 팀챗에 아이디어 그룹방을 만듭니다. 방 이름에 이모지는 못 쓰고, 필터는 방 ID로 거르므로 이름은 자유입니다.
  • 채널 설정 → 개발자 → 웹훅: URL은 Make 웹훅 URL, 이벤트는 메시지 생성.
  • 채널 설정 → API 키 관리에서 Access Key / Access Secret을 발급합니다. [5], [13]에서 씁니다.

구글 드라이브

  • md 저장 폴더: 옵시디언 볼트의 00. Inbox
  • 사진 저장 폴더: 옵시디언 첨부 폴더 99. Setting/99. Attachment
  • 사진 폴더만 공유 → 일반 액세스를 링크가 있는 모든 사용자(뷰어)로 바꿉니다. 새 사진도 이 설정을 물려받아 시트의 사진URL이 로그인 없이 열립니다. md 파일과 다른 폴더는 비공개 그대로입니다.

구글 시트

  • 스프레드시트 아이디어 인박스, 탭 시트1. 1행 헤더: 메시지ID | 일시 | 내용 | 작성자 | md링크 | 사진URL | 상태
  • 상태(G열) 드롭다운: 데이터 → 데이터 확인 → 범위 시트1!G2:G1000, 항목 대기 / 작성중 / 발행. 2행부터 걸어야 첫 데이터에도 적용됩니다.

테스트로 확인한 채널톡 데이터

  • 사진은 entity › files[]로 들어옵니다. 항목: id, type, name, size, contentType, width, height, bucket, key, chatId
  • 유튜브 썸네일 같은 링크 미리보기는 사진이 아니라서 files로 오지 않습니다.
  • 사진 주소 API는 https://cf.channel.io/pri-file/… 서명 주소를 주며, 15분 뒤 만료됩니다.

모듈별 설정

1Webhooks › Custom webhook

Webhook은 채널톡아이디어, Maximum number of results는 1. 매핑 패널은 처음 받은 예시 데이터만 보여줍니다. files[]가 안 보이면 [1] → Redetermine data structure를 누르고 아이디어 방에 사진과 글을 함께 보내 다시 인식시키세요. 실제로 들어온 데이터는 HISTORY → 실행 선택 → 모듈 위 말풍선에서 봅니다.

필터[1] → [2] 아이디어 방 메시지만

세 조건을 한 묶음(AND)으로 겁니다. 연산자는 모두 Text operators: Equal to.

위 칸 (매핑 클릭)아래 칸 (직접 입력)
1. entity › chatTypegroup
1. entity › chatId아이디어 방 ID
1. entity › personTypemanager

personType 조건은 꼭 남겨두세요. 봇의 ✅도 웹훅으로 다시 들어오는데, personType = bot이라 여기서 걸러집니다. 빼면 무한 반복됩니다. plainText Exists 같은 조건은 넣지 마세요. 사진만 보낸 메시지가 걸러집니다.

2Tools › Set variables

Variable lifetime은 One cycle. 아래 네 개는 그대로 붙여넣습니다. 일시에는 초까지 넣어, 같은 분에 보낸 메시지도 파일 이름이 겹치지 않게 했습니다.

변수값 (붙여넣기)
일시{{formatDate(parseDate(1.entity.createdAt; "x"); "YYYY-MM-DD HH:mm:ss"; "Asia/Seoul")}}
파일일시{{formatDate(parseDate(1.entity.createdAt; "x"); "YYYYMMDD-HHmmss"; "Asia/Seoul")}}
본문{{ifempty(trim(1.entity.plainText); "(사진)")}}
제목{{ifempty(substring(first(split(trim(1.entity.plainText); newline)); 0; 40); "사진메모")}}

본문md는 본문 속 링크를 ![링크](링크)로 바꾸는 변수입니다. 정규식이 있으니 함수 패널에서 replace, trim을 클릭해 구성하고 정규식과 변환형식은 타이핑합니다.

replace( trim( 1. entity: plainText ) ; /https?:\/\/[^\s)\]]+/g ; ![$&]($&) )

제목은 파일 이름에 쓰이니 지우면 안 됩니다. 사진만 보낸 메시지는 제목이 사진메모, 본문이 (사진)이 됩니다.

3Router

Make는 1st 경로부터 실행합니다. 1st = 사진 경로, 2nd = 본문 경로여야 합니다. 순서가 바뀌었으면 Router 우클릭 → Order routes에서 사진 경로를 위로 올립니다.

필터[3] → [4] 사진 있음

위 칸 1. entity: files[], 연산자 Array operators: Length greater than, 아래 칸 0. 2nd 경로에는 필터를 걸지 않습니다.

4Flow Control › Iterator

Array에 1. entity: files[]. 사진이 여러 장이면 [5]~[7]을 한 장씩 반복합니다.

5HTTP › Make a request 사진 주소 받기

URLhttps://api.channel.io/open/v5/groups/{{1.entity.chatId}}/messages/file
MethodGET
Headersx-access-key, x-access-secret (발급받은 값)
Querykey = 4. key (Iterator의 key)
Body content typeEmpty
Parse responseYes · Timeout 40

URL 끝이 /messages로 끝나면 사진 주소 대신 메시지 목록이 옵니다. 반드시 /messages/file입니다. 정상이면 Data › result에 사진 주소가 옵니다.

6HTTP › Download a file

URL에 5. Data › result. 같은 실행 안에서 바로 받으니 15분 만료는 문제되지 않습니다.

7Google Drive › Upload a File 사진 저장

FolderSelect from the list · My Drive · 99. Setting/99. Attachment
File Name{{2.파일일시}}_{{4.Bundle order position}}.{{last(split(4.name; "."))}}
Data6. Data
ConvertNo

결과는 20260926-142005_1.png. 파일일시 뒤에 Iterator의 Bundle order position(1, 2, 3…)을 붙이고, 원래 이름(image.png)에서 확장자만 떼어 붙입니다. 원래 이름을 그대로 쓰면 사진마다 이름이 겹칩니다.

8Tools › Array aggregator

Source Module은 Iterator [4], Target은 Custom. Aggregated fields는 [7]의 Name, Web View Link 두 개만 체크합니다.

9Tools › Set variables 사진md · 사진URL

Variable lifetime은 One cycle.

변수값
사진md![[{{join(map(8.array; "name"); "]]" + newline + newline + "![[")}}]]
사진URL{{join(map(8.array; "webViewLink"); newline)}}

사진md는 파일 이름들을 ]] + 빈 줄 + ![[로 이어 붙이고 양 끝을 ![[ ]]로 감쌉니다. 사진 2장이면 ![[a.png]], 빈 줄, ![[b.png]]가 됩니다. 8.array는 매핑 패널의 Array aggregator [8] › Array[]이며 초록 블록이어야 합니다.

왜 ![[ ]]인가. ![파일명](파일명)은 옵시디언이 경로로만 찾아서 첨부 폴더의 사진을 못 찾고 파일 이름 글자만 보여줍니다. ![[ ]]는 볼트 어디에 있든 이름으로 찾습니다. 그래서 파일 이름이 겹치지 않게 저장합니다.

10Tools › Get multiple variables

Router와 Drive [11] 사이 연결선 우클릭 → Add a module. 변수 사진md, 사진URL을 꺼냅니다. 사진이 없으면 1st 경로가 통째로 건너뛰어져 둘 다 빈 값이 됩니다.

11Google Drive › Upload a File md 생성

FolderSelect from the list · My Drive · 00. Inbox
File Name{{2.파일일시}}_{{2.제목}}.md
ConvertNo

Data는 아래 템플릿입니다. {{ }} 자리는 매핑 패널에서 클릭해 넣습니다.

---
created: {{2.일시}}
source: channeltalk
author: {{1.refers.manager.name}}
status: 대기
tags: [idea]
message_id: {{1.entity.id}}
---

{{2.본문}}

{{10.사진md}}
  • 맨 아래는 [9]가 아니라 [10]의 사진md입니다. ![ ]( )로 다시 감싸지 마세요.
  • 링크를 옵시디언에서 임베드로 보고 싶으면 2.본문 자리를 2.본문md로 바꿉니다.
  • # 제목 줄은 본문 첫 줄과 겹쳐서 뺐습니다. 옵시디언에선 파일 이름이 제목 역할을 합니다.

12Google Sheets › Add a Row

Search MethodSearch by path · My Drive
Spreadsheet / Sheet아이디어 인박스 / 시트1
Table contains headersYes
Value input optionRaw (아이디어가 =, +로 시작해도 수식이 되지 않음)
Insert data optionOverwrite (드롭다운이 걸린 빈 줄에 써넣음)
UnformattedNo
열값
A 메시지ID1. entity › id
B 일시2. 일시
C 내용2. 본문
D 작성자1. refers › manager › name
E md링크11. Web View Link
F 사진URL10. 사진URL
G 상태대기 직접 입력 (공백 없이)

시트 헤더를 바꾸면 모듈을 열어 새로고침해야 칸 배치가 맞습니다.

13HTTP › Make a request 채널톡 ✅ 답장

URLhttps://api.channel.io/open/v5/groups/{{1.entity.chatId}}/messages
MethodPOST
Headers[5]와 같은 x-access-key, x-access-secret
QuerybotName = 아이디어봇
Bodyapplication/json · JSON string · Parse response Yes · Timeout 40
{
  "rootMessageId": "{{1.entity.id}}",
  "blocks": [
    { "type": "text", "value": "✅" }
  ]
}
  • 채널톡 Open API는 스레드 답글을 지원하지 않습니다. rootMessageId가 있어도 일반 메시지로 올라옵니다.
  • 401은 키·시크릿 오류, 404는 방 ID 오류입니다.

스케줄

Run scenario는 Immediately as data arrives. 화면 아래 스위치가 Active여야 작동합니다. 테스트할 땐 Run once를 누른 뒤 메시지를 보내세요.

최종 테스트 체크리스트

0 / 8

운영 메모

  • 사진과 글을 따로 보내면 md도 따로 생깁니다. 사진에 설명을 붙여 한 번에 보내세요.
  • 채널톡에서 메시지를 수정·삭제해도 md와 시트는 바뀌지 않습니다.
  • 웹훅 재전송으로 같은 메시지가 두 번 오면 중복이 생길 수 있습니다. 메시지ID 열로 확인하세요.
  • 회사(Workspace) 계정에서 외부 공유가 막혀 있으면 사진URL은 조직 안에서만 열립니다.