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 basé sur le temps

Objectifs

  • Comprendre ce que fait la solution
  • Comprendre le rôle des services Apps Script dans la solution
  • Configurez le script.
  • Exécutez le script.

À propos de cette solution

Cette solution permet de suivre 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 chaque jour si des informations ont été mises à jour et envoie un message Gmail si de nouveaux commentaires ont été ajoutés à des vidéos. Vous pouvez ainsi répondre aux questions et aux commentaires.

Capture d'écran des données YouTube dans une feuille de calcul Google Sheets

Fonctionnement

Le script utilise le service YouTube avancé pour obtenir des informations et des statistiques sur les vidéos YouTube dont les URL sont 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 porte le nom de 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

Créer le projet Apps Script

  1. Cliquez sur le bouton suivant pour copier la feuille de calcul Suivre les vues et les commentaires des vidéos YouTube. Le projet Apps Script pour cette solution est associé à la feuille de calcul.
    Créer une copie
  2. Dans la feuille de calcul que vous avez 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 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. Pour Choisir la fonction à exécuter, sélectionnez markVideos.
  3. Dans le champ Sélectionnez la source de l'événement, sélectionnez Déclencheur horaire.
  4. Pour Sélectionnez le type de déclencheur temporel, sélectionnez Intervalle en jours.
  5. Pour Sélectionner une heure de la journée, choisissez l'heure de votre choix.
  6. Lorsque vous y êtes invité, autorisez le script. Si l'écran de consentement OAuth affiche l'avertissement Cette application n'est pas validée, poursuivez en sélectionnant Avancé > Accéder à {Nom du projet} (non sécurisé).

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 le menu déroulant des fonctions, sélectionnez markVideos.
  3. Cliquez sur Exécuter.
  4. Revenez à la feuille de calcul pour examiner les informations que le script y a ajoutées.
  5. Ouvrez l'e-mail contenant la liste des vidéos qui comportent au moins un commentaire. Lorsque le script s'exécutera à l'avenir, il n'enverra un e-mail qu'avec 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 ci-dessous :

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 Google Developer Experts.

Étapes suivantes