무료_구글 스프레드시트에서 앱스크립트를 활용한_유튜브 영상 정보를 모아받는_유튜브 분석 자동화

소개

유튜브 영상을 보면서 공부를 많이 하는 데 검색 결과를 분석하고 싶을 때 스프레스시트로 정리하면 좋겠다라는 아이디어로 시작

(내용 입력)

진행 방법

구글 앱스크립트를 활용한 업무자동화

인공지능을 활용하여 프롬프트에 앱스크립트를 만들어 달라고 지시함

클로드 활용하여 프롬프트에 `구글 스프레드 시트에 특정 주제를 검색하면 유튜브 영상 정보를 받는 유튜브 분석 앱스크립트를 만들고 싶어`

// 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 스크립트를 사용하기 위해서는 몇 가지 필수 설정이 필요합니다:

  1. Google Cloud Project 설정이 필요합니다:

    1. Google Cloud Console(https://console.cloud.google.com)에 접속

    2. 새 프로젝트 만들기

    3. YouTube Data API v3 활성화

    4. 사용자 인증 정보(OAuth 2.0) 생성

  2. Apps Script에서 YouTube 서비스 추가가 필요합니다:

    1. 스크립트 편집기에서 왼쪽 + 버튼 클릭

    2. 서비스 추가

    3. YouTube Data API 선택 후 추가

  3. 실제 오류 메시지를 공유해 주시면 더 자세한 해결 방법을 안내해드릴 수 있습니다. 어떤 오류 메시지가 표시되나요?

가장 일반적인 오류들과 해결 방법입니다:

  1. "YouTube 서비스를 찾을 수 없음" 오류

    • 해결: Apps Script에서 YouTube 서비스를 추가해야 합니다

  2. "API has not been enabled" 오류

    • 해결: Google Cloud Console에서 YouTube Data API를 활성화해야 합니다

  3. "Authentication failed" 오류

    • 해결: OAuth 동의 화면 설정과 사용자 인증이 필요합니다

  • 추가질문 : 유튜브 데이터 API 키를 넣으면 오류가 사라지나요?

네, API 키를 추가하면 오류를 해결할 수 있습니다.

YouTube Search Analysis Script with API Key

Click to open code

API 키 설정 방법:

  1. Google Cloud Console(https://console.cloud.google.com)에 접속

  2. 프로젝트를 생성하거나 선택

  3. YouTube Data API v3를 활성화

  4. 사용자 인증 정보 메뉴에서 API 키 생성

  5. 생성된 API 키를 스크립트의 API_KEY 변수에 넣기

이 수정된 버전의 주요 변경사항:

  1. YouTube API 서비스 대신 직접 API 호출 사용

  2. API 키 인증 방식 적용

  3. API 할당량 고려한 지연 시간 추가

  4. 오류 처리 개선

앱스크립트를 실행한 결과 원하는 스프레드시트가 잘 구현되는 것을 알 수 있었음

😀 복사본 사용해보세요 😍 공유는 사랑입니다.🥰

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());
  }
}
  • 주요 변경사항:

    1. 썸네일 열 추가

    2. IMAGE 함수를 사용하여 썸네일 표시

    3. 행 높이 자동 조정 (썸네일 표시를 위해)

    4. 썸네일 칼럼 너비 설정

    5. 전체적인 레이아웃 개선

    사용 방법은 이전과 동일합니다:

    1. 스크립트 편집기에 코드를 복사

    2. API_KEY 값을 본인의 YouTube Data API 키로 변경

    3. 저장 후 실행

    썸네일_추가_유튜브 영상 정보를 받는_유튜브 분석  자동화

    https://docs.google.com/spreadsheets/d/1kghpHat60FOl7aJGXSQV6qXkAqV48MrHnR0QBlDgxN0/copy?usp=sharing 


    동영상 목록을 보여주는 Google Docs 페이지의 스크린샷

개선 사항 또는 얻을 수 있었던 점 :

  • 앱스크립트는 Claude가 잘 만들어줌 🤩

지피터스 뉴스레터

이번 주 AI, 딱 쓸 것만

매주 월요일 오후,
읽고 바로 써먹을 AI 소식만