首页 > 解决方案 > 是否可以从一列中提取不同的数据集?

问题描述

我一直在尝试编写一些代码,这些代码根据一些简单的公式查找带有字符串的一列。我似乎无法让它识别不同的数据集并将它们粘贴到我想要的位置。

我尝试用几种不同的方式重新编写代码,其中查看所有数据并将目标行偏移 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”]。

编辑:是否可以从单个列中提取不同的数据集并将它们转换为数组?我相信如果我使用“appendrow”将我的不同数组转移到我需要它们的地方,那么能够做到这一点。

标签: javascriptmultidimensional-arraygoogle-apps-scriptgoogle-sheets

解决方案


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

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

EXTRA 此代码采用您的目标并完成数据的转置。

代码没有它可能/应该有的效率,因为它包含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=[];
    }
  }
}

电子邮件输入和输出表
电子邮件输入表 电子邮件输出表


推荐阅读