尝试创建一个简单的过滤器应用程序脚本
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());
}
我一直在尝试使用 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());
}