如何使用宏将 YouTube 搜索结果插入电子表格

2023年11月22日作者: Mona

该宏将 YouTube 搜索结果集成到 ONLYOFFICE 电子表格编辑器中。通过嵌入 YouTube 搜索功能,它提供了一种利用多媒体内容丰富电子表格的便捷解决方案。让我们看看如何构建宏。

关于API

对于这个宏,我们正在集成 RapidAPI 的功能来简化我们的数据检索过程。使用 XMLHttpRequest 功能,我们可以使用 RapidAPI 提供的代码片段定义目标 URL 并设置标头。我们决定使用 Marin Delija 的 YouTube 搜索结果 API 参考。这是一个理想的选择,因为基本计划是免费的,每天可以处理 100 个请求。此外,如果我们需要增加您的请求,还可以提供付费计划。这是一个平衡每个人的需求和预算的实用选择!

如果您已经是 RapidAPI 社区的一员,只需点击上面的链接并订阅 API 参考即可。对于新用户,注册过程很简单 – 只需提供您的电子邮件地址,然后就可以开始了!

构建宏

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

这些行检索 ONLYOFFICE 电子表格中的活动工作表并将其分配给变量 oWorksheet。我们还初始化一个空数组查询,它将存储要搜索的查询。

// 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);
    }
  }

该 for 循环遍历单元格 A1 到 A3,获取值。如果值存在且不为空,则会将其附加到查询数组中。

  // 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);
    }
  }

乍一看,填充函数可能看起来很复杂,但它并不复杂。populate 函数采用三个参数:count、title 和 link。根据计数,它会用结果填充电子表格中的相应单元格。它有两个 for 循环;一个帮助填充标题,而另一个 for 循环填充标题旁边的链接。

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

在这一部分中,我们定义了一个函数 reloadCellValues,它使用 setTimeout 在 5 秒延迟后刷新电子表格中的所有单元格值。

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);
    };

在这里,我们使用 for 循环迭代查询数组中存储的每个查询,向 RapidAPI 发出后续请求。我们在 url 变量中定义一个动态 URL。常量 xhr 使用 XMLHttpRequest 对象初始化。

通过 xhr.onload,我们为 XMLHttpRequest 成功完成其请求定义了一个事件处理程序。

在 onload 函数中,我们检索数据,然后解构对象以提取必要的值。

然后,我们使用 map 方法迭代所有标题和链接,将它们存储在两个数组中。然后,这些数组与计数一起传递给填充函数。

 // 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);
  }

接下来,我们定义 XMLHttpRequest 的目标 URL 并配置请求的标头。该代码段是由 RapidAPI 从 XMLHttpRequest 提供的代码片段中提取的。您需要将“YourApiKey”替换为您的个人 API 密钥,该密钥可以在 RapidAPI 中找到。

reloadCellValues();

最终,我们调用之前定义的 reloadCellValues 方法。

完整的宏代码

以下是宏的完整代码。

(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();
})();

让我们看看宏的实际效果。

我们希望该宏已被证明是有用的,可以将 YouTube 搜索结果数据直接无缝集成到您的电子表格中。

不要错过利用 ONLYOFFICE API 强大功能的机会。我们丰富的 API 方法库是将您的想法变为现实的关键。如果您有任何问题或创新概念,欢迎与我们分享。您的意见非常有价值,我们很高兴能够与您合作。祝您的探索之路好运!