YouTube-Videoaufrufe und Kommentare verfolgen

Programmierkenntnisse: Anfänger
Dauer: 20 Minuten
Projekttyp: Automatisierung mit einem zeitgesteuerten Trigger

Ziele

  • Verstehen, was die Lösung tut
  • Verstehen, wie die Google Apps Script-Dienste in der Lösung funktionieren
  • Das Script einrichten
  • Das Script ausführen.

Informationen zu dieser Lösung

Mit dieser Lösung können Sie die Leistung öffentlicher YouTube-Videos in einer Google Sheets-Tabelle verfolgen, einschließlich Aufrufe, Likes und Kommentare. Der Trigger prüft täglich auf aktualisierte Informationen und sendet eine Gmail-Nachricht, wenn Videos neue Kommentare erhalten haben, damit Sie auf Fragen und Kommentare reagieren können.

Google-Tabelle mit YouTube-Videotracking-Daten

Funktionsweise

Das Script verwendet den erweiterten YouTube-Dienst, um YouTube-Videodetails und Statistiken für die Video-URLs abzurufen, die in jedem Tabellenblatt in der Spalte Videolink aufgeführt sind. Wenn die Anzahl der Kommentare für ein aufgelistetes Video gestiegen ist, sendet das Script eine E‑Mail-Benachrichtigung an die E‑Mail-Adresse, nach der das Tabellenblatt benannt ist.

Apps Script-Dienste

Diese Lösung verwendet die folgenden Dienste:

Vorbereitung

Für die Verwendung dieses Beispiels sind folgende Voraussetzungen erforderlich:

  • Ein Google-Konto (für Google Workspace-Konten ist möglicherweise die Genehmigung durch den Administrator erforderlich)
  • Ein Webbrowser mit Internetzugriff

Script einrichten

So richten Sie dieses Script ein:

Apps Script-Projekt erstellen

  1. Wenn Sie eine Kopie der Tabelle YouTube-Videoaufrufe und ‑kommentare verfolgen erstellen möchten, klicken Sie auf die folgende Schaltfläche: Kopie erstellen Das Apps Script-Projekt für diese Lösung ist an die Tabelle angehängt.
  2. Ändern Sie in der kopierten Tabelle den Namen des Tabellenblatts Your_Email_Address in Ihre E‑Mail-Adresse.
  3. Fügen Sie die YouTube-Video-URLs hinzu, die Sie verfolgen möchten, oder verwenden Sie die bereitgestellten URLs zum Testen. Die URLs müssen mit dem Format www.youtube.com/watch?v= beginnen.
  4. Klicken Sie auf Erweiterungen > Apps Script. Wenn YouTube bereits unter Dienste aufgeführt ist, können Sie die nächsten beiden Schritte überspringen.
  5. Klicken Sie neben Dienste auf „Dienst hinzufügen“ .
  6. Wählen Sie in der Liste YouTube Data API aus und klicken Sie auf Hinzufügen.

Trigger erstellen

  1. Klicken Sie im Apps Script-Projekt auf Trigger > Trigger hinzufügen.
  2. Wählen Sie unter Aus zuführende Funktion auswählen die Option markVideos aus.
  3. Wählen Sie unter Ereignisquelle auswählen die Option Zeitgesteuert aus.
  4. Wählen Sie unter Typ des zeitbasierten Triggers auswählen die Option Tagestimer aus.
  5. Wählen Sie unter Uhrzeit auswählen die gewünschte Uhrzeit aus.
  6. Autorisieren Sie die Skripts, wenn Sie dazu aufgefordert werden. <<../_snippets/oauth.md>>

Das Script ausführen

Der von Ihnen eingerichtete Trigger führt das Script einmal täglich aus. Sie können das Script manuell ausführen, um es zu testen.

  1. Klicken Sie im Apps Script-Projekt auf Editor .
  2. Wählen Sie im Drop-down-Menü „Funktion“ die Option markVideos aus.
  3. Klicken Sie auf Ausführen.
  4. Wechseln Sie zurück zur Tabelle, um die Informationen zu überprüfen, die das Script dem Tabellenblatt hinzugefügt hat.
  5. Öffnen Sie Ihre E‑Mails, um die E‑Mail mit der Liste der Videos zu überprüfen, die mehr als null Kommentare haben. Wenn das Script in Zukunft ausgeführt wird, wird nur eine E‑Mail mit Videos gesendet, deren Kommentaranzahl seit der letzten Ausführung des Scripts gestiegen ist.

Code ansehen

Wenn Sie den Apps Script-Code für diese Lösung ansehen möchten, klicken Sie auf Quellcode ansehen:

Quellcode ansehen

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>

Beitragende

Dieses Beispiel wird von Google mit Unterstützung von Google Developer Experts verwaltet.

Nächste Schritte