구글시트 API를 활용한 유튜브 자동화 챗봇 만들기
구글시트에서 제공하는 앱스크립트를 활용하여 나만의 API를 만든 후 유튜브 챗봇과 연동하여 자동화하는 방법까지 단계별로 알아봅니다.
이 강의에서는 구글 시트의 앱스크립트로 직접 REST API를 만든 뒤, NightBot과 연동해 유튜브 채팅창에서 자동으로 출석을 기록하는 챗봇을 구축하는 과정을 다룹니다. 시트 데이터 입출력부터 웹앱 배포, 커스텀 명령문 등록까지 모든 단계를 정리해, 실시간 방송에서 시청자 반응을 데이터로 관리할 수 있는 챗봇을 직접 운영할 수 있습니다.
실습자료를 준비했어요
수업에서 사용한 예제 파일과 보충 자료를 한 곳에 정리했습니다!👇
구글시트 앱스크립트 API 예제 명령문
완성된 코드는 본 강의 상단의 보충자료에서 다운로드할 수 있습니다. 코드를 복사/붙여넣기로 사용하는 방법은 아래 유튜브 챗봇 단계별 만들기를 참고하시기 바랍니다. 명령문의 단계별 동작 원리에 대한 자세한 설명은 예제 코드에 표기된 시간대 영상 강의에서 확인하실 수 있습니다.
function doGet(e){ // 통합문서&시트 불러오기 (05:35) // 시트의 머리글 받아오기 // 머리글에서 ID 제거하기 (10:14) // URL로 입력한 받은 쿼리문 받아오기 (10:54) // https://developers.google.com/apps-script/guides/web // 현재날짜/시간 출력하기 "06-05 Sat 19:30" 형태로 (14:46) // https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html // https://developers.google.com/google-ads/scripts/docs/features/dates var now = new Date(); var date = Utilities.formatDate(now, 'Asia/Seoul', 'MM-dd EEE HH:mm'); // 시트에 입력된 데이터를 받아오기 (15:14) // 쿼리문에 new가 없으면 출석회수 출력 (15:59) if (!query['new']) { } else { // 쿼리문에 new가 있으면 새로운 출석을 등록(21:49) // 기존 접속한 기록이 있으면 이미 출석했다는 안내 메시지 출력 후 종료 // 기록이 없으면, 새로운 사용자를 등록 // 쿼리로 받아온 값에는 id가 없으므로, 기존 시트에 입력된 ID를 참조하여 최대값을 계산 const ids = ws.getRange(2,1,ws.getLastRow()-1,1).getValues(); const newIDNumber = getMaxFromDoubleArray_(ids) + 1; // 머리글을 참조한 배열(ID가 없는 배열)의 맨 왼쪽에 ID 값을 추가합니다. // 시트에 데이터를 추가합니다. (21:49) // 접속회수에 1을 더한 뒤, 안내메시지 출력 후 종료합니다. } } function getMaxFromDoubleArray_(arr){ /* 배열에서 최대 값을 반환합니다.*/ let maxID = 0; arr.forEach(r => { if(r[0] > maxID) maxID = r[0]; }); return maxID; }
NightBot 커스텀 호출 구문
| Command | Message |
| !출석 | $(urlfetch 앱스크립트URL?U=$(querystring $(user))&L=$(time Asia/Seoul "YYYYMMDD")&new=s) |
| !출석확인 | $(urlfetch 앱스크립트URL?U=$(querystring $(user))&L=$(time Asia/Seoul "YYYYMMDD")) |
구글 시트에서 제공하는 앱스크립트(Apps Script)를 활용하면, URL 주소만으로 시트의 값을 입력하거나 출력하는 REST API를 손쉽게 제작할 수 있습니다.
- 구글시트 만들기 : 구글로 이동한 뒤 로그인합니다. 이후 우측 상단의 설정 버튼을 클릭한 뒤 [스프레드시트]를 클릭하여 구글 시트 메인 페이지로 이동합니다.
오빠두Tip : Sorry, unable to open the file at this time. 오류는 여러 개의 구글 계정이 동시에 로그인되어 있을 때 발생합니다. 오류가 발생하면 모든 구글 계정을 로그아웃한 뒤 하나의 계정만 로그인하여 실습을 진행합니다. - [새 스프레드시트 시작하기] 에서 [내용 없음]을 선택하여 비어있는 시트를 만든 뒤, 통합문서 이름을 "유튜브 챗봇 만들기", 시트 이름을 "Log"로 변경합니다.

- A1셀에 ID, B1셀에 U, C1셀에 L을 입력합니다. A2~C2셀에는 아래 그림과 같이 임시 데이터를 입력합니다.

- API 스크립트 붙여넣기 : [도구] 탭의 [스크립트 편집기]를 클릭하여 스크립트 편집기를 실행합니다.

- 스크립트 편집기가 실행되면 좌측 프로젝트 목록에서 'Code.gs'를 선택한 후, 강의 상단에 첨부된 완성파일 전체 명령문을 복사하여 'Code.gs'에 덮어쓰기합니다. 이후 저장 버튼을 눌러 스크립트를 저장합니다.

- API 배포하기 : 우측 상단의 [배포] - [새 배포]를 클릭합니다.

- 새 배포 창이 나오면 ①유형 선택 : 웹 앱, ②새 설명 : 유튜브 챗봇 API, ③액세스 권한이 있는 사용자 : 모든 사용자 를 선택 후 [배포] 버튼을 클릭합니다.

- 액세스 승인 버튼이 나오면 액세스 승인 버튼을 클릭하여 접근 권한을 부여합니다.
오빠두Tip : '확인되지 않은 앱' 오류가 표시될 경우 [고급] 버튼을 클릭한 뒤 [프로젝트로 이동 (안전하지 않음)]을 선택하여 권한을 승인할 수 있습니다. - 웹앱 URL이 생성되었습니다. URL 주소를 복사합니다.

- API 사용하기 : 이제 인터넷 브라우저 주소창에 아래와 같이 URL을 입력하면 구글 시트에 출석체크를 등록하거나 출석 현황을 확인할 수 있습니다.

동작 URL 출석체크 등록 웹앱URL?U=오빠두&L=20190101&new=y 출석현황 확인 웹앱URL?U=오빠두&L=20190101
이제 구글 시트로 제작한 API를 활용해 유튜브 챗봇을 만들 수 있습니다. 대표적으로 사용되는 NightBot으로 유튜브 챗봇을 직접 제작해보겠습니다.
- NightBot 회원가입 : NightBot.tv로 이동한 뒤, [Sign Up] - [Log in with Youtube] 버튼을 클릭하여 회원가입합니다.
오빠두Tip : NightBot 회원가입은 실제 유튜브 방송을 진행할 구글 계정으로 가입합니다. - 우측 상단의 [Join Channel] 버튼을 클릭합니다.

- NightBot 관리자 등록 : 안내창에 표시된 순서대로 [유튜브 스튜디오] - [환경설정] - [커뮤니티]로 이동한 뒤, 안내창의 링크를 복사·붙여넣기하여 NightBot을 관리자로 등록합니다.

- 커스텀 명령문 작성 : 좌측 목록에서 [Command] - [Custom]을 선택합니다. 이후 [Add Command] 버튼을 클릭한 뒤 아래 표와 같이 커스텀 명령문을 추가합니다.

Command Message !출석 $(urlfetch 앱스크립트URL?U=$(querystring $(user))&L=$(time Asia/Seoul "YYYYMMDD")&new=s) !출석확인 $(urlfetch 앱스크립트URL?U=$(querystring $(user))&L=$(time Asia/Seoul "YYYYMMDD")) - 이제 유튜브 스트리밍을 실행한 후 채팅창에 "!출석"이나 "!출석확인"을 입력하면 구글 시트와 데이터가 실시간으로 연동되며 챗봇이 동작합니다.
오빠두Tip : NightBot 유튜브 챗봇은 방송이 '공개' 상태일 때만 동작합니다. 방송이 '비공개' 또는 '회원전용'일 경우에는 챗봇을 사용할 수 없습니다.

라고 하는데 뭐가 틀린건지 모르겠어요. 완전예제를 붙여도 이게 떠요.
paremeter 라는 변수가 코드에 잘못 입력되었거나, 대/소문자가 잘못되어서 발생한 오류입니다.
홈페이지에 올려드린 완성코드를 복/붙해서 사용해보시거나, 작성한 명령문을 다시 검토해보세요.
const query = e.parameter;
여기에서 TypeError: Cannot read property 'parameter' of undefined 에러가 뜨네요 ㅜㅜ
Range("셀주소").Value
속성을 사용하면 됩니다.
아래 링크를 한번 참고해보세요.
https://developers.google.com/sheets/api/guides/values
예제 영상 기준으로 { ?U=오빠두 }를 뒤에 입력했을 때,
return ContentService.createTextOutput(user); //에서는 '오빠두'가 출력되고
if (user = "오빠두") //에서는 오류가 생기는데 문제가 무엇일까요,..?
if문을 아래처럼 수정해보세요.
if (user == "오빠두")
아래쪽으로 데이터를 하나씩 누적하도록 코드를 적절히 수정해보세요 :)
만약에 이름이 같은 시청자가 있거나
이름을 변경하면 중복 또는 다시 출석카운트
진행 되나요?
이름을 변경하면 기존 출석은 제외되고
새로운 출석으로 카운트 됩니다.
나이트봇에서 반환되는 응답의 길이가 400글자를 초과해서 그렇습니다.
구글 시트에서 사용하는 필드명이나 URL 주소 등을 수정하여, 결과로 반환되는 글자수를 줄여보세요.
답변이 도움이 되었길 바랍니다. 감사합니다.