소개
유튜브 영상을 보면서 공부를 많이 하는 데 검색 결과를 분석하고 싶을 때 스프레스시트로 정리하면 좋겠다라는 아이디어로 시작
(내용 입력)
진행 방법
구글 앱스크립트를 활용한 업무자동화
인공지능을 활용하여 프롬프트에 앱스크립트를 만들어 달라고 지시함
클로드 활용하여 프롬프트에 `구글 스프레드 시트에 특정 주제를 검색하면 유튜브 영상 정보를 받는 유튜브 분석 앱스크립트를 만들고 싶어`
// API 키 상수 설정
var API_KEY = '여기에_API_키를_입력하세요';
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('YouTube 검색')
.addItem('YouTube 영상 검색하기', 'showSearchPrompt')
.addToUi();
}
function showSearchPrompt() {
var ui = SpreadsheetApp.getUi();
var response = ui.prompt(
'YouTube 영상 검색',
'검색어를 입력하세요:',
ui.ButtonSet.OK_CANCEL
);
if (response.getSelectedButton() == ui.Button.OK) {
var searchQuery = response.getResponseText();
searchYouTube(searchQuery);
}
}
function searchYouTube(searchQuery) {
var sheet = SpreadsheetApp.getActiveSheet();
// 헤더 설정
sheet.getRange('A1:H1').setValues([['제목', '채널명', '업로드 날짜', '조회수', '좋아요 수', '댓글 수', '영상 길이', '영상 링크']]);
sheet.getRange('A1:H1').setFontWeight('bold');
try {
// YouTube Data API 검색 URL
var searchUrl = 'https://www.googleapis.com/youtube/v3/search?part=snippet' +
'&q=' + encodeURIComponent(searchQuery) +
'&maxResults=50' +
'&type=video' +
'&key=' + API_KEY;
var searchResponse = UrlFetchApp.fetch(searchUrl);
var searchResults = JSON.parse(searchResponse.getContentText());
if (!searchResults.items || searchResults.items.length === 0) {
sheet.getRange('A2').setValue('검색 결과가 없습니다.');
return;
}
var data = [];
for (var i = 0; i < searchResults.items.length; i++) {
var video = searchResults.items[i];
var videoId = video.id.videoId;
// 비디오 상세 정보 URL
var videoUrl = 'https://www.googleapis.com/youtube/v3/videos?part=snippet,statistics,contentDetails' +
'&id=' + videoId +
'&key=' + API_KEY;
var videoResponse = UrlFetchApp.fetch(videoUrl);
var videoDetails = JSON.parse(videoResponse.getContentText()).items[0];
// ISO 8601 형식의 영상 길이를 읽기 쉬운 형식으로 변환
var duration = videoDetails.contentDetails.duration;
var readableDuration = duration.replace('PT', '')
.replace('H', '시간 ')
.replace('M', '분 ')
.replace('S', '초');
// 날짜 형식 변환
var uploadDate = new Date(videoDetails.snippet.publishedAt);
var formattedDate = Utilities.formatDate(uploadDate, 'Asia/Seoul', 'yyyy-MM-dd');
data.push([
videoDetails.snippet.title,
videoDetails.snippet.channelTitle,
formattedDate,
parseInt(videoDetails.statistics.viewCount).toLocaleString(),
videoDetails.statistics.likeCount ? parseInt(videoDetails.statistics.likeCount).toLocaleString() : 'N/A',
parseInt(videoDetails.statistics.commentCount).toLocaleString(),
readableDuration,
'https://www.youtube.com/watch?v=' + videoId
]);
// API 할당량 제한을 고려한 지연 시간 추가
Utilities.sleep(100);
}
// 데이터 입력
if (data.length > 0) {
sheet.getRange(2, 1, data.length, 8).setValues(data);
}
// 칼럼 너비 자동 조정
sheet.autoResizeColumns(1, 8);
// 링크를 클릭 가능하게 만들기
var linkRange = sheet.getRange(2, 8, data.length, 1);
for (var i = 0; i < data.length; i++) {
var formula = '=HYPERLINK("' + data[i][7] + '", "영상 보기")';
sheet.getRange(i + 2, 8).setFormula(formula);
}
// 정렬 설정
sheet.getRange(2, 1, data.length, 8).sort({column: 4, ascending: false}); // 조회수 기준 내림차순 정렬
} catch (e) {
Logger.log('오류 발생: ' + e.toString());
SpreadsheetApp.getUi().alert('오류가 발생했습니다: ' + e.toString());
}
}질문 : 앱스크립트 코드에 오류가 발생했다고 나오는데 ?
오류의 주요 원인을 확인하고 해결해 드리겠습니다. YouTube API 스크립트를 사용하기 위해서는 몇 가지 필수 설정이 필요합니다:
Google Cloud Project 설정이 필요합니다:
1. Google Cloud Console(https://console.cloud.google.com)에 접속
2. 새 프로젝트 만들기
3. YouTube Data API v3 활성화
4. 사용자 인증 정보(OAuth 2.0) 생성
Apps Script에서 YouTube 서비스 추가가 필요합니다:
1. 스크립트 편집기에서 왼쪽 + 버튼 클릭
2. 서비스 추가
3. YouTube Data API 선택 후 추가
실제 오류 메시지를 공유해 주시면 더 자세한 해결 방법을 안내해드릴 수 있습니다. 어떤 오류 메시지가 표시되나요?
가장 일반적인 오류들과 해결 방법입니다:
"YouTube 서비스를 찾을 수 없음" 오류
해결: Apps Script에서 YouTube 서비스를 추가해야 합니다
"API has not been enabled" 오류
해결: Google Cloud Console에서 YouTube Data API를 활성화해야 합니다
"Authentication failed" 오류
해결: OAuth 동의 화면 설정과 사용자 인증이 필요합니다
추가질문 : 유튜브 데이터 API 키를 넣으면 오류가 사라지나요?
네, API 키를 추가하면 오류를 해결할 수 있습니다.
YouTube Search Analysis Script with API Key
Click to open code
API 키 설정 방법:
Google Cloud Console(https://console.cloud.google.com)에 접속
프로젝트를 생성하거나 선택
YouTube Data API v3를 활성화
사용자 인증 정보 메뉴에서 API 키 생성
생성된 API 키를 스크립트의
API_KEY변수에 넣기
이 수정된 버전의 주요 변경사항:
YouTube API 서비스 대신 직접 API 호출 사용
API 키 인증 방식 적용
API 할당량 고려한 지연 시간 추가
오류 처리 개선
앱스크립트를 실행한 결과 원하는 스프레드시트가 잘 구현되는 것을 알 수 있었음
😀 복사본 사용해보세요 😍 공유는 사랑입니다.🥰
https://docs.google.com/spreadsheets/d/1crXRC6dlPLQLzhs2uhn6HgpvT1OfEoKkt_O9F-ffQJA/copy?usp=sharing
프롬프트 추가 요청사항 :
위의 앱스크립트가 성공적이긴 해/추가적으로 또 하나를 더 만들어줘/첫번째 열에 썸네일이 들어가도록 앱스크립트를 만들어줘
네, 썸네일을 포함한 새로운 버전의 스크립트를 만들어드리겠습니다.
YouTube Search Analysis Script with Thumbnails
Click to open code
// API 키 상수 설정
var API_KEY = '여기에_API_키를_입력하세요';
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('YouTube 검색')
.addItem('YouTube 영상 검색하기', 'showSearchPrompt')
.addToUi();
}
function showSearchPrompt() {
var ui = SpreadsheetApp.getUi();
var response = ui.prompt(
'YouTube 영상 검색',
'검색어를 입력하세요:',
ui.ButtonSet.OK_CANCEL
);
if (response.getSelectedButton() == ui.Button.OK) {
var searchQuery = response.getResponseText();
searchYouTubeWithThumbnails(searchQuery);
}
}
function searchYouTubeWithThumbnails(searchQuery) {
var sheet = SpreadsheetApp.getActiveSheet();
// 기존 내용 초기화
sheet.clear();
// 행 높이 설정 (썸네일 표시를 위해)
sheet.setRowHeight(1, 30); // 헤더 행
// 헤더 설정
sheet.getRange('A1:I1').setValues([['썸네일', '제목', '채널명', '업로드 날짜', '조회수', '좋아요 수', '댓글 수', '영상 길이', '영상 링크']]);
sheet.getRange('A1:I1').setFontWeight('bold');
try {
// YouTube Data API 검색 URL
var searchUrl = 'https://www.googleapis.com/youtube/v3/search?part=snippet' +
'&q=' + encodeURIComponent(searchQuery) +
'&maxResults=50' +
'&type=video' +
'&key=' + API_KEY;
var searchResponse = UrlFetchApp.fetch(searchUrl);
var searchResults = JSON.parse(searchResponse.getContentText());
if (!searchResults.items || searchResults.items.length === 0) {
sheet.getRange('A2').setValue('검색 결과가 없습니다.');
return;
}
var data = [];
for (var i = 0; i < searchResults.items.length; i++) {
var video = searchResults.items[i];
var videoId = video.id.videoId;
var thumbnailUrl = video.snippet.thumbnails.default.url;
// 비디오 상세 정보 URL
var videoUrl = 'https://www.googleapis.com/youtube/v3/videos?part=snippet,statistics,contentDetails' +
'&id=' + videoId +
'&key=' + API_KEY;
var videoResponse = UrlFetchApp.fetch(videoUrl);
var videoDetails = JSON.parse(videoResponse.getContentText()).items[0];
// ISO 8601 형식의 영상 길이를 읽기 쉬운 형식으로 변환
var duration = videoDetails.contentDetails.duration;
var readableDuration = duration.replace('PT', '')
.replace('H', '시간 ')
.replace('M', '분 ')
.replace('S', '초');
// 날짜 형식 변환
var uploadDate = new Date(videoDetails.snippet.publishedAt);
var formattedDate = Utilities.formatDate(uploadDate, 'Asia/Seoul', 'yyyy-MM-dd');
// 썸네일 이미지 수식
var thumbnailFormula = '=IMAGE("' + thumbnailUrl + '")';
data.push([
thumbnailFormula, // 썸네일
videoDetails.snippet.title,
videoDetails.snippet.channelTitle,
formattedDate,
parseInt(videoDetails.statistics.viewCount).toLocaleString(),
videoDetails.statistics.likeCount ? parseInt(videoDetails.statistics.likeCount).toLocaleString() : 'N/A',
parseInt(videoDetails.statistics.commentCount).toLocaleString(),
readableDuration,
'https://www.youtube.com/watch?v=' + videoId
]);
// API 할당량 제한을 고려한 지연 시간 추가
Utilities.sleep(100);
}
// 데이터 입력을 위한 범위 설정
if (data.length > 0) {
// 썸네일을 위한 행 높이 설정
for (var i = 2; i <= data.length + 1; i++) {
sheet.setRowHeight(i, 90); // 썸네일 높이에 맞춰 조정
}
// 데이터 입력
var range = sheet.getRange(2, 1, data.length, 9);
range.setValues(data);
// 썸네일 칼럼 너비 설정
sheet.setColumnWidth(1, 120); // 썸네일 열 너비
// 나머지 칼럼 자동 너비 조정
sheet.autoResizeColumns(2, 8);
// 링크를 클릭 가능하게 만들기
for (var i = 0; i < data.length; i++) {
var formula = '=HYPERLINK("' + data[i][8] + '", "영상 보기")';
sheet.getRange(i + 2, 9).setFormula(formula);
}
}
// 정렬 설정 (조회수 기준 내림차순)
sheet.getRange(2, 1, data.length, 9).sort({column: 5, ascending: false});
} catch (e) {
Logger.log('오류 발생: ' + e.toString());
SpreadsheetApp.getUi().alert('오류가 발생했습니다: ' + e.toString());
}
}주요 변경사항:
썸네일 열 추가
IMAGE 함수를 사용하여 썸네일 표시
행 높이 자동 조정 (썸네일 표시를 위해)
썸네일 칼럼 너비 설정
전체적인 레이아웃 개선
사용 방법은 이전과 동일합니다:
스크립트 편집기에 코드를 복사
API_KEY 값을 본인의 YouTube Data API 키로 변경
저장 후 실행
썸네일_추가_유튜브 영상 정보를 받는_유튜브 분석 자동화
https://docs.google.com/spreadsheets/d/1kghpHat60FOl7aJGXSQV6qXkAqV48MrHnR0QBlDgxN0/copy?usp=sharing
동영상 목록을 보여주는 Google Docs 페이지의 스크린샷
개선 사항 또는 얻을 수 있었던 점 :
앱스크립트는 Claude가 잘 만들어줌 🤩