借助 ONLYOFFICE 宏在电子表格中插入 Google 搜索结果

2022年08月30日作者: Alina

网络搜索已经成为我们生活之中必不可缺的一个部分,甚至已经成为了我们的日常生活。但是,如果我们想将搜索结果存储于别处,该怎么办呢?比如存储在电子表格中…这是一种非常便捷的数据操作方式。在本文中,我们将展示如何通过 ONLYOFFICE 宏来在电子表格中插入 Google 搜索结果。

借助 ONLYOFFICE 宏在电子表格中插入 Google 搜索结果

选择 Google Web Search API

API 的意思是“应用程序编程接口”。正是在这些接口之上,我们构建起了当今的互联网世界。API 无处不在。无论是天气预报应用,还是电话上的通讯工具。API 是 Web 应用程序用于同服务器进行通讯的协议。自不用说,获取 Google 搜索结果也是需要 API 的。

为方便起见,我们建议通过 Rapid API 平台来获取 Google Web Search API。Rapid API 平台是一个拥有数百万开发者用户、提供数千种 API 选项的平台。订阅方面则有 freefreemium 以及 paid 版本。每个 API 都带有相应的代码片段,可帮助您节省大量时间。

在成功注册 Rapid API 账号后,我们可以找找 Google Web Search API。此时有多个可选项。

Insert Google Search results into a spreadsheet with Onlyoffice macro

为了测试宏的效果,我们选择了这一 API。其提供了每月包含 300 次请求的 freemium 版本,足够我们大概了解宏的能力了。如果您需要更多请求,可选择不同的 API 或订阅付费版本。

注意!每个 API 都将为您提供唯一的访问密钥。您的宏只有在使用已订阅的 API 时才能正常工作。

设置 API 参数

在 API 页面中,我们可以看到能够用于搜索请求的各种参数。这里我们将不会更改 Rapid API、Request URL 以及 Header Parameters。这些是 API 与服务器进行互动时所必须的参数。Required Parameters 中包含我们的搜索请求。这里我们写入“ONLYOFFICE Editors”。

Insert Google Search results into a spreadsheet with ONLYOFFICE macro

同时您还能在请求中添加一些可选参数。在本例中,我们可指定需要检索的页面、结果数量(最大为 100,默认为 20)、搜索请求的位置、时间过滤条件以及国家。这里我们先使用默认的参数值。这样,检索到的数据中将包含从第一页开始的前 20 个英语结果,且不会使用时间过滤条件。

Insert Google Search results into a spreadsheet with Onlyoffice macro

现在我们需要选择一种用于发出 API 请求的语言。这里将选择在 JavaScript 中进行 XML/HTTP 请求。我们前往右侧面板,并在 Code Snippets 中选择 JavaScript > XML/HttpRequest

Insert Google Search results into a spreadsheet with Onlyoffice macro

在继续使用宏之前,我们来看看返回的数据。直接在页面中查看即可,只需点击 Test Endpoint 按钮。结果将展示在右侧面板中。

Insert Google Search results into a spreadsheet with Onlyoffice macro

API 请求返回了 2 个项目。我们需要的是其中的 results 数组。其中包含了需要被粘贴至电子表格中的搜索结果。如果我们多看几眼,就会发现每个搜索结果数组都有 titlelink 以及 snippet 元素。稍后,我们将仅获取 titlelink 元素,并将其插入到电子表格中。现在我们还是回到 Code Snippets 中去复制 XML/HTTP 请求。

在一列中插入两行

在这里的宏中,我们将对 titlelink 值进行组合,然后将其插入同一列中。

我们打开 ONLYOFFICE 编辑器,新建一个宏并将上方复制的 XML/HTTP 请求粘贴进去。接着前往 readystatechange 事件后开始的 IF 语句并移除包含 console.log 方法的一行代码。我们不需要这个方法,这里会添加我们自己的代码。

首先我们需要将从请求中获取的数据转换为 JSON 格式。为了实现这一目标,我们在这里使用 JSON.parse 方法,并将结果存储在 oData 变量中:

(function()
{
   const data = null;

  const xhr = new XMLHttpRequest();
  xhr.withCredentials = true;

  xhr.addEventListener("readystatechange", function () {
    if (this.readyState === this.DONE) {
      const oData = JSON.parse(xhr.responseText);

然后我们开始筛选数据。首先,获取 results 数组并将其存储在单独的变量中:

const { results } =  oData;

现在我们可访问此数组中的 titlelink 元素。接下来的步骤是使用 map 方法将 titlelink 值整合到一起,并将其存储在 dataComb 变量中。这样其就会成为 1 行,并在稍后被插入至电子表格单元格中:

 const dataComb = results.map((item) => ({
      title: item.title,
      link: item.url,
    }));

现在我们的 dataComb 变量中就已经有了所需元素。每个元素中都包含 titlelink 值。我们现在的目标是将其插入单元格中。这里我们需要使用 for loop 语句。该语句会遍历变量中的各个元素并将其转换为字符串,然后分别插入到相应的单元格中:

 let nRow = 0;
      for (let i = 0; i < dataComb.length; i++) {
       const text = JSON.stringify(dataComb[i]); 
        var oWorksheet = Api.GetActiveSheet();
  oWorksheet.GetRangeByNumber(nRow, 0).SetValue(text);
  oWorksheet.GetRangeByNumber(nRow, 0).AutoFit(false, true);
  nRow++;
      }

首先,我们创建 nRow 变量。然后将其用作索引,以在 GetRangeByNumber 方法中来选择行。我们会对 nRow 变量进行递增,这样在迭代时会自动切换至下一行。这里对 dataComb 中的变量进行遍历、将其转换为字符串并使用 SetValue 方法将值插入所选行。为了实现这一目标,我们会使用在参数中声明的 i 变量作为索引。同时还使用了 AutoFit 方法来调整单元格尺寸。

完整的宏代码如下:

(function()
{
   const data = null;

  const xhr = new XMLHttpRequest();
  xhr.withCredentials = true;

  xhr.addEventListener("readystatechange", function () {
    if (this.readyState === this.DONE) {
      const oData = JSON.parse(xhr.responseText);
      const { results } =  oData;
      const dataComb = results.map((item) => ({
      title: item.title,
      link: item.url,
    }));
    let nRow = 0;
      for (let i = 0; i < dataComb.length; i++) {
       const text = JSON.stringify(dataComb[i]); 
        var oWorksheet = Api.GetActiveSheet();
  oWorksheet.GetRangeByNumber(nRow, 0).SetValue(text);
  oWorksheet.GetRangeByNumber(nRow, 0).AutoFit(false, true);
  nRow++;
      }
    }
  });

  xhr.open("GET", "https://google-search26.p.rapidapi.com/search?q=Onlyoffice%20editors&hl=en&tbs=qdr%3Aa");
  xhr.setRequestHeader("X-RapidAPI-Key", "3a059ddf9bmshc40ba13a409d0abp12b76bjsn8fd6f316f49b");
  xhr.setRequestHeader("X-RapidAPI-Host", "google-search26.p.rapidapi.com");

  xhr.send(data);
})();

现在让我们来运行一下宏,看看效果如何:

Insert Google Search results into a spreadsheet with Onlyoffice macro

在单独的列中插入行

在我们的宏变体中,titlelink 值将被插入两个不同的列。

为了实现这一目标,我们会使用 map 方法来将 titlelink 值保存在两个变量中:

 const { results } =  oData;
    
      const title = results.map((item) => item.title);
      const link = results.map((item) => item.link);

现在我们来创建 2 个循环。一个用于遍历 title 变量并将其中的值插入首行:

   let nRowTitle = 0;
      for (let i = 0; i < title.length; i++) {
       const text = JSON.stringify(title[i]); 
          var oWorksheet = Api.GetActiveSheet();
  oWorksheet.GetRangeByNumber(nRowTitle, 0).SetValue(text);
  oWorksheet.GetRangeByNumber(nRowTitle, 0).AutoFit(false, true);
  nRowTitle++;
      }

一个用于遍历 link 变量并将其中的值插入第二行:

 let nRowLink = 0;
       for (let i = 0; i < link.length; i++) {
       const text = JSON.stringify(link[i]); 
  oWorksheet.GetRangeByNumber(nRowLink, 1).SetValue(text);
  oWorksheet.GetRangeByNumber(nRowLink, 1).AutoFit(false, true);
  nRowLink++;
       }

注意,这里我们将 GetRangeByNumber 方法的第二个参数更改成了 1。这一参数与列的位置相对应。因此,link 值将插入至第二列中。

完整的宏代码如下:

(function()
{
    const data = null;

  const xhr = new XMLHttpRequest();
  xhr.withCredentials = true;

  xhr.addEventListener("readystatechange", function () {
    if (this.readyState === this.DONE) {
      const oData = JSON.parse(xhr.responseText);
      const { results } =  oData;
      const title = results.map((item) => item.title);
      const link = results.map((item) => item.link);
    let nRowTitle = 0;
      for (let i = 0; i < title.length; i++) {
       const text = JSON.stringify(title[i]); 
          var oWorksheet = Api.GetActiveSheet();
  oWorksheet.GetRangeByNumber(nRowTitle, 0).SetValue(text);
  oWorksheet.GetRangeByNumber(nRowTitle, 0).AutoFit(false, true);
  nRowTitle++;
      }
     let nRowLink = 0;
       for (let i = 0; i < link.length; i++) {
       const text = JSON.stringify(link[i]); 
  oWorksheet.GetRangeByNumber(nRowLink, 1).SetValue(text);
  oWorksheet.GetRangeByNumber(nRowLink, 1).AutoFit(false, true);
  nRowLink++;
       }
    }
  });

xhr.open("GET", "https://google-search26.p.rapidapi.com/search?q=Onlyoffice%20editors&hl=en&tbs=qdr%3Aa");
xhr.setRequestHeader("X-RapidAPI-Key", "3a059ddf9bmshc40ba13a409d0abp12b76bjsn8fd6f316f49b");
xhr.setRequestHeader("X-RapidAPI-Host", "google-search26.p.rapidapi.com");

xhr.send(data);
})();

现在我们来运行一下这个宏:

Insert Google Search results into a spreadsheet with Onlyoffice macro

希望这个宏能帮助您以更便捷的方式实现日常任务与数据结构化方面的自动化工作。这只是 ONLYOFFICE 宏功能的一小部分。

我们的宏功能是基于 JavaScript 的,这就确保了其灵活性,您可轻松根据自己的需求进行定制。我们强烈建议您上手试试,创建自己的宏。欢迎随时提问,也欢迎与我们分享您的想法和宏。我们已做好与您探讨和合作的准备。祝您的探索之旅一帆风顺!