在 Google 表格边栏中创建自定义搜索
Creating custom search in Google Sheets sidebar
我有一个 sheet 大约有 1400 行来跟踪停车场的停车位 space。到目前为止,在帮助下,我已经能够打开侧边栏、创建搜索框并添加 "Search" 和 "Close" 按钮。现在,一旦 "Search" 按钮被点击,它似乎没有在搜索框中获取 space 号码,也没有与脚本通信。
我的问题是如何从搜索框中获取信息,在 B 列中查找匹配项,从该行的 B-G 列中获取信息,然后 return 以下格式的信息:
- B 列:colBInfo
- C 列:colCInfo
- D 列:colDInfo
- E 列:colEInfo
- F 列:colFInfo
- G 列:colGInfo
- 行号:rowNumInfo
我已经调试并发现函数 searchInfo 给出错误:范围的坐标或尺寸无效。 (第 28 行,文件 "Sidebar")因为 rowWithSpaceNumber 是 returning -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
的原因是它没有在您的电子表格中找到传递的值。
其次,您传递的值的数据类型将为 string
,您在 theRowValues
中的值的数据类型为 object
。因此,即使您传递了电子表格中可用的数据,它也总是失败,因为在比较时有两种不同的类型。
要解决此类型错误,
将 theRowValues.push(values[i])
更改为 sidebar.gs
、
中的以下行
theRowValues.push(Utilities.formatString("%s", values[i]));
这会将您的电子表格数据从 object
数据类型转换为 string
数据类型。
完成此操作后,您仍然需要处理电子表格中的错误。
想象一下,如果您传递了电子表格中不可用的数据,您的代码将为 rowWithSpaceNumber
return 值 -1
,这将导致错误在 var theRowData = sheetWithData.getSheetValues(rowWithSpaceNumber, 2, 1, 6);
因为 -1 不是行的有效值。
我有一个 sheet 大约有 1400 行来跟踪停车场的停车位 space。到目前为止,在帮助下,我已经能够打开侧边栏、创建搜索框并添加 "Search" 和 "Close" 按钮。现在,一旦 "Search" 按钮被点击,它似乎没有在搜索框中获取 space 号码,也没有与脚本通信。
我的问题是如何从搜索框中获取信息,在 B 列中查找匹配项,从该行的 B-G 列中获取信息,然后 return 以下格式的信息:
- B 列:colBInfo
- C 列:colCInfo
- D 列:colDInfo
- E 列:colEInfo
- F 列:colFInfo
- G 列:colGInfo
- 行号:rowNumInfo
我已经调试并发现函数 searchInfo 给出错误:范围的坐标或尺寸无效。 (第 28 行,文件 "Sidebar")因为 rowWithSpaceNumber 是 returning -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
的原因是它没有在您的电子表格中找到传递的值。
其次,您传递的值的数据类型将为 string
,您在 theRowValues
中的值的数据类型为 object
。因此,即使您传递了电子表格中可用的数据,它也总是失败,因为在比较时有两种不同的类型。
要解决此类型错误,
将 theRowValues.push(values[i])
更改为 sidebar.gs
、
theRowValues.push(Utilities.formatString("%s", values[i]));
这会将您的电子表格数据从 object
数据类型转换为 string
数据类型。
完成此操作后,您仍然需要处理电子表格中的错误。
想象一下,如果您传递了电子表格中不可用的数据,您的代码将为 rowWithSpaceNumber
return 值 -1
,这将导致错误在 var theRowData = sheetWithData.getSheetValues(rowWithSpaceNumber, 2, 1, 6);
因为 -1 不是行的有效值。