【问题标题】:Excluding a Column with Filter views in Google sheets在 Google 表格中排除具有过滤视图的列
【发布时间】:2020-11-12 00:43:12
【问题描述】:

我是使用 Google 表格的新手,所以请多多包涵。

我正在为客户制作候补名单。我有过滤视图来过滤,第一次联系的日期和可用性按日期和时间。我试图弄清楚如何保持 A 列静态,以便它只是数字 1、2、3 等的列表

我的过滤器范围从 c2 开始排除列 a 和 b,但是当我应用过滤器时,数字会随着客户信息而移动,而不是保持不变。我确信有更好的方法可以使用公式来做到这一点,但我正在尝试制作一张表格,以便我能够通过他们的日程安排轻松查看信息。任何帮助将不胜感激。谢谢

https://docs.google.com/spreadsheets/d/1rAw8kYibGWX9_rSIF6ZKvWmQoNUGtT7ifRW-VXBISw4/edit?usp=sharing

【问题讨论】:

  • 我们需要更多关于您想要做什么的信息。一个示例表会很有帮助。你想过滤什么?可用性时间表是客户的可用性吗?静态数字列的用途是什么?
  • 我不知道如何发布图片。是的,这是我的客户的可用性。静态号码只是为了让我可以告诉他们,“对于星期四的约会,你是“#”在排队。有点愚蠢,但我通常知道每个客户需要多长时间才能完成,所以知道他们排在第 6 位,他们可能会等待大约 6 个月。每个客户排在一行,每天排在一列。如果天行中有文本或没有文本,我会使用带有条件的过滤视图。感谢任何帮助。谢谢!
  • 如果您可以共享样本表,肯定会更容易为您提供帮助,如下所述:support.google.com/docs/thread/3808684?hl=en。即使只是您的列标题和一些典型的数据行,没有敏感值(例如虚拟名称)也会使事情更清晰。并阐明您要过滤哪些列以及如何过滤。但正如您所说,过滤视图通常不应该对您排除的列进行排序。
  • 非常感谢。我编辑了第一篇文章以包含一个链接。
  • 你到底想做什么?为每一天创建不同的过滤视图,同时保持 A 列静态?

标签: google-sheets


【解决方案1】:

我删除了我之前的答案,它没有正确理解您的过滤问题。但作为@JLMosher 使用脚本回答的替代方案,我相信这个基于公式的解决方案也可以回答您的问题。公式如下:

=IF(ROW()=2,1,
   IF(SUBTOTAL(109,INDIRECT("A"&ROW()))>0,
     MAX(INDIRECT("B2:B"&ROW()-1))+1,0))

它基本上查看任何只包含数值的列。然后它只为该行取小计值。由于隐藏行的小计为零(如果使用小计代码 109),任何返回小计为零的行,我们不会增加我们的序号计数。每个未隐藏的行将上面行中的最高计数(最大值)加 1。 (我尝试只在上面一行的值上加 1,但如果那是隐藏行,它的值将是 0,所以这不起作用)

我在您的样本表中添加了一个选项卡 Help-GK。 (编辑:由于 OP 的样本表已被删除,here is my sample sheet.

基本上,B 列中的值会更新为始终显示数字的顺序排列。这些数字忽略任何隐藏的行。在我的示例中,我将行 4:6 和行 13:16 分组,然后通过单击最左侧的 [-] 符号“隐藏”这些组。要使它们再次可见,请单击 [+]。请注意,当您执行此操作时,队列编号中的位置会发生变化。

请注意,这些值也会忽略任何排序 - 这可能是也可能不是坏事。如果您使用每个列标题中的数据过滤器下拉箭头,按名称(C 列)或日期(D 列)进行排序,行将更改顺序,但队列编号中的位置保持相同的相对位置。

我无法将其创建为数组公式,因此您需要将公式复制到 B2 中。

最后,我使用您的 A 列作为列进行小计检查,但我相信它可以是包含所有数值的任何列,包括日期列。

让我知道这是否对你有用,或者我是否又误会了。

【讨论】:

    【解决方案2】:

    我不相信你可以用过滤器做你想做的事情。任何过滤掉行的过滤器都不会忽略列,即使它们超出了您的过滤器范围。您可以毫无问题地进行排序,但不能过滤掉行(例如在一周中的几天过滤掉空白时)。

    我写了一个脚本,它会做我相信你想做的事情。这是一个更改后的示例表的链接(您必须复制它才能编辑):

    https://docs.google.com/spreadsheets/d/12Ryqcdr0KGyUT1X1Ty2TD4I3q1y2XiXubZVwz2rV8Ec/edit?usp=sharing

    我在顶部添加了一行用于复选框。 并写了如下代码:

    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getActiveSheet();
    
    function onEdit(e) {
      
      var range = e.range;
      var value = e.value;
      var column = range.getColumn();
      var row = range.getRow();
      
      var dataArray = sheet.getDataRange().getValues();
      
      sheet.showRows(1,sheet.getMaxRows());
      
      if(row == 1 && value == 'TRUE') {
        sheet.getRange('C3:J').sort(column);
        var n = 1;
        for(var i = 2; i < sheet.getMaxRows(); i++){ 
          if(dataArray[i][column] == '') sheet.hideRows(i+1, 1); 
          else {
            sheet.getRange(i+1,1).setValue(n);
            n+=1;
          }
        }
      }
      else if(row == 1 && value == 'FALSE'){
        var n = 1;
        for(var i = 2; i < sheet.getMaxRows(); i++){
          sheet.getRange(i+1,1).setValue(n);
          n+=1;
        }
      }
    }
    

    您可以像在我的示例工作表中一样在工作表顶部添加一行,添加复选框,然后将此代码粘贴到脚本编辑器(工具 > 脚本编辑器)中。您必须为脚本命名,然后授予代码运行权限。

    当您单击复选框时,脚本将查看单元格,按该列对工作表进行排序,隐藏该列中所有带空格的行,重新编号列 A。当您取消单击复选框时,它将取消隐藏所有行并对列 A 重新编号。

    此外,如果适合您,您可以复制并使用上面链接的工作表。

    【讨论】:

    • 我忘记了第一次隐藏行的部分代码。我编辑了它。上面的代码还应该隐藏带有空格的行。
    • 我再次编辑了代码以取消隐藏行并在未选中复选框时重新编号列 A。
    • 你在哪里学过写这样的工作表脚本?
    • 你可以在这里学到很多关于堆栈溢出的知识。这也是 JavaScript,所以为什么会有关于它的教程。 w3schools.com 是一个很好的起点。当谷歌搜索答案时,包括谷歌表格应用脚本 JavaScript 等关键词。YouTube 已经完成了教程。
    • 如果此解决方案对您有用,请投票并接受此解决方案,以便其他人可以找到它。祝你好运!
    猜你喜欢
    • 2019-01-18
    • 1970-01-01
    • 2017-06-26
    • 2016-05-26
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    相关资源
    最近更新 更多