当按月列名称GooglespreadSheet重整宽到长格式的数据时,如何在所有单元格中显示getRange

时间:2019-04-26 07:49:24

标签: google-apps-script google-sheets reshape unpivot melt

在R中,data.table库dcast()可以将数据集从宽形转换为长形,如何在googlespreadsheet中做到这一点?

Sheet1

Name       Type YTD JAN FEB MAR
Product 1   A   8    1  3   4
Product 2   B   519  41 23  455
Product 3   C   32   2  25  5
   NA       D   3    NA 2   1

Sheet1

Sheet2    A B C D E F 1名称类型YTD JAN FEB MAR 2 = filter(Sheet1!A2:F5,not(isblank(Sheet1!A2:A5)))

Sheet2

在Sheet3中显示重塑的数据 来自A1

[Sheet3[3]

**不一定需要YTD的C列。

我调整的脚本不起作用: 来自Tanaike

function myFunction() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");

  var values = sheet.getRange(1,1,sheet.getLastRow(),sheet.getLastColumn()).getValues(); // Retrieve values
  var Result_sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");

  var result = [];
  for (var i = 1; i < values.length; i++) {
    for (var j = 1; j < values[i].length; j++) {
      result.push([values[0][i], values[j][0], values[j][i]]);
    }
  }

  Result_sheet.getRange().setValues(result); // Put result
}

对于Java脚本来说我太陌生了,无法说明原因。

2 个答案:

答案 0 :(得分:2)

@J。 G.的想法正确,但是该代码中存在几个错误(例如,i和j换位了),导致@rane注释错误。

这应该做什么不需要进行 Sheet2 中间步骤中的过滤。

function myFunction() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); // identify source sheet
  var values = sheet.getDataRange().getValues(); // Retrieve values
  var Result_sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");
  
  var result = [];
  result.push(["Name","Type","Date","YTD","QTY"]);
  
  for (var i = 1; i < values.length; i++) {
    for (var j = 3; j < values[i].length; j++) {
      if (values[i][j].length < 1) continue; // skip columns where 'qty' is blank, remove this line if you want empty value rows
      if (values[i][0].length < 1) continue; // skip rows where 'Name' is blank
      result.push([ values[i][0], values[i][1], values[0][j], values[i][2], values[i][j] ]);
    }
  }

  Result_sheet.getRange(1,1,result.length, result[0].length).setValues(result); // Populate results
}

这会导致...

Name        Type    Date    YTD     QTY
Product 1   A       JAN     8       1
Product 1   A       FEB     8       3
Product 1   A       MAR     8       4
Product 2   B       JAN     519     41
Product 2   B       FEB     519     23
Product 2   B       MAR     519     455
Product 3   C       JAN     32      2
Product 3   C       FEB     32      25
Product 3   C       MAR     32      5

答案 1 :(得分:1)

好吧,据我所知,您想拿第一张桌子,取出空白产品,并将其解压缩。

tnaike的脚本对您不起作用的原因是您有两个领导者列(产品和类型),而不仅仅是一个。这似乎可以正确调整所有内容。

function myFunction() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");

  var values = sheet.getDataRange().getValues(); // Retrieve values
  var Result_sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");

  var result = [];
  result.push(["Name","Type","Month","QTY"]);
  for (var i = 1; i < values.length; i++) {

    for (var j = 1; j < values[i].length; j++) {
      if (values[j][0].length < 1) continue;
      if (values[0][i].length < 1) continue;
      result.push([ values[j][0],values[j][1], values[0][i], values[j][i]]);
    }
  }

  Result_sheet.getRange(1,1,result.length, result[0].length).setValues(result); // Put result
  Result_sheet.sort(1);
}

这导致:

Name/Type/Month/QTY
P1  A   Ja  1
P1  A   Fe  3
P1  A   Ma  4
P2  B   Ja  41
P2  B   Fe  23
P2  B   Ma  455
P3  C   Ja  2
P3  C   Fe  25
P3  C   Ma  5