首页 > 解决方案 > Google Appscript 从一列转置动态数据组

问题描述

我一直在想办法弄清楚如何编写这个脚本来将数据从一张非常脏的纸上转换到另一张纸上。

还有其他类似的问题,但似乎没有一个像我的特定用例。

这是工作表当前的结构(有点):

在此处输入图像描述

这里最大的问题是我不知道一个特定的数据组会有多少行,但我知道每组数据之间总是有一堆空白行。

我找到了一个让我走了一半的脚本:

function myFunction() {
  //Get values of all nonEmpty cells
  var ss = SpreadsheetApp.getActiveSheet();
  var values = ss.getRange("D:D").getValues().filter(String);

  //Create object with 3 columns max
  var pasteValues = [];
  var row = ["","",""];
  for (i = 1; i<values.length+1; i++){
    row.splice((i%3)-1,1,values[i-1]);
    if(i%3 == 0){
      pasteValues.push(row);
      var row = ["","",""]
    }
  }
  if(row != []){
    pasteValues.push(row)
  }

  //Paste the object in columns A to C
  ss.getRange(1,1,pasteValues.length,pasteValues[0].length).setValues(pasteValues);

}

但在那种情况下,询问者数据集是固定的。我可以粗略地说,每个组的最大行数是 10(这是在浏览了 3000 行工作表之后的假设……但如果脚本可以自动知道这一点,那么它会更加动态)。所以考虑到这一点......在屠宰脚本之后......我想出了这个......这绝不会按照目前的方式工作(并非所有数据都被复制):

function myFunction() {
 
  var copyfrom = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('copyfrom')
  var copyto = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('copyto')
  
  var values = copyfrom.getRange("A:A").getValues().filter(Array);

  var pasteValues = [];

  var row = [];

  for (i = 1; i<values.length; i++){

       if(values[i] != ""){
       row.push(values[i])
       }
     
      Logger.log(row);

      if(i%10 == 0){
      pasteValues.push(row);
      row = []
    }

  }

  if(row != []){
    pasteValues.push(row)
  }
  copyto.getRange(1,1,pasteValues.length,pasteValues[0].length).setValues(pasteValues);

}

我很确定我可能仍然应该使用 array.splice() 但没有成功尝试实现它以实现我想要的,这是转置表的外观:

在此处输入图像描述

信息:

任何帮助表示赞赏

标签: javascriptgoogle-apps-scriptgoogle-sheets

解决方案


解决方案:

假设每个新行都以 开头Name,您可以使用此脚本重新排列列:

function myFunction() {
  var copyfrom = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('copyFrom');
  var copyto = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('copyTo');
  var lastRow = copyfrom.getLastRow();
  var values = copyfrom.getRange(1,1,lastRow).getValues().filter(Array);
  var pasteValues = [];
  var row = [];
  var maxLen = 1;

  // rearrange rows
  for (i = 0; i < values.length; i++) {
    if (values[i] == "Name" && i > 0) {
      pasteValues.push(row);
      row = [values[i]];
    }
    else if (values[i] != "") {
      row.push(values[i]);
      if (row.length > maxLen) {
        maxLen = row.length;
      }
    }
  }
  pasteValues.push(row);
  
  // append spaces to make the row lengths the same
  for (j = 0; j < pasteValues.length; j++) {
    while (pasteValues[j].length < maxLen) {
      pasteValues[j].push('');
    }
  }

  copyto.getRange(1,1,pasteValues.length,maxLen).setValues(pasteValues);
}

示例 I/O:

在此处输入图像描述

在此处输入图像描述


推荐阅读