首页 > 解决方案 > 当按月列名称GooglespreadSheet将数据从宽变为长时,如何在所有单元格中出现getRange

问题描述

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

表 1

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

表 1

Sheet2 ABCDEF 1 名称类型 YTD JAN FEB MAR 2 =filter(Sheet1!A2:F5,not(isblank(Sheet1!A2:A5)))

表 2

在 A1 的 Sheet3 中显示重新整形的数据

[表 3[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 脚本太陌生了,无法说出原因。

标签: google-apps-scriptgoogle-sheetsreshapeunpivotmelt

解决方案


@JG 的想法是正确的,但是该代码中有几个错误(例如 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

推荐阅读