是否可以从一列中提取不同的数据集?

时间:2019-06-22 18:29:35

标签: javascript multidimensional-array google-apps-script google-sheets

我一直在尝试编写一些代码,这些代码基于一些简单的公式使用字符串向下看一列。我似乎无法识别不同的数据集并将其粘贴到我想要的位置。

我尝试用几种不同的方式重写代码,这些方式可以查看所有数据,并且仅将目标行偏移1。但是它无法识别出它拉不同的数据。

下面是有效的代码。它的作用是从第一列第二行开始(我的数据从此处开始)。数据是类似的列表;

     A
1   Customer1
2   item1
3   item2
4   Item3 
5 
6   Customer2
7   Item1

我在这些单元格中具有的公式只是连接了其他一些单元格。  使用循环,它遍历A列并找到空白。然后,它将“中断”它停在的任何数字(该单元格的数字A1表示法),然后查找这些单元格的值并将它们转置到正确行中的另一张纸中。

该代码运行得最好的问题是它不会将任何单元格读取为空白 (因为存在公式?),并将它们全部转置到同一行。

     function transpose(){
     var data = SpreadsheetApp.getActiveSpreadsheet();
     var input =data.getSheetByName("EMAIL INPUT");
     var output = data.getSheetByName("EMAIL OUTPUT");
     var lr =input.getLastRow();


    for (var i=2;i<20;i++){
    var cell = input.getRange(i, 1).getValue();

    if (cell == ""){
     break

     }

     }
    var set = input.getRange(2, 1, i-1).getValues();



      output.getRange(2,1,set[0].length,set.length) . 
     .setValues(Object.keys(set[0]).map ( function (columnNumber) {
     return set.map( function (row) {
     return row[columnNumber];
      });
      }));
      Logger.log(i);
      Logger.log(set);
       }

我需要代码做的是浏览所有数据,并按条件将数据集分开。 然后将该信息放在另一张纸上。每组数据(或数组)将进入不同的行。每个组件都填满整个列([[customer1”,“ Item1”,“ Item2”]。

编辑: 是否可以从单个列中提取不同的数据集并将其转换为数组?我相信,如果我使用“追加”将我的不同数组转置到需要的位置,那么能够做到这一点将起作用。

1 个答案:

答案 0 :(得分:0)

测试单元格的长度。即使是公式,它也会根据该值评估结果。

if (cell.length !=0){
  // the cell is NOT empty, so do this
}
else
{
  // the cell IS empty, so do this   instead
}

额外 该代码以您的目标为基础,并完成了数据的转置。

该代码效率不高,因为它在循环内包含getRangesetValues。 理想情况下,可以/应该在一个命令中设置整个输出范围,但是对此的(未回答)挑战是提前知道每个连续范围的最大行数,以便可以为少于最大行数的行设置空白值。行。

这将是值得进行的更改。


function so5671809203() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var inputsheetname = "EMAIL_INPUT";
  var inputsheet = ss.getSheetByName(inputsheetname);

  var outputsheetname = "EMAIL_OUTPUT";
  var outputsheet = ss.getSheetByName(outputsheetname);


  var inputLR =inputsheet.getLastRow();
  Logger.log("DEBUG: the last row = "+inputLR);
  var inputrange = inputsheet.getRange(1, 1,inputLR+1);
  Logger.log("the input range = "+inputrange.getA1Notation());
  var values = inputrange.getValues();

  var outputval=[];
  var outputrow=[];
  var counter = 0; // to count number of columns in array

  for (i=0;i<inputLR+1;i++){
    Logger.log("DEBUG: Row:"+i+", Value = "+values [i][0]+", Length = "+values [i][0].length);

    if (values [i][0].length !=0){
      // add this to the output sheet 
      outputrow.push(values [i][0]); 
      counter = counter+1;
      Logger.log("DEBUG: value = "+values [i][0]+" to be added to array. New Array Value = "+outputrow+", counter = "+counter);
    }
    else
    {
      // do nothing with the cell, but add the existing values to the output sheet
      Logger.log("DEBUG: Found a space - time to update output");

      // push the values onto an clean array
      outputval.push(outputrow);
      // reset the row array
      outputrow = []; 

      // get the last row of the output sheet
      var outputLR =outputsheet.getLastRow();
      Logger.log("DEBUG: output last row = "+outputLR);

      // defie the output range
      var outputrange = outputsheet.getRange((+outputLR+1),1,1,counter);
      Logger.log("DEBUG: the output range = "+outputrange.getA1Notation());

      // update the values with array
      outputrange.setValues(outputval);

      // reset the row counter
      counter = 0;
      //reset the output value array
      outputval=[];
    }
  }
}

电子邮件输入和输出表单
Email Input Sheet Email Out Sheet