Suivre les vues et les commentaires des vidéos YouTube

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

Objectifs

  • Comprendre ce que fait la solution.
  • Découvrez 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 sont mises à jour et envoie un e-mail si les vidéos comportent de nouveaux commentaires afin que vous puissiez répondre aux questions et aux commentaires.

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

Comment ça marche ?

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

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 (les comptes Google Workspace peuvent nécessiter l'approbation d'un administrateur)
  • Un navigateur Web avec accès à Internet.

Configurer le script

Créer le projet Apps Script

  1. Cliquez sur le bouton suivant pour créer une copie de la feuille de calcul Suivre les vues et les commentaires des vidéos YouTube. Le projet Apps Script correspondant à cette solution est joint à la feuille de calcul.
    Créer une copie
  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 dont vous souhaitez effectuer le suivi ou utilisez les URL fournies à des fins de test. Les URL doivent commencer au format www.youtube.com/watch?v=.
  4. Cliquez sur Extensions > Apps Script. Si YouTube figure déjà dans la liste 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 Sélectionner la fonction à exécuter, sélectionnez markVideos.
  3. Pour Sélectionner une source d'événement, choisissez En fonction du temps.
  4. Pour Sélectionnez un type de déclencheur temporel, sélectionnez Minuteur quotidien.
  5. Dans Sélectionner une heure de la journée, choisissez l'heure qui vous convient le mieux.
  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, continuez en sélectionnant Paramètres avancés > Accéder à {Project Name} (non sécurisé).

Exécuter le script

Le déclencheur que vous configurez 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 votre e-mail pour consulter la liste des vidéos n'ayant pas reçu de commentaires. Lorsque le script s'exécute ultérieurement, il n'envoie 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() {
  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>

Contributeurs

Cet échantillon est géré par Google avec l'aide d'Experts Google Developers.

Étapes suivantes