Realiza un seguimiento de las vistas y los comentarios de videos de YouTube

Nivel de programación: Principiante
Duración: 20 minutos
Tipo de proyecto: Automatización con un activador basado en el tiempo

Objetivos

  • Comprender qué hace la solución
  • Comprender qué hacen los servicios de Apps Script dentro de la solución
  • Configura la secuencia de comandos.
  • Ejecuta la secuencia de comandos.

Acerca de esta solución

Esta solución realiza un seguimiento del rendimiento de los videos públicos de YouTube, incluidas las vistas, los “me gusta” y los comentarios, en una hoja de cálculo de Hojas de cálculo de Google. El activador busca información actualizada todos los días y envía un correo electrónico si los videos tienen actividad de comentarios nueva para que puedas interactuar con las preguntas y los comentarios.

Captura de pantalla de los datos de YouTube en una hoja de cálculo de Google

Cómo funciona

La secuencia de comandos usa el servicio avanzado de YouTube para obtener detalles y estadísticas de los videos de YouTube de las URLs de video que aparecen en la columna Vínculo de video de cada hoja. Si aumenta la cantidad de comentarios de un video de la lista, la secuencia de comandos envía una notificación por correo electrónico a la dirección de correo electrónico que se usó para nombrar la hoja.

Servicios de Apps Script

En esta solución, se usan los siguientes servicios:

Requisitos previos

Para usar esta muestra, debes cumplir con los siguientes requisitos previos:

  • Una Cuenta de Google (es posible que las cuentas de Google Workspace requieran aprobación del administrador)
  • Un navegador web con acceso a Internet

Configura la secuencia de comandos

Crea el proyecto de Apps Script

  1. Haz clic en el siguiente botón para crear una copia de la hoja de cálculo Hacer un seguimiento de las vistas y los comentarios de los videos de YouTube. El proyecto de Apps Script para esta solución se adjunta a la hoja de cálculo.
    Crear una copia
  2. En la hoja de cálculo que copiaste, cambia el nombre de la hoja Your_Email_Address a tu dirección de correo electrónico.
  3. Agrega las URLs de los videos de YouTube de los que deseas hacer un seguimiento o usa las URLs proporcionadas para las pruebas. Las URLs deben comenzar con el formato www.youtube.com/watch?v=.
  4. Haz clic en Extensiones > Apps Script. Si YouTube ya aparece en la lista de Servicios, puedes avanzar al siguiente 2 pasos.
  5. Junto a Servicios, haz clic en Agregar un servicio .
  6. En la lista, selecciona YouTube Data API y haz clic en Agregar.

Crear un activador

  1. En el proyecto de Apps Script, haz clic en Activadores > Agregar activador.
  2. En Elige qué función ejecutar, selecciona markVideos.
  3. En Seleccionar la fuente del evento, selecciona Basado en el tiempo.
  4. En Seleccionar el tipo de activador basado en el tiempo, selecciona Temporizador por días.
  5. En Seleccionar la hora del día, elige la hora que prefieras.
  6. Cuando se te solicite, autoriza la secuencia de comandos. Si la pantalla de consentimiento de OAuth muestra la advertencia Esta app no está verificada, continúa seleccionando Avanzado > Ir a {nombre del proyecto} (no seguro).

Ejecuta la secuencia de comandos:

El activador que configuraste ejecuta la secuencia de comandos una vez al día. Puedes ejecutar la secuencia de comandos de forma manual para probarla.

  1. En el proyecto de Apps Script, haz clic en Editor .
  2. En el menú desplegable de funciones, selecciona markVideos.
  3. Haz clic en Ejecutar.
  4. Regresa a la hoja de cálculo para revisar la información que la secuencia de comandos agregó a la hoja.
  5. Abre el correo electrónico para revisar la lista de videos que tienen más de cero comentarios. Cuando se ejecute la secuencia de comandos en el futuro, solo enviará un correo electrónico con los videos cuyo recuento de comentarios aumentó desde la última vez que se ejecutó la secuencia de comandos.

Revisa el código

Para revisar el código de Apps Script de esta solución, haz clic en Ver código fuente a continuación:

Ver el código fuente

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>

Colaboradores

Google mantiene este ejemplo con la ayuda de expertos en desarrollo de Google.

Próximos pasos