上下文:用户使用过滤器视图与Gsheet交互(他们并行地进行,因此过滤器不是一个选项)。我的功能基于活动单元识别:
var row = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(mainSheetName).getActiveRange().getRowIndex();当应用某些筛选器视图的功能(例如,排序)时,它会被愚弄。因此,我想控制用户对过滤器视图做什么,并阻止他们做某些事情。
问题相关的东西:,我正在用AppsScript编写一个脚本,它将考虑到active FilterViews (,FV,,稍后)。我已经了解了如何从Sheets访问FV功能。但是,FV实例没有“活动”属性,因此无法直接检查是否为用户应用了某个FV。因此,问题是:如何检查FilterViews中的哪个应用于工作表?
--我已经确定的解决方案是,在某些方法执行中获得一个FV列表(对于OnOpen()不起作用),然后跟踪更改--如果创建了一个新的FV,那么假设它是活动的。缺点:它不允许发现现有过滤器的激活。
的另一个解决方法是在用户开始与交互之前(在OnOpen()之后)删除所有FV,那么下一个新创建的FV很可能是活动的。如果我为自己删除所有的FVs,其他用户的活动FVs不会消失,因此他们的工作流程不会受到干扰。
下面是为我完成任务的最后一个解决方案的代码:
function checkFilterViews() {
const spreadsheetId = "sheet-id-here" // Please set the Spreadsheet ID.
const sheetName = "tab_name_here!A:A"; // Please set the sheet name.
// 1. Retrieve the settings of the filter view (`filterViews`) you want to use.
const res1 = Sheets.Spreadsheets.get(spreadsheetId, { ranges: [sheetName] });
const sheetId = res1.sheets[0].properties.sheetId;
const filterViews = res1.sheets[0].filterViews;
// Checking if FVs exist
if (filterViews!==undefined){
for (var i=0;i<filterViews.length;i++){
// Check if there is sorting in FVs (I want to prevent users from sorting)
if (filterViews[i].sortSpecs!=null){
Browser.msgBox(filterViews[i].title+" contains SORTING and sorting breaks things. Please do not sort.");
delFilterViews(); // Delete all FVs
break
}
// Check if the filter is applied to column names and not some arbitrary row
if (filterViews[0].range["startRowIndex"]!=1.0){
Browser.msgBox(filterViews[i].title+" is applied incorrectly. Please select Row 2, and then create a new FilterView.");
delFilterViews();
break
}
}
}
return filterViews
}
function delFilterViews() {
var ssId = SpreadsheetApp.getActive().getId();
Sheets.Spreadsheets.batchUpdate(
{
requests: Sheets.Spreadsheets.get(ssId, {
ranges: 'replace_with_sheet_name', //Sheet in which filterviews are present
fields: 'sheets/filterViews/filterViewId',
}).sheets[0].filterViews.map(function(e) {
return { deleteFilterView: { filterId: e['filterViewId'] } }; //create a new delete FV request for each filter view present in sheet1
}),
},
ssId
);
}在依赖于筛选器视图的任何方法之前调用代码。
注意:这是一个“快速和肮脏”的解决方案,您可以自己冒险使用它,或者更确切地说,根本不使用它:)
发布于 2022-04-01 00:19:45
Google脚本没有获得active filter视图的方法,也不可能从客户端代码window.top.location获得包含查询字符串的电子表格URL。
关于使用onOpen的“解决方案”,如果您指的是简单触发器,它将不适用于编辑器,因为简单触发器在有限模式下运行,这意味着它们无法执行需要授权才能运行的方法。另一方面,如果删除筛选视图,则筛选器视图不依赖于用户,所有电子表格用户都会删除筛选视图。
看起来,通过检测active filter视图,您必须考虑一种不同的方法来做任何您想要做的事情。
相关
https://stackoverflow.com/questions/71692920
复制相似问题