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

Objectifs

  • Comprendre ce que la solution fait
  • Comprendre ce que font les 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 recherche des informations à jour chaque jour et envoie un e-mail si de nouveaux commentaires sont publiés sur vos vidéos afin que vous puissiez interagir avec les questions et les 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 les détails et les statistiques des vidéos YouTube pour les URL de vidéo listées dans la colonne Lien vidéo de chaque feuille. Si le nombre de commentaires d'une vidéo listée a augmenté, le script envoie une notification par e-mail à l'adresse e-mail à laquelle la feuille est associée.

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 créer une copie de la feuille de calcul Suivre les vues et les commentaires des vidéos YouTube. Le projet Apps Script de 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 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 YouTube Data API (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. Sous Sélectionnez la source de l'événement, sélectionnez Déclencheur horaire.
  4. Dans Sélectionnez le type de déclencheur temporel, sélectionnez Intervalle en jours.
  5. Dans 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 d'autorisation OAuth affiche l'avertissement Cette application n'est pas validée, sélectionnez Avancé > Accéder à {Nom du projet} (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 a ajoutées à la feuille.
  5. Ouvrez votre e-mail pour consulter la liste des vidéos qui comportent au moins un 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 consulter 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 exemple est géré par Google avec l'aide des experts Google pour les développeurs.

Étapes suivantes