Rastrear visualizações e comentários dos vídeos do YouTube

Nível de programação: iniciante
Duração: 20 minutos
Tipo de projeto: automação com um acionador baseado em tempo

Objetivos

  • Entenda o que a solução faz.
  • Entenda o que os serviços do Apps Script fazem na solução.
  • Configure o script.
  • Execute o script.

Sobre esta solução

Essa solução acompanha o desempenho de vídeos públicos do YouTube, incluindo visualizações, marcações "Gostei" e comentários, em uma planilha do Planilhas Google. O gatilho verifica se há informações atualizadas todos os dias e envia um e-mail se os vídeos têm uma nova atividade de comentário para que você possa interagir com perguntas e comentários.

Captura de tela dos dados do YouTube em um arquivo das Planilhas Google

Como funciona

O script usa o serviço avançado do YouTube para receber detalhes e estatísticas do vídeo do YouTube referentes aos URLs dos vídeos listados na coluna Link do vídeo em cada planilha. Se o número de comentários de um vídeo listado aumentar, o script enviará uma notificação para o endereço de e-mail que leva o nome da planilha.

Serviços do Apps Script

Essa solução usa os seguintes serviços:

Pré-requisitos

Para usar essa amostra, você precisa dos seguintes pré-requisitos:

  • Uma Conta do Google (contas do Google Workspace podem exigir a aprovação do administrador).
  • Um navegador da Web com acesso à Internet.

Configurar o script

Criar o projeto do Apps Script

  1. Clique no botão a seguir para fazer uma cópia da planilha Rastrear visualizações e comentários de vídeos do YouTube. O projeto do Apps Script para esta solução está anexado à planilha.
    Fazer uma cópia
  2. Na planilha copiada, altere o nome da planilha Your_Email_Address para seu endereço de e-mail.
  3. Adicione os URLs dos vídeos do YouTube que você quer rastrear ou use os URLs fornecidos para testes. Os URLs precisam começar com o formato www.youtube.com/watch?v=.
  4. Clique em Extensões > Apps Script. Se o YouTube já estiver listado em Serviços, pule para as próximas duas etapas.
  5. Ao lado de Serviços, clique em Adicionar um serviço .
  6. Na lista, selecione API YouTube Data e clique em Adicionar.

Criar um gatilho

  1. No projeto do Apps Script, clique em Gatilhos > Adicionar gatilho.
  2. Em Escolha qual função será executada, selecione markVídeos.
  3. Em Selecionar origem do evento, escolha Baseado em tempo.
  4. Em Selecionar o tipo de gatilho baseado em tempo, escolha Timer diário.
  5. Em Selecionar hora do dia, escolha um horário.
  6. Quando solicitado, autorize o script. Se a tela de permissão OAuth mostrar o aviso Este app não foi verificado, continue selecionando Avançado > Acessar {Nome do projeto} (não seguro).

Executar o script

O acionador configurado executa o script uma vez por dia. Execute o script manualmente para testá-lo.

  1. No projeto do Apps Script, clique em Editor .
  2. No menu suspenso de funções, selecione markVideos.
  3. Clique em Executar.
  4. Volte para a planilha para analisar as informações que o script adicionou à planilha.
  5. Abra seu e-mail para analisar a mensagem com a lista de vídeos que têm mais de nenhum comentário. Quando o script for executado no futuro, ele enviará apenas um e-mail com vídeos cuja contagem de comentários aumentou desde a última execução.

Revisar o código

Para analisar o código do Apps Script para esta solução, clique em Ver código-fonte abaixo:

Ver o código-fonte

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

Esta amostra é mantida pelo Google com a ajuda de especialistas do Google Developers.

Próximas etapas