我創建了一個基于 Googlesheet 的 CRUD webApp。當我嘗試在 Web 應用程式中搜索 html 資料表的多行和多列時,我得到了重復的搜索結果。當搜索測驗匹配同一行的多列中的資料時,就會發生這種情況。我怎樣才能讓它只顯示唯一的結果?如何更改我的代碼以僅搜索前 3~4 列?
當我嘗試搜索 Test ( Product) 時,它列出了 4 行,但它應該只回傳 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;
}
uj5u.com熱心網友回復:
從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;
}
關于
const COLUMN_INDEX = 4;在您的腳本中,在這種情況下,使用列“E”。當您要檢查的列“C”和“d”,請使用的指標2和3。如果您只想檢查“D”列,請修改
const COLUMN_INDEXES = [2, 3]為const COLUMN_INDEXES = [3]。
修改后的腳本 2:
在此修改中,不使用 Sheets API。請設定您的作業表名稱和電子表格 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 中。請注意這一點。
- You can see the detail of this in the report of "Redeploying Web Apps without Changing URL of Web Apps for new IDE".
References:
- filter()
- some()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/327420.html
標籤:javascript 谷歌应用程序脚本 网络应用程序 粗渣 google-sheets-api
