无法在特定单元格数据上运行自定义搜索功能以显示HTML边栏

时间:2019-07-01 22:32:55

标签: google-apps-script google-sheets google-custom-search

我正在Google表格中设置侧边栏,以显示行中的信息,以便我的团队更好地查看某些数据。通过Mogsdad的一些答案(巨大的道具),我能够设置侧边栏HTML,并显示功能,该功能使用选定行中的任何信息来更新DOM。我正在尝试通过在行范围内的特定单元格(字符串)上运行自定义搜索并向DOM中添加一个元素来显示前5个Google搜索结果的方式来扩展此内容;但是,我很难指向该特定单元格(实际上是数组中的列)中的字符串值,要在我的自定义搜索函数中运行该字符串值,并获得向HTML添加元素以附加结果的函数。

此用例的灵感来自Grant Timmerman's Apps Script demo at Angular Connect 2018,他用有关事件发言人的信息更新侧边栏,并使用来自特定单元格的搜索字符串从YouTube中提取视频。在下面的代码中,您将看到我从Mogsdad的sheet polling technique中学到了很多东西,以及他们关于使用Google的API密钥协议建立自定义搜索引擎的演练。

这是我的.gs设置:

/**
*This function creates the sidebar in Sheets' UI based on HTML I set up *separately.
*/
function checkUpdates() {
  var ui = HtmlService.createTemplateFromFile('CheckSidebar')
      .evaluate()
      .setSandboxMode(HtmlService.SandboxMode.IFRAME)
      .setTitle('Recent Sheet Updates');
  SpreadsheetApp.getUi().showSidebar(ui);
};

/**
 * Returns the active row.
 * All based on Mogsdad's sheet polling function from 2015.
 */
function getRecord() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var headers = data[0];
  var rowNum = sheet.getActiveCell().getRow();
  if (rowNum > data.length) return [];
  var record = [];
  for (var col=0;col<headers.length;col++) {
    var cellval = data[rowNum-1][col];
 // Here I tried to set another variable to data[rowNum-1][2] to get some        //specific data from column #3
    Logger.log(cellval);
    record.push({ heading: headers[col],cellval: cellval });

  }
  return record;
}

在单独的编辑器选项卡中,我设置了搜索功能,并且基本上也遵循Mogsdad的说明:

function SearchFetch(query) {

  var urlTemplate = "https://www.googleapis.com/customsearch/v1?key=%KEY%&cx=%CX%&q=%Q%";
  var ApiKey = "custom API Key";
  var searchEngineID = "ID for the search engine";

  var url = urlTemplate
    .replace("%KEY%", encodeURIComponent(ApiKey))
    .replace("%CX%", encodeURIComponent(searchEngineID))
    .replace("%Q%", encodeURIComponent(query));

  var params = {
    muteExceptions: true
  };

  Logger.log(UrlFetchApp.getRequest(url, params));
  var response = UrlFetchApp.fetch(url, params);
  var respCode = response.getResponseCode();

  if (respCode !== 200) {
    throw new Error ("Error " +respCode+ " " + response.getContentText());
  }
  else {
    var result = JSON.parse(response.getContentText());
    Logger.log("Obtained %s search results in %s seconds.",
               result.searchInformation.formattedTotalResults,
               result.searchInformation.formattedSearchTime);
  return result;

最后,我在HTML的标签之间具有一个函数,该函数从getRecord()生成的数组中获取值并将它们转储到类ID为“ floatypar”的DOM元素中(自然地看起来很花哨的段落)。这里有很多Mogsdad的标记:

 function showRecord(record) {
    if (record.length) {
      for (var i = 0; i < record.length; i++) {
        // build field name on the fly, formatted field-1234
        var str = '' + i;
        var fieldId = 'field-' + ('0000' + str).substring(str.length)

        // If this field # doesn't already exist on the page, create it
        if (!$('#'+fieldId).length) {
          var newField = $($.parseHTML('<div id="'+fieldId+'"></div>'));
          $('.floatypar').append(newField);
        }

        // Replace content of the field div with new record
        $('#'+fieldId).replaceWith('<div id="'+fieldId+'" class="floatypar">' +record[i].cellval + '</div>');

      }
    }

    //Setup the next poll
    poll();
  }

运行此命令时,侧边栏会在侧边栏中显示其各自div中行中每个单元格的值。但是,我不知道将值从第3列传递到搜索引擎,并在其自己的侧边栏div中显示结果。谁能引导我正确的方向?无论如何,请务必给莫格斯达提供道具!

0 个答案:

没有答案