【问题标题】:How to transpose some rows to columns?如何将一些行转置为列?
【发布时间】:2019-08-14 10:54:35
【问题描述】:

转置有很多问题,但我有一些细节,无法创建正确的公式。 所以我有近 100k 行,格式如下

https://docs.google.com/spreadsheets/d/146-6YHv69DDOnPKheKeRFZIQeZYIgO6UwCMd7X9VeKU/edit?usp=sharing 我需要ARRAYFORMULA 或类似的东西,以使这 100k 行以您可以在“预期结果”选项卡上看到的格式显示。

【问题讨论】:

  • 欢迎。仅供参考,StackOverflow 不是定制的编码服务。如果您描述自己在解决此问题方面所做的努力,将会非常有帮助。
  • 我明白了。谢谢你。但它可能对有同样问题的人很有帮助。
  • 非常感谢您的帮助! Stack 一直是我应对危急情况的地方,总是会遇到好人和疯狂的人!祝你晚上愉快。待会见。

标签: google-sheets transpose google-sheets-formula array-formulas google-sheets-query


【解决方案1】:
=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)})

【讨论】:

  • 巡回演出。请问你们建起来花了多长时间?
  • @Tedinoz 花了我大约 10 分钟
【解决方案2】:

您有大量记录,但每条记录有 19 个数据字段,分布在 10 列和 12 行中。你建议了一个数组公式(以及比我可能做的更聪明的人),但我建议一个脚本,它将当前形式的数据放在一张纸上(比如“源”),并将数据输出到一个新的工作表(例如,“目标”)。

在“映射”数据时需要解决几个问题:

  • 输入表上显示了多少条记录 - 需要启用循环。我使用 Javascript Math.floor 方法计算产品数量。
  • 为每个字段确定正确的行/列组合。数据分为三个部分
    • 第一行连续列中的8个字段,
    • 第九列2行2个字段,和
    • 第十列的九个连续行中的9个字段。
    • 总计 = 12 行/10 列。为此,为了导航行,我将计数器 (i) 乘以行数加 1;列更直观。
  • 为了提高效率,
    • 仅在脚本开头获取一次数据;
    • 使用数组逐步构建输出;和
    • 在脚本结束时更新一次输出 (setValues)。

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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 2021-11-09
    • 2013-06-03
    • 1970-01-01
    相关资源
    最近更新 更多