在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
Sheet2 A B C D E F 1名称类型YTD JAN FEB MAR 2 = filter(Sheet1!A2:F5,not(isblank(Sheet1!A2:A5)))
在Sheet3中显示重塑的数据 来自A1
[
**不一定需要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脚本来说我太陌生了,无法说明原因。
答案 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