如何使用公式连接范围,即使 Google 工作表上有空白要考虑?
How to concatenate ranges using formulas, even when there are blanks to be considered on Google Sheets?
问题包括连接包含 product1、brand1、price1、product2、brand2、price2 等的多个水平范围,即使单元格为空也是如此。
这是一个 link 的工作示例:
https://docs.google.com/spreadsheets/d/1poZW2JAEu419BnOzXVe7-Sq777moXvH_o16NKZtkjAE/edit?usp=sharing
我试过:
=transpose(sheet1A2:C),transpose(sheet1D:F)
{sheet1A2:C,sheet1D:F}
我也试过过滤它,但 none 目前有效。
我们将不胜感激。
干杯,
安东尼奥
使用:
=ARRAYFORMULA(QUERY(SPLIT(FLATTEN(A3:A4&"×"&
FILTER(A3:4; REGEXMATCH(A2:2; "Product.*"))&"×"&
FILTER(A3:4; REGEXMATCH(A2:2; "Brand.*"))&"×"&
FILTER(A3:4; REGEXMATCH(A2:2; "Price.*"))); "×");
"where Col2 is not null"))
更新:
=ARRAYFORMULA(SPLIT(FLATTEN(A3:A4&"×"&
FILTER(A3:4; REGEXMATCH(A2:2; "Product.*"))&"×"&
FILTER(A3:4; REGEXMATCH(A2:2; "Brand.*"))&"×"&
FILTER(A3:4; REGEXMATCH(A2:2; "Price.*"))); "×"))
备选方案:
您也可以尝试下面的 bound script 并将其添加到您的 sheet 以简化函数使用:
function transposeBy3(data) {
var oneData = []
var final = [];
var start = 0;
var end = 3;
data.forEach(raw => {
raw.forEach(value => {
oneData.push(value);
})
})
if(oneData.length%3 == 0){
for(y=0; y<oneData.length; y++){
final.push(oneData.slice(start, end));
start = start + 3;
end = end + 3;
}
}
return final;
}
样本
After saving the bound script on your spreadsheet file, on cell B11
, you can put this custom function =transposeBy3(B3:J4)
as seen below
我会根据您分享的内容进行回答,前提是您的 header 不会 是“Product1”或“Brand1”,而是实际名称彼此不相似的产品和品牌。
首先,切勿将不同的图表或结果放在会随时间增长的工作数据库下。出于这个原因,我在您的传播 sheet 中添加了两个新的 sheet。第一个是您的第一个 sheet(“Página1 - Erik”)的副本,其中 只有 有您的数据库 header 和数据。然后,结果公式位于单元格 A2 中的另一个 sheet(“Erik Help”)中。这个公式指的是清理后的 sheet "Página1 - Erik":
=ArrayFormula(SPLIT(FLATTEN(FILTER('Página1 - Erik'!A3:A&"|"&FILTER('Página1 - Erik'!B3:J;MOD(COLUMN('Página1 - Erik'!B3:J3)-2;3)=0)&"|"&FILTER('Página1 - Erik'!B3:J;MOD(COLUMN('Página1'!B3:J3)-3;3)=0)&"|"&FILTER('Página1 - Erik'!B3:J;MOD(COLUMN('Página1 - Erik'!B3:J3)-4;3)=0);'Página1 - Erik'!A3:A<>""));"|";1;0))
这与 player0 提供的方法类似,但它不依赖于 header 文本的相似性,而是依赖于列模式。
我会留给您根据需要修改公式,以便在适当的时候应用于您的实际数据集。
问题包括连接包含 product1、brand1、price1、product2、brand2、price2 等的多个水平范围,即使单元格为空也是如此。
这是一个 link 的工作示例: https://docs.google.com/spreadsheets/d/1poZW2JAEu419BnOzXVe7-Sq777moXvH_o16NKZtkjAE/edit?usp=sharing
我试过:
=transpose(sheet1A2:C),transpose(sheet1D:F)
{sheet1A2:C,sheet1D:F}
我也试过过滤它,但 none 目前有效。
我们将不胜感激。
干杯, 安东尼奥
使用:
=ARRAYFORMULA(QUERY(SPLIT(FLATTEN(A3:A4&"×"&
FILTER(A3:4; REGEXMATCH(A2:2; "Product.*"))&"×"&
FILTER(A3:4; REGEXMATCH(A2:2; "Brand.*"))&"×"&
FILTER(A3:4; REGEXMATCH(A2:2; "Price.*"))); "×");
"where Col2 is not null"))
更新:
=ARRAYFORMULA(SPLIT(FLATTEN(A3:A4&"×"&
FILTER(A3:4; REGEXMATCH(A2:2; "Product.*"))&"×"&
FILTER(A3:4; REGEXMATCH(A2:2; "Brand.*"))&"×"&
FILTER(A3:4; REGEXMATCH(A2:2; "Price.*"))); "×"))
备选方案:
您也可以尝试下面的 bound script 并将其添加到您的 sheet 以简化函数使用:
function transposeBy3(data) {
var oneData = []
var final = [];
var start = 0;
var end = 3;
data.forEach(raw => {
raw.forEach(value => {
oneData.push(value);
})
})
if(oneData.length%3 == 0){
for(y=0; y<oneData.length; y++){
final.push(oneData.slice(start, end));
start = start + 3;
end = end + 3;
}
}
return final;
}
样本
After saving the bound script on your spreadsheet file, on cell
B11
, you can put this custom function=transposeBy3(B3:J4)
as seen below
我会根据您分享的内容进行回答,前提是您的 header 不会 是“Product1”或“Brand1”,而是实际名称彼此不相似的产品和品牌。
首先,切勿将不同的图表或结果放在会随时间增长的工作数据库下。出于这个原因,我在您的传播 sheet 中添加了两个新的 sheet。第一个是您的第一个 sheet(“Página1 - Erik”)的副本,其中 只有 有您的数据库 header 和数据。然后,结果公式位于单元格 A2 中的另一个 sheet(“Erik Help”)中。这个公式指的是清理后的 sheet "Página1 - Erik":
=ArrayFormula(SPLIT(FLATTEN(FILTER('Página1 - Erik'!A3:A&"|"&FILTER('Página1 - Erik'!B3:J;MOD(COLUMN('Página1 - Erik'!B3:J3)-2;3)=0)&"|"&FILTER('Página1 - Erik'!B3:J;MOD(COLUMN('Página1'!B3:J3)-3;3)=0)&"|"&FILTER('Página1 - Erik'!B3:J;MOD(COLUMN('Página1 - Erik'!B3:J3)-4;3)=0);'Página1 - Erik'!A3:A<>""));"|";1;0))
这与 player0 提供的方法类似,但它不依赖于 header 文本的相似性,而是依赖于列模式。
我会留给您根据需要修改公式,以便在适当的时候应用于您的实际数据集。