Suivre les vues et les commentaires des vidéos YouTube

Niveau de programmation : Débutant
Durée : 20 minutes
Type de projet : Automatisation avec un déclencheur temporel

Objectifs

  • Comprendre le fonctionnement de la solution.
  • Comprendre le rôle des services Google Apps Script dans la solution.
  • Configurer le script.
  • Exécuter le script.

À propos de cette solution

Cette solution suit les performances des vidéos YouTube publiques, y compris les vues, les "J'aime" et les commentaires, dans une feuille de calcul Google Sheets. Le déclencheur vérifie les informations mises à jour chaque jour et envoie un message Gmail si les vidéos ont de nouveaux commentaires. Vous pouvez ainsi répondre aux questions et aux commentaires.

Feuille de calcul Google Sheets affichant les données de suivi des vidéos YouTube

Fonctionnement

Le script utilise le service YouTube avancé pour obtenir les détails et les statistiques des vidéos YouTube pour les URL de vidéos listées dans la colonne Lien vidéo de chaque feuille. Si le nombre de commentaires pour une vidéo listée a augmenté, le script envoie une notification par e-mail à l'adresse e-mail qui donne son nom à la feuille.

Services Apps Script

Cette solution utilise les services suivants :

Prérequis

Pour utiliser cet exemple, vous devez remplir les conditions préalables suivantes :

  • Un compte Google (l'approbation de l'administrateur peut être nécessaire pour les comptes Google Workspace)
  • Un navigateur Web avec accès à Internet

Configurer le script

Pour configurer ce script, procédez comme suit :

Créer le projet Apps Script

  1. Pour créer une copie de la feuille de calcul Suivre les vues et les commentaires des vidéos YouTube, cliquez sur le bouton suivant : Créer une copie Le projet Apps Script de cette solution est joint à la feuille de calcul.
  2. Dans la feuille de calcul copiée, remplacez le nom de la feuille Your_Email_Address par votre adresse e-mail.
  3. Ajoutez les URL des vidéos YouTube que vous souhaitez suivre ou utilisez les URL fournies pour les tests. Les URL doivent commencer par le format www.youtube.com/watch?v=.
  4. Cliquez sur Extensions > Apps Script. Si YouTube est déjà listé sous Services, vous pouvez passer aux deux étapes suivantes.
  5. À côté de Services, cliquez sur Ajouter un service .
  6. Dans la liste, sélectionnez API YouTube Data , puis cliquez sur Ajouter.

Créer un déclencheur

  1. Dans le projet Apps Script, cliquez sur Déclencheurs > Ajouter un déclencheur.
  2. Dans le champ Choisir la fonction à exécuter, sélectionnez markVideos.
  3. Dans le champ Sélectionner la source de l'événement, sélectionnez Déclencheur horaire.
  4. Dans le champ Sélectionner le type de déclencheur temporel, sélectionnez Intervalle en jours.
  5. Dans le champ Sélectionner l'heure de la journée, choisissez l'heure de votre choix.
  6. Lorsque vous y êtes invité, autorisez les scripts. <<../_snippets/oauth.md>>

Exécuter le script

Le déclencheur que vous avez configuré exécute le script une fois par jour. Vous pouvez exécuter le script manuellement pour le tester.

  1. Dans le projet Apps Script, cliquez sur Éditeur .
  2. Dans la liste déroulante des fonctions, sélectionnez markVideos.
  3. Cliquez sur Exécuter.
  4. Revenez à la feuille de calcul pour examiner les informations que le script a ajoutées à la feuille.
  5. Ouvrez votre e-mail pour examiner l'e-mail contenant la liste des vidéos qui ont plus de zéro commentaire. Lorsque le script s'exécutera à l'avenir, il n'enverra qu'un e-mail contenant les vidéos dont le nombre de commentaires a augmenté depuis la dernière exécution du script.

Examiner le code

Pour examiner le code Apps Script de cette solution, cliquez sur Afficher le code source :

Afficher le code source

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>

Contributeurs

Cet exemple est géré par Google avec l'aide des Experts Google Developers.

Étapes suivantes