尝试创建一个简单的过滤器应用程序脚本

Trying to create a Simple Filter App Script

我一直在尝试使用 Google Sheets App Script 创建一个简单的过滤器。如果单元格 C2 值包含“RAM”,则 Col“2”应该隐藏除 'RAM' 之外的所有行。但是它不起作用。

我在单元格 C2 中创建了一个数据验证来更改值。任何帮助将不胜感激。

 function create_filter(){
        const  ss = SpreadsheetApp.getActiveSpreadsheet();
        const sheet1 = ss.getSheetByName("Filter_Sheet");
        const  range = sheet1.getRange("A5:T");
        const  filter = range.createFilter();
    
        const Filter_Criteria1 = Sheet1.range('C2').getActiveCell;
        const coll1 = 2
        
        const  add_filter =  filter.setColumnFilterCriteria(coll1,Filter_Criteria1);
    }

再试一次:

function create_filter(){
        const  ss = SpreadsheetApp.getActiveSpreadsheet();
        const sheet1 = ss.getSheetByName("Filter_Sheet");
        const  range = sheet1.getRange("A4:T");
        const  filter = range.createFilter();
        var range2 = SpreadsheetApp.getActiveSheet().getRange('D2');
        var range3 sheet1.getRange('C2').activate();
 
  var criteria = SpreadsheetApp.newFilterCriteria()
  .setHiddenValues([cell != range2 ])
  .build();
spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(3, criteria);
};

我相信你的目标如下。

  • 您想要创建基本过滤器,当 RAM 的文本包含在单元格值中时,您想要显示行。

这样的话,下面的修改怎么样?

修改后的脚本:

function create_filter() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet1 = ss.getSheetByName("Filter_Sheet");
  const range = sheet1.getRange("A5:T");
  const filter = range.createFilter();
  filter.setColumnFilterCriteria(2, SpreadsheetApp.newFilterCriteria().whenTextContains("RAM").build());
}
  • 在您的 2 个脚本中,使用了 const range = sheet1.getRange("A5:T")const range = sheet1.getRange("A4:T") 的 2 个范围。在这个修改中,使用了const range = sheet1.getRange("A5:T")。关于这个,请根据自己的实际情况修改。

  • 当此脚本为 运行 时,显示 RAM 包含在列“B”的值中的行。

参考文献:

已添加 1 个:

来自评论中的以下回复和您的脚本,

I have created a data validation in cell C2 there are 10 to 11 different string in that validation including RAM. So i want to create a on edit function that whenever Cell C2 string changes script should RUN and Column B will show exact value that is available in cell C2

我认为 sheet 名称是“Filter_Sheet”,数据验证放在单元格“C2”中。但是,当我看到您的 Spreadsheet 时,sheet 名称是“Sheet1”并且数据验证被放入单元格“C1”。因此,以下示例脚本使用您的示例 Spreadsheet。当您更改sheet名称时,请将Sheet1修改为其他名称。

function onEdit(e) {
  const offset = 0; // When the data validation is cell "C1" and "C2", please use 0 and 1, respectively.
  const {range, value} = e;
  const sheet = range.getSheet();
  if (sheet.getSheetName() != "Sheet1" || range.getA1Notation() != "C" + (1 + offset)) return;
  const r = sheet.getRange(`A${4 + offset}:T`);
  const filter = sheet.getFilter();
  if (filter) {
    filter.remove();
  }
  r.createFilter().setColumnFilterCriteria(2, SpreadsheetApp.newFilterCriteria().whenTextContains(value).build());
}
  • 根据您的以下回复,

    exactly the details are different because it is just sample sheet i can modify the code later when apply to real sheet

    • 请根据实际情况修改以上脚本。

添加了 2 个:

根据您的以下回复,

but i am unable to edit this code. It is difficult for me to understand it, const value = sheet1.getRange('C2').getValue(); if this can be used then i can change the cell reference.

您想在编辑单元格“C1”时运行脚本。从您的附加问题中,我是这样理解的。因此,我提出了使用 OnEdit 简单触发器的事件对象的修改脚本。但是,当你不想使用事件对象时,下面的脚本怎么样?

function onEdit() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet1 = ss.getSheetByName("Sheet1");
  const value = sheet1.getRange('C1').getValue();
  const range = sheet1.getRange("A4:T");
  const filter = sheet1.getFilter();
  if (filter) {
    filter.remove();
  }
  range.createFilter().setColumnFilterCriteria(2, SpreadsheetApp.newFilterCriteria().whenTextContains(value).build());
}