【问题标题】:Is it possible to pull different data sets from one column?是否可以从一列中提取不同的数据集?
【发布时间】:2019-06-22 18:29:35
【问题描述】:

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

我尝试用几种不同的方式重新编写代码,查看所有数据并将目标行偏移 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”将我的不同数组转移到我需要它们的地方,那么能够做到这一点。

【问题讨论】:

  • 看起来代码有一些拼写错误,例如output.getRange(2,1,set[0].length,set.length) . ,然后是下一行.setValues(Object.keys(set[0]).map ( function (columnNumber) {。您在这里传递代码时遇到问题吗?另一方面,请阅读minimal reproducible example
  • @Rubén。在查找转置时,我从另一个网站获取了该脚本的一部分。从执行来看,这部分代码似乎没有任何问题
  • @HannaLogan 详细的后续问题通常作为单独的问题提出 - 部分是为了保持一个问题的回答方法,部分是因为所有最有资格提供帮助的人可能无法看到“编辑”。无论如何,从您的“编辑”中不清楚您想要实现什么(它没有您之前问题的背景),并且您没有提供成功结果的示例。除非我误解了您的“编辑”,否则我认为最好将其作为一个新问题提出。

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


【解决方案1】:

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

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=[];
    }
  }
}

电子邮件输入和输出表

【讨论】:

  • @HannaLogan 如果这个答案有用,那么您可以考虑接受它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2022-06-15
  • 2012-04-19
  • 1970-01-01
  • 2021-02-19
  • 2021-01-27
相关资源
最近更新 更多