搜索框 Google sheet

Search Box Google sheet

我想在 google sheet.it 中制作搜索框作为切片器。 Table 的数据需要使用该搜索框进行过滤。enter image description here

我想使用 Google sheet 创建搜索框作为此 excel 搜索框。

这是模型https://docs.google.com/spreadsheets/d/139PfSbmEEGt-1kXZAO5mdBJ73vhnliNXNL51R7T1wOI/edit?usp=sharing

function onEdit(e) {
  var sh = e.source.getActiveSheet()
  var cel = e.source.getActiveRange();
  var crit = [];
  var count = 0;
  if (cel.getRow()==1){
    try{
      sh.getFilter().remove();
    }
    catch(e){
    }
    for (var col=1;col<=sh.getLastColumn();col++){
      if (!sh.getRange(1,col).getValue() && sh.getRange(2,col).getValue() != ''){
        crit.push([sh.getRange(2,col).getValue()])
        count++
      }
    }
  }
  if (count != 0){
    var filter = sh.getRange('A4:J').createFilter();
      var criteria = SpreadsheetApp.newFilterCriteria()
        .setHiddenValues(crit)
        .build();
    filter.setColumnFilterCriteria(1, criteria);
  }
};

在 A2 中:

=transpose(unique(A5:A))

可能会有所改进!

这是我所做的:

第 1 步:定义过滤器

您已经在图片中完成了,所以我不解释它是如何完成的。只需在 sheet.

中定义过滤器

第 2 步:让我们制作触发器

开始之前,您需要注意两件事:具有搜索框的 sheet 的名称,以及进行搜索的单元格。

然后转到 Tools > Script editor 并粘贴以下代码:

const SHEET_NAME = 'Sheet1'
const SEARCH_CELLS = ['E10', 'E11', null]
function onEdit(e) {
  // Get edition range and sheet
  const { range } = e
  const sheet = range.getSheet()

  // If we are not in the correct cell, return
  if(sheet.getName() !== SHEET_NAME) return

  // Get the filter to be able to control it
  const filter = sheet.getFilter()

  // Number of columns to check
  const nCols = Math.min(SEARCH_CELLS.length, filter.getRange().getWidth())
  for (let i = 0; i < nCols; i++) {
    // Get the cell as A1 notation
    const cell = SEARCH_CELLS[i]
    
    // Ignore column if it has no cell with the value
    if (!cell) continue
  
    // Get the range used to search
    const searchRange = sheet.getRange(cell)
    const row = searchRange.getRow()
    const col = searchRange.getColumn()

    // If the search cell was edited set the value
    // This checks if the point (row, col) is in the box defined by the edited cells range
    if(range.getRow() <= row && range.getLastRow() >= row && range.getColumn() <= col && range.getLastColumn() >= col) {
      updateFilter(sheet, filter, i, searchRange.getValue())
    }
  }
}

function updateFilter(sheet, filter, columnOffset, value) {
  // Get the range of the values of the filter
  const filterRange = filter.getRange()
  
  // Get the column that we are filtering
  const column = filterRange.getColumn() + columnOffset

  if (value) {
    // Get all values except the selected value
    // Change this to change the logic of what to hide
    const hiddenValues = sheet.getRange(filterRange.getRow(), column, filterRange.getHeight(), 1)
      .getValues()
      .flat()
      .filter(v => v != value) // notice the non-strict equality

    // Set the criteria to hide them all
    const criteria = SpreadsheetApp.newFilterCriteria()
      .setHiddenValues(hiddenValues)
      .build()
    filter.setColumnFilterCriteria(column, criteria)
  } else {
    // If there is not value, hide nothing
    filter.removeColumnFilterCriteria(column)
  }
}

然后更改上面的常量:

  • 名字sheet
  • 所有搜索单元格的 A1 符号的列表。该列表应按顺序排列,即第一个单元格用于第一列,第二个单元格用于第二列,依此类推。如果您不想搜索该列,请将其设置为 null。

我试着添加评论来逐步解释,但如果有什么不清楚或令人困惑的地方,请随时询问。

(可选)第 3 步:在搜索单元格中添加下拉菜单

如果您想要在搜索单元格上自动完成并允许您select下拉,请执行此(简单)步骤。

Select 搜索单元格并右键单击它。转到 Data validation。在 Criteria select List from range 中并添加过滤器第一列的所有值的范围。点击 Save 就成功了。

参考资料