在Google表格边栏中创建自定义搜索

时间:2015-02-06 20:15:05

标签: javascript html google-apps-script google-sheets sidebar

我有一张大约1400行的工作表来跟踪停车场的停车位。到目前为止,在帮助下,我已经能够打开侧边栏,创建一个搜索框,并添加“搜索”和“关闭”按钮。现在,一旦点击“搜索”按钮,它看起来好像没有抓住搜索框中的空格号,也没有与脚本通信。

我的问题是如何从搜索框中获取信息,在B列中查找匹配项,从该行的B-G列中获取信息,并按以下格式返回信息:

  • B列:colBInfo
  • C栏:colCInfo
  • D栏:colDInfo
  • E栏:colEInfo
  • F栏:colFInfo
  • G栏:colGInfo
  • 行号:rowNumInfo

我做了一个调试和基金,函数searchInfo给出了错误:范围的坐标或尺寸无效。 (第28行,文件“Sidebar”)因为rowWithSpaceNumber返回-1。我相信一旦theSpaceNumber能够从搜索框中获取信息,它将纠正此错误。

Menu.gs

function onOpen() { 

  SpreadsheetApp.getUi()
  .createMenu('Sidebar')
  .addItem('Show Sidebar', 'showSidebar')
  .addToUi(); 
 }

Sidebar.gs

 function showSidebar() {
var html = HtmlService.createHtmlOutputFromFile('index')
   .setSandboxMode(HtmlService.SandboxMode.IFRAME)
   .setTitle('Individual Space Lookup');
SpreadsheetApp.getUi()
   .showSidebar(html);
SpreadsheetApp.getActiveSpreadsheet().toast('Sidebar opened', 'Status');
}

function searchInfo(theSpaceNumber) {
 var ss =     SpreadsheetApp.openById("1isuunf_SRThXe8C71ROKAC2JvjZ49w05MrLE2323Yqk");
Logger.log("Book name: "+ ss.getName());
var sheetWithData = ss.getSheetByName("Master Sheet");
Logger.log("Sheet name: "+ sheetWithData.getName());  
var numOfRowsInSheet = sheetWithData.getLastRow();
var values = sheetWithData.getSheetValues(4, 2, numOfRowsInSheet, 1);
Logger.log("Values: "+ values);


//Convert two dimensional array to one dimensional array.
var theRowValues = [];
for (var i = 0; i < values.length; i++) {
theRowValues.push(values[i]);
};

var rowWithSpaceNumber = theRowValues.indexOf(theSpaceNumber);
Logger.log("rowWithSpaceNumber: " + theSpaceNumber);

//Get 6 columns of data:  getSheetValues(startRow, startColumn, numRows, numColumns)
var colBInfo = sheetWithData.getSheetValues(rowWithSpaceNumber, 2, 1, 1);
var colCInfo = sheetWithData.getSheetValues(rowWithSpaceNumber, 3, 1, 1);
var colDInfo = sheetWithData.getSheetValues(rowWithSpaceNumber, 4, 1, 1);
var colEInfo = sheetWithData.getSheetValues(rowWithSpaceNumber, 5, 1, 1);
var colFInfo = sheetWithData.getSheetValues(rowWithSpaceNumber, 6, 1, 1);
var colGInfo = sheetWithData.getSheetValues(rowWithSpaceNumber, 7, 1, 1);
var rowNumInfo = sheetWithData.getRange(rowWithSpaceNumber, 2);
Logger.log("Row Number: " + rowWithSpaceNumber);

return app ( colBInfo, colCInfo, colDInfo, colEInfo, colFInfo, colGInfo, rowNumInfo );    

};

的index.html

<div>

  Search Individual Space: <input type="search" id="idUserInput"/>

<BR>

<input type="button" value="Search"
onclick="getUserInput()" />

<input type="button" value="Close"
onclick="google.script.host.close()" />


<script> 

function onSuccess( colBInfo, colCInfo, colDInfo, colEInfo, colFInfo, colGInfo, rowNumInfo) {


  alert('Column B: ' + colBInfo
    <br>'Column C: ' + colCInfo
    <br>'Column D: ' + colDInfo
    <br>'Column E: ' + colEInfo
    <br>'Column F: ' + colFInfo
    <br>'Column G: ' + colGInfo
    <br>'Row Number: ' + rowNumInfo

    );
}

function getUserInput() {
var theSpaceNumber = document.getElementById("idUserInput").value;

google.script.run.withSuccessHandler(onSuccess)
  .searchInfo(theSpaceNumber); 
    };

</script>

</div>

1 个答案:

答案 0 :(得分:1)

据我所知,失败有两个原因。

首先,显示-1的原因是它没有在电子表格中找到传递的值。

其次,您传递的值的数据类型为stringtheRowValues中值的数据类型为object。因此,即使您传递电子表格中的可用数据,它总是会失败,因为在比较时有两种不同的类型。

要解决此类型错误,

使用theRowValues.push(values[i])

中的以下行更改sidebar.gs
theRowValues.push(Utilities.formatString("%s", values[i]));

这会将您的电子表格数据从object数据类型转换为string数据类型。

完成此操作后,您仍然需要处理电子表格中的错误。

想象一下,如果您传递了spreasdheet中没有的数据,那么您的代码将返回-1的值rowWithSpaceNumber,这将导致var theRowData = sheetWithData.getSheetValues(rowWithSpaceNumber, 2, 1, 6);错误因为-1不是行的有效值。