我正在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中显示结果。谁能引导我正确的方向?无论如何,请务必给莫格斯达提供道具!