将过滤后的数据复制到另一个 sheet 但如果满足条件则创建一个空白行
Copy filtered data to another sheet but creates a blank row if it met a condition
比如我有这个数据,
我想过滤“美国”数据并将其复制到另一个 sheet 但如果满足条件,我必须创建一个空白行。比如像这样
可能吗?
我也试过
IF(AND(F2=FALSE, NOT(ISBLANK(F2))), "", INDEX(QUERY('Sheet 1'!A2:E, "Select A where A contains '"&"USA"&"'"),COUNTIF($F:F2,TRUE),1))
但它并没有像我预期的那样工作
既然您提供了 Google Apps 脚本作为标签,我想您愿意接受脚本答案吗?如果是这样,那么我将在下面提供此代码。这是您要找的吗?
function copyUSA() {
var sheetSrc = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
var sheetDst = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");
var rowSrc = sheetSrc.getLastRow();
var values = sheetSrc.getRange("A2:A" + rowSrc).getValues().flat();
values.forEach(function (value, index){
var rowDst = sheetDst.getLastRow() + 1;
if(value == "USA"){
// If USA, copy then replace third column with TRUE
var row = index + 2;
sheetSrc.getRange(row + ":" + row).copyTo(sheetDst.getRange(rowDst + ":" + rowDst));
sheetDst.getRange("C" + rowDst).setValue("TRUE");
}
else{
// If not, set third column to FALSE
sheetDst.getRange("C" + rowDst).setValue("FALSE");
}
});
}
工作表 1:
工作表 2:
我的假设是基于你的公式。它们是:
- 我假设你在不是
USA
时添加空白。因此在输出上有 2 个空白
- 如果美国,第 3 列为 TRUE,否则为 FALSE,数据为空
- 根据你的公式,你的数据似乎是从
A2
开始的,所以我也调整了代码。
- 您还得到了公式中的第 4 和第 5 列,但由于您没有在 post 中显示它,我无法为它假设任何值。
如果不是您想要的答案,我深表歉意。
这里是公式版本:
=ArrayFormula(
array_constrain(
sortn(
filter(
{if(A:A="USA",A:A,),if(A:A="USA",B:B,),A:A="USA",
if(A:A="USA",row(A:A),iferror(vlookup(row(A:A),if(A:A="USA",row(A:A),),1,true),0)+1)},
A:A<>""),
1000,2,4,1),
1000,3)
)
长公式的原因主要是找到一种方法来只用一行来替换不以美国开头的一行或多行。该公式的基础是查找非美国行以获取最近的美国行的行号。同一块中的所有非美国行都具有相同的行号,并且可以使用 Sortn 丢弃(除了第一行)。
我在开头添加了一个额外的非美国行来检查这个边缘案例是否有效并落入 Iferror 子句。
比如我有这个数据,
我想过滤“美国”数据并将其复制到另一个 sheet 但如果满足条件,我必须创建一个空白行。比如像这样
可能吗? 我也试过
IF(AND(F2=FALSE, NOT(ISBLANK(F2))), "", INDEX(QUERY('Sheet 1'!A2:E, "Select A where A contains '"&"USA"&"'"),COUNTIF($F:F2,TRUE),1))
但它并没有像我预期的那样工作
既然您提供了 Google Apps 脚本作为标签,我想您愿意接受脚本答案吗?如果是这样,那么我将在下面提供此代码。这是您要找的吗?
function copyUSA() {
var sheetSrc = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
var sheetDst = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");
var rowSrc = sheetSrc.getLastRow();
var values = sheetSrc.getRange("A2:A" + rowSrc).getValues().flat();
values.forEach(function (value, index){
var rowDst = sheetDst.getLastRow() + 1;
if(value == "USA"){
// If USA, copy then replace third column with TRUE
var row = index + 2;
sheetSrc.getRange(row + ":" + row).copyTo(sheetDst.getRange(rowDst + ":" + rowDst));
sheetDst.getRange("C" + rowDst).setValue("TRUE");
}
else{
// If not, set third column to FALSE
sheetDst.getRange("C" + rowDst).setValue("FALSE");
}
});
}
工作表 1:
工作表 2:
我的假设是基于你的公式。它们是:
- 我假设你在不是
USA
时添加空白。因此在输出上有 2 个空白 - 如果美国,第 3 列为 TRUE,否则为 FALSE,数据为空
- 根据你的公式,你的数据似乎是从
A2
开始的,所以我也调整了代码。 - 您还得到了公式中的第 4 和第 5 列,但由于您没有在 post 中显示它,我无法为它假设任何值。
如果不是您想要的答案,我深表歉意。
这里是公式版本:
=ArrayFormula(
array_constrain(
sortn(
filter(
{if(A:A="USA",A:A,),if(A:A="USA",B:B,),A:A="USA",
if(A:A="USA",row(A:A),iferror(vlookup(row(A:A),if(A:A="USA",row(A:A),),1,true),0)+1)},
A:A<>""),
1000,2,4,1),
1000,3)
)
长公式的原因主要是找到一种方法来只用一行来替换不以美国开头的一行或多行。该公式的基础是查找非美国行以获取最近的美国行的行号。同一块中的所有非美国行都具有相同的行号,并且可以使用 Sortn 丢弃(除了第一行)。
我在开头添加了一个额外的非美国行来检查这个边缘案例是否有效并落入 Iferror 子句。