Theo dõi lượt xem và bình luận của video trên YouTube

Cấp độ lập trình: Người mới bắt đầu
Thời lượng: 20 phút
Loại dự án: Tự động hoá bằng trình kích hoạt dựa trên thời gian

Mục tiêu

  • Tìm hiểu chức năng của giải pháp.
  • Tìm hiểu chức năng của các dịch vụ Apps Script trong giải pháp.
  • Thiết lập tập lệnh.
  • Chạy tập lệnh.

Giới thiệu về giải pháp này

Giải pháp này theo dõi hiệu suất của các video công khai trên YouTube, bao gồm số lượt xem, lượt thích và bình luận, trong một bảng tính Google Trang tính. Điều kiện kích hoạt này sẽ kiểm tra thông tin cập nhật mỗi ngày và gửi email nếu video có hoạt động bình luận mới để bạn có thể tương tác với các câu hỏi và bình luận.

Ảnh chụp màn hình dữ liệu YouTube trong Google Trang tính

Cách hoạt động

Tập lệnh này sử dụng dịch vụ YouTube nâng cao để lấy thông tin chi tiết và số liệu thống kê về video trên YouTube cho các URL video được liệt kê trong cột Đường liên kết đến video trong mỗi trang tính. Nếu số lượng bình luận cho một video được liệt kê tăng lên, tập lệnh sẽ gửi thông báo qua email đến địa chỉ email mà trang tính được đặt tên theo.

Dịch vụ Apps Script

Giải pháp này sử dụng các dịch vụ sau:

Điều kiện tiên quyết

Để sử dụng mẫu này, bạn cần có các điều kiện tiên quyết sau:

  • Tài khoản Google (có thể cần có sự phê duyệt của quản trị viên đối với tài khoản Google Workspace).
  • Một trình duyệt web có quyền truy cập Internet.

Thiết lập tập lệnh

Tạo dự án Apps Script

  1. Nhấp vào nút sau để sao chép bảng tính Theo dõi lượt xem và bình luận về video trên YouTube. Dự án Apps Script cho giải pháp này được đính kèm vào bảng tính.
    Tạo bản sao
  2. Trong bảng tính đã sao chép, hãy thay đổi tên của trang tính Your_Email_Address thành địa chỉ email của bạn.
  3. Thêm URL của video trên YouTube mà bạn muốn theo dõi hoặc sử dụng các URL được cung cấp để thử nghiệm. URL phải bắt đầu bằng định dạng www.youtube.com/watch?v=.
  4. Nhấp vào Tiện ích > Apps Script. Nếu YouTube đã có trong danh sách Dịch vụ, bạn có thể bỏ qua 2 bước tiếp theo.
  5. Bên cạnh Dịch vụ, hãy nhấp vào biểu tượng Thêm dịch vụ .
  6. Trong danh sách, hãy chọn YouTube Data API (API Dữ liệu YouTube) rồi nhấp vào Thêm.

Tạo trình kích hoạt

  1. Trong dự án Apps Script, hãy nhấp vào biểu tượng Trình kích hoạt > Thêm trình kích hoạt.
  2. Đối với phần Chọn hàm cần chạy, hãy chọn markVideos.
  3. Đối với mục Chọn nguồn sự kiện, hãy chọn Được điều khiển theo thời gian.
  4. Đối với mục Chọn loại điều kiện kích hoạt dựa trên thời gian, hãy chọn Đồng hồ đếm giờ theo ngày.
  5. Đối với mục Chọn thời gian trong ngày, hãy chọn thời gian bạn muốn.
  6. Khi được nhắc, hãy cho phép tập lệnh chạy. Nếu màn hình đồng ý OAuth hiển thị cảnh báo Ứng dụng này chưa được xác minh, hãy tiếp tục bằng cách chọn Nâng cao > Chuyển đến {Project Name} (không an toàn).

Chạy tập lệnh

Điều kiện kích hoạt mà bạn thiết lập sẽ chạy tập lệnh một lần mỗi ngày. Bạn có thể chạy tập lệnh theo cách thủ công để kiểm thử.

  1. Trong dự án Apps Script, hãy nhấp vào biểu tượng Trình chỉnh sửa .
  2. Trong trình đơn thả xuống hàm, hãy chọn markVideos.
  3. Nhấp vào Chạy.
  4. Chuyển về bảng tính để xem lại thông tin mà tập lệnh đã thêm vào bảng.
  5. Mở email để xem email có danh sách các video có bình luận. Khi chạy trong tương lai, tập lệnh này sẽ chỉ gửi email có các video có số lượng bình luận tăng lên kể từ lần chạy tập lệnh gần đây nhất.

Xem lại mã

Để xem xét mã Apps Script cho giải pháp này, hãy nhấp vào Xem mã nguồn bên dưới:

Xem mã nguồn

Code.gs

solutions/automations/youtube-tracker/Code.js
// To learn how to use this script, refer to the documentation:
// https://developers.google.com/apps-script/samples/automations/youtube-tracker

/*
Copyright 2022 Google LLC

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

// Sets preferences for email notification. Choose 'Y' to send emails, 'N' to skip emails.
const EMAIL_ON = 'Y';

// Matches column names in Video sheet to variables. If the column names change, update these variables.
const COLUMN_NAME = {
  VIDEO: 'Video Link',
  TITLE: 'Video Title',
};

/**
 * Gets YouTube video details and statistics for all
 * video URLs listed in 'Video Link' column in each
 * sheet. Sends email summary, based on preferences above, 
 * when videos have new comments or replies.
 */
function markVideos() {
  let ss = SpreadsheetApp.getActiveSpreadsheet();
  let sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();

  // Runs through process for each tab in Spreadsheet.
  sheets.forEach(function(dataSheet) {
    let tabName = dataSheet.getName();
    let range = dataSheet.getDataRange();
    let numRows = range.getNumRows();
    let rows = range.getValues();
    let headerRow = rows[0];

    // Finds the column indices.
    let videoColumnIdx = headerRow.indexOf(COLUMN_NAME.VIDEO);
    let titleColumnIdx = headerRow.indexOf(COLUMN_NAME.TITLE);

    // Creates empty array to collect data for email table.
    let emailContent = [];

    // Processes each row in spreadsheet.
    for (let i = 1; i < numRows; ++i) {
      let row = rows[i];
      // Extracts video ID.
      let videoId = extractVideoIdFromUrl(row[videoColumnIdx])
      // Processes each row that contains a video ID.
      if(!videoId) { 
        continue;
      }
      // Calls getVideoDetails function and extracts target data for the video.
      let detailsResponse = getVideoDetails(videoId);
      let title = detailsResponse.items[0].snippet.title;
      let publishDate = detailsResponse.items[0].snippet.publishedAt;
      let publishDateFormatted = new Date(publishDate);
      let views = detailsResponse.items[0].statistics.viewCount;
      let likes = detailsResponse.items[0].statistics.likeCount;
      let comments = detailsResponse.items[0].statistics.commentCount;
      let channel = detailsResponse.items[0].snippet.channelTitle;

      // Collects title, publish date, channel, views, comments, likes details and pastes into tab.
      let detailsRow = [title,publishDateFormatted,channel,views,comments,likes];
      dataSheet.getRange(i+1,titleColumnIdx+1,1,6).setValues([detailsRow]);

      // Determines if new count of comments/replies is greater than old count of comments/replies.
      let addlCommentCount = comments - row[titleColumnIdx+4];

      // Adds video title, link, and additional comment count to table if new counts > old counts.
      if (addlCommentCount > 0) {
        let emailRow = [title,row[videoColumnIdx],addlCommentCount]
        emailContent.push(emailRow);
      }
    }
    // Sends notification email if Content is not empty.
    if (emailContent.length > 0 && EMAIL_ON == 'Y') {
      sendEmailNotificationTemplate(emailContent, tabName);
    }
  });
}

/**
 * Gets video details for YouTube videos
 * using YouTube advanced service.
 */
function getVideoDetails(videoId) {
  let part = "snippet,statistics";
  let response = YouTube.Videos.list(part,
      {'id': videoId});
 return response;
}

/**
 * Extracts YouTube video ID from url.
 * (h/t https://stackoverflow.com/a/3452617)
 */
function extractVideoIdFromUrl(url) {
  let videoId = url.split('v=')[1];
  let ampersandPosition = videoId.indexOf('&');
  if (ampersandPosition != -1) {
    videoId = videoId.substring(0, ampersandPosition);
  }   
 return videoId;
}

/**
 * Assembles notification email with table of video details. 
 * (h/t https://stackoverflow.com/questions/37863392/making-table-in-google-apps-script-from-array)
 */
function sendEmailNotificationTemplate(content, emailAddress) {
  let template = HtmlService.createTemplateFromFile('email');
  template.content = content;
  let msg = template.evaluate();  
  MailApp.sendEmail(emailAddress,'New comments or replies on YouTube',msg.getContent(),{htmlBody:msg.getContent()});
}

email.html

solutions/automations/youtube-tracker/email.html
<!--
 Copyright 2022 Google LLC

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->

<body>
  Hello,<br><br>You have new comments and/or replies on videos: <br><br>
  <table border="1">
    <tr>
      <th>Video Title</th>
      <th>Link</th>
      <th>Number of new replies and comments</th>
    </tr>
    <? for (var i = 0; i < content.length; i++) { ?>
    <tr>
      <? for (var j = 0; j < content[i].length; j++) { ?>
      <td align="center"><?= content[i][j] ?></td>
      <? } ?>
    </tr>
    <? } ?>
  </table>
</body>

Người đóng góp

Mẫu này do Google duy trì với sự trợ giúp của Chuyên gia phát triển của Google.

Các bước tiếp theo