条件过滤 - 谷歌表格

时间:2021-02-15 13:18:51

标签: google-apps-script google-sheets conditional-statements filtering

我如何根据这些规则过滤数据:

  1. 在第 1 列中找到第一个非空行,插入值。在此之前,col 1、col 2、col 3 中的所有前面的行都应该是空的。

  2. 在第 2 列中找到第一个非空白行,插入值。第 1 列中的第一个非空值和第 2 列中的第一个非空值之间的所有列的所有行都应为空。

  3. 在第 3 列中找到第一个非空白行,插入值。第 2 列中的第一个非空值和第 3 列中的第一个非空值之间的所有列的所有行都应为空。

从第 1 栏再次重复。

结果表应如下所示:

source and result table screen

谢谢!

2 个答案:

答案 0 :(得分:0)

我不确定这是否可以在 Sheets 中完成,但在 Apps Script 中完成时这实际上非常容易。如果您可以考虑 Apps Script 解决方案,请随时使用下面的代码。

代码:

function myFunction() {
  var sheet = SpreadsheetApp.getActiveSheet();
  // Modify range where the source table is
  var range = sheet.getRange('A1:C24');
  var data = range.getValues();
  // variable trackers
  var col1 = 1, col2, col3;

  data.forEach(function (row, index){
    // Skip checking the column headers
    if (index != 0) {
      // If first value of col1 was found, switch to col2 (So on and so forth)
      // If not first value of column after previous column checked, then overwrite with blank
      // Repeat this behavior until last row of data
      if(col1 && row[0]){
        col1 = '', col2 = 1;
      }
      else if(col2 && row[1]){
        col2 = '', col3 = 1;
      }
      else if(col3 && row[2]){
        col3 = '', col1 = 1;
      }
      else {
        data[index][0] = '';
        data[index][1] = '';
        data[index][2] = '';
      }
    }
  });
  // Overwrites the source table
  range.setValues(data);
}

示例输出:

output

注意:

  • 如果您希望在数据旁边有输出,请将 range.setValues(data); 更改为 range.offset(0, data[0].length).setValues(data);,从而生成下面的输出。

输出:

output2

答案 1 :(得分:0)

各位,

非常感谢您的回复!我找到了解决方法:

screen

应该有辅助表,它告诉我我正在寻找的单元格位于哪一行:

对于第一个单元格(屏幕中的数字 6):

=row(INDEX(B3:B26,MATCH(TRUE,ISNUMBER(B3:B26),0)))

第二个单元格(屏幕中的数字 17):

=row(INDEX((indirect("C"&J4&":C")),MATCH(TRUE,ISNUMBER((indirect("C"&J4&":C"))),0)))

第三个单元格(屏幕中的数字 20):

=row(INDEX((indirect("D"&K5&":D")),MATCH(TRUE,ISNUMBER((indirect("D"&K5&":D"))),0)))

第四个单元格(屏幕中的数字 23):

=row(INDEX((indirect("B"&L6&":B")),MATCH(TRUE,ISNUMBER((indirect("B"&L6&":B"))),0)))

然后,不断重复第二、第三和第四个单元格。

一旦我知道所需单元格的位置,就可以轻松使用索引函数来获取实际值。

=index($B$4:$B26,J4-3,1)
=index($C$4:$C27,K5-3,1)
=index($D$4:$D28,L6-3,1)

然后不断重复。

我知道,它不是最优雅的解决方案,最终它不是我所要求的,但发现它对我有用:)

无论如何,感谢您的帮助,至少我有动力更多地了解应用程序脚本:)