Cómo insertar los resultados de búsqueda de YouTube en tu hoja de cálculo usando macros

22 noviembre 2023By Sergey

Esta macro integra los resultados de búsqueda de YouTube en el Editor de hojas de cálculo ONLYOFFICE. Al integrar la funcionalidad de búsqueda en YouTube, ofrece una solución conveniente para enriquecer hojas de cálculo con contenido multimedia. Vamos a ver cómo crear la macro.

Cómo insertar los resultados de búsqueda de YouTube en tu hoja de cálculo usando macros

Acerca de la API

Para esta macro, estamos integrando el poder de RapidAPI para facilitar el proceso de recuperación de datos. Utilizando la función XMLHttpRequest, definimos la URL de destino y establecemos los encabezados utilizando los fragmentos de código proporcionados por RapidAPI. Decidimos utilizar la referencia YouTube Search Results API de Marin Delija. Es una opción ideal porque el plan básico es gratuito y nos da luz verde para 100 solicitudes cada día. Además, hay planes de pago disponibles si necesitamos aumentar el número de solicitudes. Es una opción práctica que equilibra las necesidades y el presupuesto de todos.

Si ya formas parte de la comunidad RapidAPI, solo tienes que hacer clic en el enlace anterior y suscribirte a la referencia API. Para los nuevos usuarios, el proceso de registro es sencillo: basta con indicar la dirección de correo electrónico y listo.

Creación de la macro

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

Estas líneas recuperan la hoja activa en la hoja de cálculo ONLYOFFICE y la asignan a la variable oWorksheet. También inicializamos una matriz vacía query que almacenará las consultas a buscar.

// 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 bucle for pasa por las celdas A1 a A3, obteniendo los valores. Si existe un valor y no está vacío, se añade a la 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);
    }
  }

La función populate puede parecer demasiado abrumadora al principio, pero no es complicada. La función populate toma tres parámetros: count, title y link. Basándose en el count, rellena las celdas apropiadas de la hoja de cálculo con los resultados. Tiene dos bucles for; uno ayuda a rellenar los títulos, mientras que el otro rellena los enlaces junto a los 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);
  }

En esta sección definimos una función reloadCellValues que utiliza setTimeout para actualizar todos los valores de las celdas de la hoja de cálculo tras un retardo 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);
    };

Aquí usamos un bucle for para iterar sobre cada consulta almacenada en el array de consultas, haciendo solicitudes subsecuentes a RapidAPI. Definimos una URL dinámica en la variable url. Se inicializa una constante xhr con el objeto XMLHttpRequest.

Con xhr.onload, definimos un controlador de eventos que indica cuando el XMLHttpRequest ha completado con éxito su solicitud.

Dentro de la función onload, recuperamos los datos y luego desestructuramos el objeto para extraer los valores necesarios.

A continuación, utilizamos el método map para recorrer todos los títulos y enlaces, almacenándolos en dos matrices. Estas matrices, junto con el count, se pasan a la función 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 continuación, definimos la URL de destino para el XMLHttpRequest y configuramos los encabezados para la solicitud. Este fragmento de código está extraído de los fragmentos de código proporcionados por RapidAPI para una XMLHttpRequest. Necesitarás reemplazar “YourApiKey” con tu clave personal de API que puedes encontrar en RapidAPI.

reloadCellValues();

Por último, invocamos el método reloadCellValues que definimos anteriormente.

El código completo de la macro

Aquí está el código completo de la 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 a ver la macro en acción.

Esperamos que la macro te haya resultado útil, integrando a la perfección los datos de resultados de búsqueda de YouTube directamente en tu hoja de cálculo.

No pierdas la oportunidad de aprovechar el poder de la API de ONLYOFFICE. Nuestra amplia biblioteca de métodos API es tu clave para transformar tus ideas en realidad. Si tienes alguna pregunta o concepto innovador, te animamos a que lo compartas con nosotros. Tu contribución es muy valiosa, y estamos entusiasmados con la posibilidad de colaborar contigo. Te deseamos mucha suerte en tus esfuerzos exploratorios.