首页 > 解决方案 > 允许 Google 表格上的“创建新过滤器视图”功能,并保护某些列

问题描述

我正在处理一个大型 Google 表格,其中有来自多家公司的许多编辑,因此我必须在每列的基础上授予每个选项卡的权限。问题是,因为大多数编辑者只能访问 10-20% 的列,“创建新过滤器视图”功能不适用于这些用户。我发现过滤视图访问通常非常挑剔。有时它有效,有时它在具有类似保护的纸张上不起作用。其他时候“创建新过滤器视图”不是一个可用选项,但如果您选择现有过滤器视图并单击“复制”,您可以创建一个。似乎 Google 表格和权限存在一些我无法确定的奇怪错误。

有关如何使用 Apps 脚本解锁“创建新过滤器视图”选项的保护的任何想法?这可能适用于所有编辑者或所有查看者,在这种情况下都可以使用。谢谢!

标签: google-sheetsfilterview

解决方案


问题:

如果启用了高级表格服务,则可以在脚本中创建FilterView,但您在 UI 中创建它时遇到的相同问题会出现在此处:如果其中一列受到此用户的保护,则用户无法创建.FilterView

当然,同一用户也不能运行脚本来取消对相应列的保护——如果它所应用的用户可以删除它,那么保护有什么价值!

可能的解决方法:

解决此问题的一种方法是让脚本在可以编辑这些受保护列的用户的权限下运行 -参见 getEffectiveUser() - 。在大多数情况下,这是触发脚本的用户 - 请参阅getActiveUser() -,但在某些情况下,例如可安装的触发器或作为部署它的用户执行的 Web 应用程序,情况并非如此。

例如,您可以使用有权访问所需FilterView.

然后,每当任何用户编辑电子表格时都会触发它,但它会在安装触发器的用户的权限下触发(并且可以访问受保护的列),因此FilterView可以创建。

为了FilterView为某些编辑创建唯一(例如,当编辑特定单元格并且存在特定编辑值时),您可以在onEdit函数开始时检查这些条件。如果您需要传递更多信息以自定义过滤器视图(例如,哪些列和行、哪些工作表等),您可以将该信息放在其他单元格中并通过getValue()/检索相应的值getValues()

例如,它可能是这样的:

function fireOnEdit(e) {
  if (e.range.getA1Notation() === "E1" && e.value === "Create FilterView") {
    const ss = e.source;
    const spreadsheetId = ss.getId();
    const sheet = ss.getSheets()[0];
    const resource = {
      requests: {
        addFilterView: {
          filter: {
            range: {
              sheetId: sheet.getSheetId(),
              startRowIndex: 0,
              endRowIndex: 4,
              startColumnIndex: 0,
              endColumnIndex: 3
            }
          }      
        }
      }
    }
    Sheets.Spreadsheets.batchUpdate(resource, spreadsheetId);
  }
}

推荐阅读