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

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

מטרות

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

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

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

צילום מסך של נתוני YouTube ב-Google Sheet

איך זה עובד

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

שירותי Apps Script

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

  • Spreadsheet service – מקבל את פרטי כתובת ה-URL של YouTube מהגיליון האלקטרוני.
  • YouTube Data API advanced service – שירות מתקדם שמאפשר לקבל את פרטי הסרטון ב-YouTube והנתונים הסטטיסטיים של כל כתובת URL של סרטון.
  • שירות אימייל – יוצר ושולח אימייל ב-Gmail עם רשימה של סרטונים שנוספו להם תגובות חדשות.

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

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

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

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

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

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

יצירת טריגר

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

הפעלת הסקריפט

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

  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() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();

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

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

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

    // Processes each row in spreadsheet.
    for (let i = 1; i < numRows; ++i) {
      const row = rows[i];
      // Extracts video ID.
      const 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.
      const detailsResponse = getVideoDetails(videoId);
      const title = detailsResponse.items[0].snippet.title;
      const publishDate = detailsResponse.items[0].snippet.publishedAt;
      const publishDateFormatted = new Date(publishDate);
      const views = detailsResponse.items[0].statistics.viewCount;
      const likes = detailsResponse.items[0].statistics.likeCount;
      const comments = detailsResponse.items[0].statistics.commentCount;
      const channel = detailsResponse.items[0].snippet.channelTitle;

      // Collects title, publish date, channel, views, comments, likes details and pastes into tab.
      const 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.
      const addlCommentCount = comments - row[titleColumnIdx + 4];

      // Adds video title, link, and additional comment count to table if new counts > old counts.
      if (addlCommentCount > 0) {
        const 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) {
  const part = "snippet,statistics";
  const 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];
  const 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) {
  const template = HtmlService.createTemplateFromFile("email");
  template.content = content;
  const 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 לפיתוח.

השלבים הבאים