מעקב אחר צפיות בסרטוני YouTube & תגובות

רמת תכנות: מתחילים
משך: 20 דקות
סוג פרויקט: אוטומציה עם טריגר מבוסס-זמן

מטרות

  • הבנה מה הפתרון עושה.
  • להבין מה שירותי Apps Script עושים במסגרת הפתרון.
  • מגדירים את הסקריפט.
  • מריצים את הסקריפט.

מידע על הפתרון הזה

הפתרון הזה עוקב אחר הביצועים של סרטונים ציבוריים ב-YouTube, כולל צפיות, לייקים ותגובות בגיליון אלקטרוני ב-Google Sheets. הטריגר בודק מדי יום אם יש מידע מעודכן, ושולח אימייל אם נוספו תגובות חדשות לסרטונים, כדי שתוכלו לענות על שאלות ותגובות.

צילום מסך של נתוני YouTube בגיליון אלקטרוני ב-Google Sheets

איך זה עובד

הסקריפט משתמש בשירות המתקדם של YouTube כדי לקבל פרטים ונתונים סטטיסטיים של הסרטון ב-YouTube עבור כתובות ה-URL של הסרטונים שרשומות בעמודה קישור לסרטון בכל גיליון. אם מספר התגובות לסרטון ברשימה עלה, הסקריפט שולח התראה באימייל לכתובת האימייל שמצוינת בשם הגיליון.

שירותי Apps Script

הפתרון הזה משתמש בשירותים הבאים:

דרישות מוקדמות

כדי להשתמש בדוגמה הזו, נדרשות הדרישות המוקדמות הבאות:

  • חשבון Google (יכול להיות שיהיה צורך באישור אדמין).
  • דפדפן אינטרנט עם גישה לאינטרנט.

הגדרת הסקריפט

יצירת פרויקט Apps Script

  1. לחצו על הלחצן הבא כדי ליצור עותק של הגיליון האלקטרוני מעקב אחר צפיות ותגובות בסרטונים ב-YouTube. פרויקט Apps Script לפתרון הזה מצורף לגיליון האלקטרוני.
    יצירת עותק
  2. בגיליון האלקטרוני שהעתקתם, משנים את שם הגיליון Your_Email_Address לכתובת האימייל שלכם.
  3. צריך להוסיף את כתובות ה-URL של הסרטונים ב-YouTube שאחריהם רוצים לעקוב, או להשתמש בכתובות ה-URL שסופקו לבדיקה. כתובות ה-URL חייבות להתחיל בפורמט www.youtube.com/watch?v=.
  4. לוחצים על תוספים > Apps Script. אם YouTube כבר מופיע בקטע Services, אפשר לדלג לשני השלבים הבאים.
  5. ליד שירותים, לוחצים על 'הוספת שירות' .
  6. ברשימה, בוחרים באפשרות YouTube Data API ולוחצים על הוספה.

יצירת טריגר

  1. בפרויקט Apps Script, לוחצים על Triggers (טריגרים) > Add trigger (הוספת טריגר).
  2. בשדה בחירת הפונקציה שתופעל, בוחרים באפשרות סימון סרטונים.
  3. בקטע בחירת מקור האירוע, בוחרים באפשרות מבוסס-זמן.
  4. בשדה בחירת סוג הטריגר שמבוסס על שעה, בוחרים באפשרות טיימר יומי.
  5. בשדה בחירת שעה ביום, בוחרים את השעה המועדפת.
  6. כשתוצג בקשה, מאשרים את הסקריפט. אם במסך ההסכמה של OAuth מוצגת האזהרה האפליקציה הזו לא מאומתת, אפשר להמשיך בלחיצה על אפשרויות מתקדמות > מעבר אל {Project Name} (לא בטוח).

מריצים את הסקריפט

הטריגר שהגדרתם יריץ את הסקריפט פעם ביום. אפשר להריץ את הסקריפט באופן ידני כדי לבדוק אותו.

  1. בפרויקט Apps Script, לוחצים על עריכה .
  2. בתפריט הנפתח של הפונקציה, בוחרים באפשרות markVideos (סימון סרטונים).
  3. לוחצים על Run.
  4. חוזרים לגיליון האלקטרוני כדי לבדוק את המידע שהסקריפט הוסיף לגיליון.
  5. פותחים את האימייל ומעיינים בו עם רשימת הסרטונים שיש בהם יותר מאפס תגובות. כשהסקריפט ירוץ בעתיד, יישלח אימייל רק עם סרטונים שמספר התגובות שלהם גדל מאז הפעם האחרונה שהסקריפט רצה.

בדיקת הקוד

כדי לבדוק את קוד Apps Script של הפתרון הזה, לוחצים על הצגת קוד המקור למטה:

הצגת קוד המקור

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>

תורמים

הדוגמה הזו מנוהלת על ידי Google בעזרת מומחי המפתחים של Google.

השלבים הבאים