Google sheets 如何将某些行转换为列?
有很多关于转置的问题,但我有一些细节,无法创建正确的公式。 因此,我有近10万行,格式如下 我需要Google sheets 如何将某些行转换为列?,google-sheets,transpose,google-sheets-formula,array-formulas,google-sheets-query,Google Sheets,Transpose,Google Sheets Formula,Array Formulas,Google Sheets Query,有很多关于转置的问题,但我有一些细节,无法创建正确的公式。 因此,我有近10万行,格式如下 我需要ARRAYFORMULA或类似的东西,以使这10万行符合您在“预期结果”选项卡上看到的格式 您有大量记录,但每个记录有19个数据字段,分布在10列和12行中。您建议使用arrayformula(以及比我可能更聪明的人),但我建议使用一个脚本,将当前形式的数据放在一张纸上(比如“源”),并将数据输出到新的纸上(比如“目标”) 在“映射”数据时,有几个问题需要解决: 输入表上表示了多少记录-启用循
ARRAYFORMULA
或类似的东西,以使这10万行符合您在“预期结果”选项卡上看到的格式
您有大量记录,但每个记录有19个数据字段,分布在10列和12行中。您建议使用arrayformula(以及比我可能更聪明的人),但我建议使用一个脚本,将当前形式的数据放在一张纸上(比如“源”),并将数据输出到新的纸上(比如“目标”) 在“映射”数据时,有几个问题需要解决:
- 输入表上表示了多少记录-启用循环所需的记录数。我使用Javascript
方法来计算产品的数量Math.floor
- 确定每个字段的正确行/列组合。数据分为三个部分
- 第一行连续列中的8个字段
- 第九列中2行2个字段,以及
- 第十列中九个连续行中的9个字段李>
- 总计=12行/10列。为此,为了导航行,我使用计数器(I)乘以行数加1;这些列更直观
- 为了提高效率,
- 仅在脚本开始时获取一次数据李>
- 使用数组逐步构建输出;及
- 在脚本末尾更新一次输出(
)setValues
函数myFunction(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sourcesheetname=“source”;
var targetsheetname=“target”;
var source=ss.getSheetByName(sourcesheetname);
var target=ss.getSheetByName(targetsheetname);
var sourcerange=source.getDataRange();
var sourcedata=sourcerange.getValues();
var sourceheaders=1;
var rowsperproduct=12;
var sourcelr=source.getLastRow();
var integerPart=Math.floor((sourcelr sourceheaders)/rowsperproduct);
//Logger.log(“调试:产品数量=“+integerPart”);
var rowdata=[];
//看看产品的数量
对于(var i=0;i=ARRAYFORMULA({UNIQUE(INDIRECT)(“source!A2:A”)和COUNTA(source!A2:A)),
查询(SPLIT)转置(SPLIT)查询♦"&索引(拆分)转置(拆分)(
TRIM(查询)(转置)(查询)(转置(
如果(来源:B2:J“”)♦“&source!A2:A&”♠"&{"♥“&source!B2:B,source!C2:J},))
,,999^99)),,999^99)), "♦")), "♠"),,2),,999^99), "♥")), "♦"),
“其中Col2不为null”,0)})
欢迎。仅供参考,StackOverflow不是一项定制的编码服务。如果您能描述一下自己在解决此问题方面所做的努力,这将非常有帮助。我理解。谢谢。但这可能对有同样问题的人非常有帮助。非常感谢您的帮助!Stack始终是我遇到紧急情况时的去处,并且总是见面od和疯狂的人们!晚上好。待会儿见。Tour de force。我可以问一下你花了多长时间来建造吗?@Tedinoz花了我大约10分钟
function myFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sourcesheetname = "source";
var targetsheetname = "target";
var source = ss.getSheetByName(sourcesheetname);
var target = ss.getSheetByName(targetsheetname);
var sourcerange = source.getDataRange();
var sourcedata = sourcerange.getValues();
var sourceheaders = 1;
var rowsperproduct = 12;
var sourcelr = source.getLastRow();
var integerPart = Math.floor((sourcelr-sourceheaders)/rowsperproduct);
//Logger.log("DEBUG: number of products = "+integerPart);
var rowdata = [];
// look thought the number of products
for (var i = 0; i<integerPart; i++){
// use a temporary array to build the data for the row.
var temp = [];
// row 1, copy first eight columns (0-7)
temp.push(sourcedata[(i*12)+1][0]);//ID
temp.push(sourcedata[(i*12)+1][1]);//GID
temp.push(sourcedata[(i*12)+1][2]);//NAME
temp.push(sourcedata[(i*12)+1][3]);//PRICE
temp.push(sourcedata[(i*12)+1][4]);//BRAND
temp.push(sourcedata[(i*12)+1][5]);//URL
temp.push(sourcedata[(i*12)+1][6]);//country
temp.push(sourcedata[(i*12)+1][7]);//instock
// row 2 & 3 in Column I(8)
temp.push(sourcedata[(i*12)+2][8]);//url1
temp.push(sourcedata[(i*12)+3][8]);//url2
// rows 4 - 12 in Column J(9)
temp.push(sourcedata[(i*12)+4][9]);// tech name
temp.push(sourcedata[(i*12)+5][9]);// size
temp.push(sourcedata[(i*12)+6][9]);// inches
temp.push(sourcedata[(i*12)+7][9]);// mm
temp.push(sourcedata[(i*12)+8][9]);// depth
temp.push(sourcedata[(i*12)+9][9]);// BB
temp.push(sourcedata[(i*12)+10][9]);// ref1
temp.push(sourcedata[(i*12)+11][9]);// ref2
temp.push(sourcedata[(i*12)+12][9]);// ref3
// Update the rowdata for this row
rowdata.push(temp);
}
// update data to target
target.getRange(2,1,integerPart,19).setValues(rowdata);
}
=ARRAYFORMULA({UNIQUE(INDIRECT("source!A2:A"&COUNTA(source!A2:A))),
QUERY(SPLIT(TRANSPOSE(SPLIT(QUERY("♦"&INDEX(SPLIT(TRANSPOSE(SPLIT(
TRIM(QUERY(TRANSPOSE(QUERY(TRANSPOSE(
IF(source!B2:J<>"", "♦"&source!A2:A&"♠"&{"♥"&source!B2:B, source!C2:J}, ))
,,999^99)),,999^99)), "♦")), "♠"),,2),,999^99), "♥")), "♦"),
"where Col2 is not null", 0)})