Возникли проблемы при запуске пользовательской функции поиска по определенным данным ячейки для отображения боковой панели HTML - PullRequest
1 голос
/ 02 июля 2019

Я настраиваю боковую панель в Google Sheets для отображения информации из строк, чтобы моя команда лучше видела определенные данные. Благодаря нескольким ответам Mogsdad (огромные реквизиты) я смог настроить боковую панель HTML и функции отображения, которые обновляют DOM с помощью информации из любой выбранной строки. Я пытаюсь расширить это, запустив пользовательский поиск по определенной ячейке (строке) в диапазоне строк и добавив элемент в DOM, который отображает первые 5 результатов поиска Google; Тем не менее, мне трудно указывать на строковое значение в этой конкретной ячейке (на самом деле это столбец в массиве), запускать его в своей пользовательской функции поиска и получать функцию, которая добавляет элементы в HTML для добавления результатов.

Вдохновение для этого варианта использования взято из Демонстрация Гранта Тиммермана Apps Script на Angular Connect 2018 , где он обновляет боковую панель информацией о спикерах событий и извлекает видео с Youtube, используя строку поиска из определенной ячейки , В приведенном ниже коде вы увидите, что я многое почерпнул из метода опроса листов Mogsdad и их пошагового руководства по настройке пользовательской поисковой системы с использованием протокола API Key Google.

Вот мои настройки .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 (), и выгружает их в элемент DOM с идентификатором класса "floatypar" (естественно, для абзацев, выглядящих как плавающие). Здесь много разметки Могсдада:

 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. Кто-нибудь может направить меня в правильном направлении? Пожалуйста, дайте реквизит Могсдаду в любом случае!

...