Google 脚本 (.gs) returns 重复行
Google script (.gs) returns duplicate rows
我创建了一个基于 Googlesheet 的 CRUD webApp。当我尝试在网络应用程序中搜索 html 数据表的多行和多列时,我得到了重复的搜索结果。当搜索测试匹配同一行的多个列中的数据时,就会发生这种情况。我怎样才能让它只显示独特的结果?如何更改我的代码以仅搜索前 3~4 列?
当我尝试搜索测试(产品)时,它列出了 4 行,但它应该只是 return 1 行。
附加片段。
.gs代码
function searchData(formObject){
var result = [];
if(formObject.searchtext){//Execute if form passes search text
var data = Sheets.Spreadsheets.Values.get(globalVariables().spreadsheetId, globalVariables().dataRange).values;
for(var i=0;i<data.length;i++){
for(var j=0;j<data[i].length;j++){
if(data[i][j].toLowerCase().search(formObject.searchtext.toLowerCase())!=-1){
result.push(data[i])
}
}
}
}
return result;
}
.js代码
function handleSearchForm(formObject) {
google.script.run.withSuccessHandler(createTable).searchData(formObject);
document.getElementById("search-form").reset();
}
<!-- SEARCH FORM-->
<form id="search-form" class="form-inline" onsubmit="handleSearchForm(this)">
<div class="form-group mx-sm-3 mb-2">
<label for="searchtext" class="sr-only">Search Text</label>
<input type="search" class="form-control form-control-sm" id="searchtext" name="searchtext" placeholder="Search">
</div>
<button type="submit" class="btn btn-sm btn-primary mb-2">Search</button>
我试过这样做,但没有帮助。
function searchData(formObject){
var result = [];
if(formObject.searchtext){//Execute if form passes search text
var data = Sheets.Spreadsheets.Values.get(globalVariables().spreadsheetId, globalVariables().dataRange).values;
for(var i=0;i<data.length;i++){
const COLUMN_INDEX = 4;
if(data[i][COLUMN_INDEX].toLowerCase().search(formObject.searchtext.toLowerCase())!=-1){
result.push(data[i])
}
}
}
return result;
}
根据您问题中的 only first 3~4 columns
,我了解到您想搜索“C”和“D”列中的文本。在这种情况下,下面的修改脚本怎么样?在此修改中,您的 Google Apps 脚本已修改。
修改后的脚本 1:
当你的脚本修改后,变成如下。
function searchData(formObject){
const COLUMN_INDEXES = [2, 3]; // 2 and 3 means the columns "C" and "D".
var result = [];
if (formObject.searchtext) {
var data = Sheets.Spreadsheets.Values.get(globalVariables().spreadsheetId, globalVariables().dataRange).values;
for (var i = 0; i < data.length; i++) {
if (COLUMN_INDEXES.some(e => data[i][e].toLowerCase().includes(formObject.searchtext.toLowerCase()))) {
result.push(data[i]);
}
}
}
return result;
}
About const COLUMN_INDEX = 4;
在您的脚本中,在这种情况下,使用列“E”。当你要检查“C”和“D”列时,请使用2
和3
的索引。
如果只想勾选“D”栏,请修改const COLUMN_INDEXES = [2, 3]
为const COLUMN_INDEXES = [3]
。
修改脚本 2:
在此修改中,未使用表格API。请设置您的 sheet 姓名和 Spreadsheet ID。
function searchData(formObject) {
const sheetName = "Sheet1"; // Please set the sheet name.
const spreadsheetId = "###"; // Please set the Spreadsheet ID.
const searchText = formObject.searchtext.toLowerCase();
const result = SpreadsheetApp
.openById(spreadsheetId)
.getSheetByName(sheetName)
.getDataRange()
.getValues()
.filter(r => [r[2], r[3]].some(c => c.toLowerCase().includes(searchText)));
return result;
}
在此修改后的脚本中,searchText
是从列“C”和“D”中搜索的。当 searchText
的值包含在“C”和“D”列的值中时,将检索该行。
在此脚本中,使用了getDataRange
。如果要搜索其他范围的值,请修改上述脚本的范围。
如果只想勾选“D”栏,请将[r[2], r[3]].some(c => c.toLowerCase().includes(searchText)))
修改为[r[3]].some(c => c.toLowerCase().includes(searchText)))
。
注:
- 当您修改 Google Apps 脚本时,请将部署修改为新版本。这样,修改后的脚本就会反映在 Web Apps 中。请注意这一点。
- 您可以在“Redeploying Web Apps without Changing URL of Web Apps for new IDE”的报告中看到详细信息。
参考文献:
我创建了一个基于 Googlesheet 的 CRUD webApp。当我尝试在网络应用程序中搜索 html 数据表的多行和多列时,我得到了重复的搜索结果。当搜索测试匹配同一行的多个列中的数据时,就会发生这种情况。我怎样才能让它只显示独特的结果?如何更改我的代码以仅搜索前 3~4 列?
当我尝试搜索测试(产品)时,它列出了 4 行,但它应该只是 return 1 行。
附加片段。
.gs代码
function searchData(formObject){
var result = [];
if(formObject.searchtext){//Execute if form passes search text
var data = Sheets.Spreadsheets.Values.get(globalVariables().spreadsheetId, globalVariables().dataRange).values;
for(var i=0;i<data.length;i++){
for(var j=0;j<data[i].length;j++){
if(data[i][j].toLowerCase().search(formObject.searchtext.toLowerCase())!=-1){
result.push(data[i])
}
}
}
}
return result;
}
.js代码
function handleSearchForm(formObject) {
google.script.run.withSuccessHandler(createTable).searchData(formObject);
document.getElementById("search-form").reset();
}
<!-- SEARCH FORM-->
<form id="search-form" class="form-inline" onsubmit="handleSearchForm(this)">
<div class="form-group mx-sm-3 mb-2">
<label for="searchtext" class="sr-only">Search Text</label>
<input type="search" class="form-control form-control-sm" id="searchtext" name="searchtext" placeholder="Search">
</div>
<button type="submit" class="btn btn-sm btn-primary mb-2">Search</button>
我试过这样做,但没有帮助。
function searchData(formObject){
var result = [];
if(formObject.searchtext){//Execute if form passes search text
var data = Sheets.Spreadsheets.Values.get(globalVariables().spreadsheetId, globalVariables().dataRange).values;
for(var i=0;i<data.length;i++){
const COLUMN_INDEX = 4;
if(data[i][COLUMN_INDEX].toLowerCase().search(formObject.searchtext.toLowerCase())!=-1){
result.push(data[i])
}
}
}
return result;
}
根据您问题中的 only first 3~4 columns
,我了解到您想搜索“C”和“D”列中的文本。在这种情况下,下面的修改脚本怎么样?在此修改中,您的 Google Apps 脚本已修改。
修改后的脚本 1:
当你的脚本修改后,变成如下。
function searchData(formObject){
const COLUMN_INDEXES = [2, 3]; // 2 and 3 means the columns "C" and "D".
var result = [];
if (formObject.searchtext) {
var data = Sheets.Spreadsheets.Values.get(globalVariables().spreadsheetId, globalVariables().dataRange).values;
for (var i = 0; i < data.length; i++) {
if (COLUMN_INDEXES.some(e => data[i][e].toLowerCase().includes(formObject.searchtext.toLowerCase()))) {
result.push(data[i]);
}
}
}
return result;
}
About
const COLUMN_INDEX = 4;
在您的脚本中,在这种情况下,使用列“E”。当你要检查“C”和“D”列时,请使用2
和3
的索引。如果只想勾选“D”栏,请修改
const COLUMN_INDEXES = [2, 3]
为const COLUMN_INDEXES = [3]
。
修改脚本 2:
在此修改中,未使用表格API。请设置您的 sheet 姓名和 Spreadsheet ID。
function searchData(formObject) {
const sheetName = "Sheet1"; // Please set the sheet name.
const spreadsheetId = "###"; // Please set the Spreadsheet ID.
const searchText = formObject.searchtext.toLowerCase();
const result = SpreadsheetApp
.openById(spreadsheetId)
.getSheetByName(sheetName)
.getDataRange()
.getValues()
.filter(r => [r[2], r[3]].some(c => c.toLowerCase().includes(searchText)));
return result;
}
在此修改后的脚本中,
searchText
是从列“C”和“D”中搜索的。当searchText
的值包含在“C”和“D”列的值中时,将检索该行。在此脚本中,使用了
getDataRange
。如果要搜索其他范围的值,请修改上述脚本的范围。如果只想勾选“D”栏,请将
[r[2], r[3]].some(c => c.toLowerCase().includes(searchText)))
修改为[r[3]].some(c => c.toLowerCase().includes(searchText)))
。
注:
- 当您修改 Google Apps 脚本时,请将部署修改为新版本。这样,修改后的脚本就会反映在 Web Apps 中。请注意这一点。
- 您可以在“Redeploying Web Apps without Changing URL of Web Apps for new IDE”的报告中看到详细信息。