Como inserir resultados de pesquisa do YouTube em sua planilha usando macros

22 novembro 2023By Klaibson

Esta macro integra os resultados de pesquisa do YouTube em ONLYOFFICE Editor de Planilhas. Ao incorporar a funcionalidade de pesquisa do YouTube, oferece uma solução conveniente para enriquecer planilhas com conteúdo multimídia. Vamos ver como construir a macro.

Como inserir resultados de pesquisa do YouTube em sua planilha usando macros

Sobre a API

Para esta macro, estamos integrando o poder do RapidAPI para facilitar nosso processo de recuperação de dados. Usando o recurso XMLHttpRequest, definimos o URL de destino e definimos cabeçalhos usando os trechos de código fornecidos pelo RapidAPI. Decidimos ir com Referência da API de resultados de pesquisa do YouTube de Marin Delija. É a escolha ideal porque o plano básico é gratuito, dando-nos luz verde para 100 solicitações por dia. Além disso, existem planos pagos disponíveis se precisarmos aumentar suas solicitações. É uma escolha prática que equilibra as necessidades e o orçamento de todos!

Se você já faz parte da comunidade RapidAPI, basta clicar no link acima e assinar a referência da API. Para novos usuários, o processo de inscrição é simples – basta fornecer seu endereço de e-mail e pronto!

Construindo a macro

  const data = null;
  const oWorksheet = Api.GetActiveSheet();
  let query = []; // empty query array to store the queries

Essas linhas recuperam a planilha ativa na planilha do ONLYOFFICE e a atribuem à variável oWorksheet. Também inicializamos uma consulta de array vazia, que armazenará as consultas a serem pesquisadas.

// Takes the queries from the cells A1, A2, and A3.
  for (let i = 1; i < 4; i++) {
    const value = String(oWorksheet.GetRange("A" + i).GetValue());
    if (value !== null && value.length !== 0) {
      query.push(value);
    }
  }

Este for loop percorre as células A1 a A3, capturando os valores. Se um valor existir e não estiver vazio, ele será anexado à matriz de consulta.

  // polpulates the cells with the titles and links from the queries
  function populate(count, title, link) {
    let nRowTitle = 9;
    for (let j = 0; j < title.length; j++) {
      let passedTitleCount = count * 3;
      const text = JSON.stringify(title[j]);
      const textWithoutQuotes = text.replace(/"/g, "");
      oWorksheet.GetRangeByNumber(nRowTitle - 1, passedTitleCount).SetValue(query[count]);
      oWorksheet.GetRangeByNumber(nRowTitle - 1, passedTitleCount).SetAlignHorizontal("center");
      oWorksheet
        .GetRangeByNumber(nRowTitle + j, passedTitleCount)
        .SetValue(textWithoutQuotes);
      oWorksheet
        .GetRangeByNumber(nRowTitle + j, passedTitleCount)
        .AutoFit(false, true);
    }
    let nRowLink = 9;
    for (let h = 0; h < link.length; h++) {
      let passedLinkCount = count * 3 + 1;
      const text = JSON.stringify(link[h]);
      const textWithoutQuotes = text.replace(/"/g, "");
      oWorksheet
        .GetRangeByNumber(nRowLink + h, passedLinkCount)
        .SetValue(textWithoutQuotes);
      oWorksheet
        .GetRangeByNumber(nRowLink + h, passedLinkCount)
        .AutoFit(false, true);
    }
  }

A função populate pode parecer complicada à primeira vista, mas não é complicada. A função de preenchimento usa três parâmetros: contagem, título e link. Com base na contagem, ele preenche as células apropriadas na planilha com os resultados. Possui dois loops for; um ajuda a preencher os títulos, enquanto o outro for loop preenche os links ao lado dos títulos.

// refreshes the values in all the cells of the spreadsheet
  function reloadCellValues() {
    let reload = setTimeout(function () {
      Api.asc_calculate(Asc.c_oAscCalculateType.All);
    }, 5000);
  }

Nesta parte, definimos uma função reloadCellValues que usa setTimeout para atualizar todos os valores de células na planilha após um atraso de 5 segundos.

for (let count = 0; count < query.length; count++) {
    const url = `https://youtube-search-results.p.rapidapi.com/youtube-search/?q=${query[count]}`;
    const xhr = new XMLHttpRequest();
    xhr.onload = function () {
      const apiData = JSON.parse(this.response);
      const { videos: results } = apiData;
      const title = results.map((i) => i.title);
      const link = results.map((i) => i.link);
      populate(count, title, link);
    };

Aqui, usamos um loop for para iterar cada consulta armazenada no array de consultas, fazendo solicitações subsequentes ao RapidAPI. Definimos um URL dinâmico na variável url. Uma constante xhr é inicializada com o objeto XMLHttpRequest.

Com xhr.onload, definimos um manipulador de eventos para quando o XMLHttpRequest tiver concluído sua solicitação com êxito.

Dentro da função onload, recuperamos os dados e depois desestruturamos o objeto para extrair os valores necessários.

Em seguida, usamos o método map para iterar todos os títulos e links, armazenando-os em dois arrays. Essas matrizes, junto com a contagem, são então passadas para a função populate.

 // XMLHttpRequest Code Snippets copied from RapidAPI
    xhr.open("GET", url);
    xhr.setRequestHeader(
      "X-RapidAPI-Key",
      YourApiKey
    );
    xhr.setRequestHeader(
      "X-RapidAPI-Host",
      "youtube-search-results.p.rapidapi.com"
    );
    xhr.send(data);
  }

A seguir, definimos a URL de destino para XMLHttpRequest e configuramos os cabeçalhos da solicitação. Este segmento de código é extraído dos trechos de código fornecidos pelo RapidAPI para um XMLHttpRequest. Você precisará substituir “YourApiKey” pela sua chave de API pessoal, que pode ser encontrada no RapidAPI.

reloadCellValues();

Por fim, invocamos o método reloadCellValues que definimos anteriormente.

O código de macro completo

Aqui está todo o código da macro.

(function () {
  const data = null;

  const oWorksheet = Api.GetActiveSheet();

  let query = []; // empty query array to store the queries

  // Takes the queries from the cells A1, A2, and A3.
  for (let i = 1; i < 4; i++) {
    const value = String(oWorksheet.GetRange("A" + i).GetValue());
    if (value !== null && value.length !== 0) {
      query.push(value);
    }
  }

  // polpulates the cells with the titles and links from the queries
  function populate(count, title, link) {
    let nRowTitle = 9;
    for (let j = 0; j < title.length; j++) {
      let passedTitleCount = count * 3;
      const text = JSON.stringify(title[j]);
      const textWithoutQuotes = text.replace(/"/g, "");
      oWorksheet
        .GetRangeByNumber(nRowTitle - 1, passedTitleCount)
        .SetValue(query[count]);
      oWorksheet
        .GetRangeByNumber(nRowTitle - 1, passedTitleCount)
        .SetAlignHorizontal("center");
      oWorksheet
        .GetRangeByNumber(nRowTitle + j, passedTitleCount)
        .SetValue(textWithoutQuotes);
      oWorksheet
        .GetRangeByNumber(nRowTitle + j, passedTitleCount)
        .AutoFit(false, true);
    }

    let nRowLink = 9;
    for (let h = 0; h < link.length; h++) {
      let passedLinkCount = count * 3 + 1;
      const text = JSON.stringify(link[h]);
      const textWithoutQuotes = text.replace(/"/g, "");
      oWorksheet
        .GetRangeByNumber(nRowLink + h, passedLinkCount)
        .SetValue(textWithoutQuotes);
      oWorksheet
        .GetRangeByNumber(nRowLink + h, passedLinkCount)
        .AutoFit(false, true);
    }
  }

  // refreshes the values in all the cells of the spreadsheet
  function reloadCellValues() {
    let reload = setTimeout(function () {
      Api.asc_calculate(Asc.c_oAscCalculateType.All);
    }, 5000);
  }

  // for loop for multiple queries
  for (let count = 0; count < query.length; count++) {
    const url = `https://youtube-search-results.p.rapidapi.com/youtube-search/?q=${query[count]}`;
    const xhr = new XMLHttpRequest();
    xhr.onload = function () {
      const apiData = JSON.parse(this.response);
      const { videos: results } = apiData;
      const title = results.map((i) => i.title);
      const link = results.map((i) => i.link);
      populate(count, title, link);
    };

    // XMLHttpRequest Code Snippets copied from RapidAPI
    xhr.open("GET", url);
    xhr.setRequestHeader("X-RapidAPI-Key", "YOUR API KEY GOES HERE");
    xhr.setRequestHeader(
      "X-RapidAPI-Host",
      "youtube-search-results.p.rapidapi.com"
    );
    xhr.send(data);
  }

  reloadCellValues();
})();

Vamos ver a macro em ação.

Esperamos que a macro tenha se mostrado útil, integrando perfeitamente os dados dos resultados de pesquisa do YouTube diretamente em sua planilha.

Não perca a chance de aproveitar o poder da API ONLYOFFICE. Nossa extensa biblioteca de métodos API é a chave para transformar suas ideias em realidade. Se você tiver alguma dúvida ou conceitos inovadores, encorajamos você a compartilhar conosco. Sua contribuição é altamente valorizada e estamos entusiasmados com a possibilidade de colaborar com você. Boa sorte em seus empreendimentos exploratórios!