我如何根据这些规则过滤数据:
在第 1 列中找到第一个非空行,插入值。在此之前,col 1、col 2、col 3 中的所有前面的行都应该是空的。
在第 2 列中找到第一个非空白行,插入值。第 1 列中的第一个非空值和第 2 列中的第一个非空值之间的所有列的所有行都应为空。
在第 3 列中找到第一个非空白行,插入值。第 2 列中的第一个非空值和第 3 列中的第一个非空值之间的所有列的所有行都应为空。
从第 1 栏再次重复。
结果表应如下所示:
谢谢!
答案 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);
}
range.setValues(data);
更改为 range.offset(0, data[0].length).setValues(data);
,从而生成下面的输出。答案 1 :(得分:0)
各位,
非常感谢您的回复!我找到了解决方法:
应该有辅助表,它告诉我我正在寻找的单元格位于哪一行:
对于第一个单元格(屏幕中的数字 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)
然后不断重复。
我知道,它不是最优雅的解决方案,最终它不是我所要求的,但发现它对我有用:)
无论如何,感谢您的帮助,至少我有动力更多地了解应用程序脚本:)