首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应用程序脚本,找出哪个工作表FilterViews是活动的。

问应用程序脚本,找出哪个工作表FilterViews是活动的。
EN

Stack Overflow用户
提问于 2022-03-31 12:59:02
回答 1查看 208关注 0票数 1

上下文:用户使用过滤器视图与Gsheet交互(他们并行地进行,因此过滤器不是一个选项)。我的功能基于活动单元识别:

代码语言:javascript
复制
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不会消失,因此他们的工作流程不会受到干扰。

下面是为我完成任务的最后一个解决方案的代码:

代码语言:javascript
复制
  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
  );
}

在依赖于筛选器视图的任何方法之前调用代码。

注意:这是一个“快速和肮脏”的解决方案,您可以自己冒险使用它,或者更确切地说,根本不使用它:)

EN

回答 1

Stack Overflow用户

发布于 2022-04-01 00:19:45

Google脚本没有获得active filter视图的方法,也不可能从客户端代码window.top.location获得包含查询字符串的电子表格URL。

关于使用onOpen的“解决方案”,如果您指的是简单触发器,它将不适用于编辑器,因为简单触发器在有限模式下运行,这意味着它们无法执行需要授权才能运行的方法。另一方面,如果删除筛选视图,则筛选器视图不依赖于用户,所有电子表格用户都会删除筛选视图。

看起来,通过检测active filter视图,您必须考虑一种不同的方法来做任何您想要做的事情。

相关

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71692920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档