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”列时,请使用23的索引。

  • 如果只想勾选“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)))

注:

参考文献: