Google Apps脚本选择具有特定列的特定行

时间:2019-03-05 16:27:44

标签: javascript google-apps-script

我试图弄清楚如何使用Google Apps脚本仅提取特定的行和列。不能使用= QUERY选项。需要将所有逻辑都保留在脚本中-我的实际数据集非常大。为了说明我要解决的问题。我有一张测试数据表。 TestData我只希望从中获得第2、3、5列(从零开始的索引),并且只需要带有“ fur”的行。

function testFour(sheetID, fromTabName, toTabName) {
  var sourceTab = SpreadsheetApp.openById(sheetID).getSheetByName(fromTabName);
  var values = sourceTab.getDataRange().getValues();
  var columns = [2,3,5]; //only want these columns
  var output = new Array();
  for (var i = 0; i < values.length; i++) {
    for (var j = 0; j < values[0].length; j++) {
      if (values[i][4] == "fur") { // only want these rows
        if (j in columns) {
          output.push(values[i][j]);
       }
      }
    }
  }
  var targetTab = SpreadsheetApp.openById(sheetID).getSheetByName(toTabName);
  targetTab.getRange(1, 1, output.length, columns.length).setValues(output);
}

此代码位有效,但如果有很多列,则维护性很差:

for(n=0; n < values.length; ++n) {
  var columns = [2,3,5];
  if (values[n][4] === 'fur') { 
    output.push( [values[n][2], values[n][3], values[n][5]]); 
  }

当我运行testFour函数时,在此代码行上出现有关“无法将数组隐蔽到对象[] []的错误:

targetTab.getRange(1, 1, output.length, columns.length).setValues(output);

感谢任何帮助。我真的很惊讶,没有找到任何这样的例子。每个解决方案都使用工作表上的= QUERY。

3 个答案:

答案 0 :(得分:0)

编辑:

如果使用此行推送到输出,则不需要[]周围的output-

output.push( [values[n][2], values[n][3], values[n][5]]);

要按行设置值,数据必须采用这种格式-

[ row,
  row ]

[ [1,2,3],
  [4,5,6] ]
当范围和值格式不匹配时,显示

Cannot covert Array to Object[][]错误。


尝试此行-

targetTab.getRange(1, 1, output.length, columns.length).setValues([output]);

答案 1 :(得分:0)

报表生成器

我猜您要使用此功能从同一数据集中构建不同的报告。所以我可以尝试这样的事情:

功能:

function testFour(t4Obj) {
  var ss=SpreadsheetApp.openById(t4Obj.ssId);
  var srcsh=ss.getSheetByName(t4Obj.srcShName);
  var dessh=ss.getSheetByName(t4Obj.desShName);
  var colA=String(t4Obj.zbcols).split('~~~');
  var tstCol=Number(t4Obj.zbtstCol);
  var tstVal=t4Obj.tstVal;
  var srcrg=srchsh.getDataRange();
  var srcvA=srcrg.getValues();
  var desvA=[];
  for (var i=0;i<srcvA.length;i++) {
    var tA=[];
    if (srcVa[i][tstCol]==tstVal) {
      for (var j=0;j<colA.length;j++) {
        tA.push(colA[j]);
      }
      desvA.push(tA);
    }
  }
  dessh.getRange(1, 1, desvA.length, desvA[0].length).setValues(desvA);
}

t4Obj数据表:

enter image description here

当然,您必须自己构建一个函数,以从上表中加载t4Obj。通过查看您的代码,我猜对您来说这没问题。

请注意,我尚未测试任何此代码,因此极不可能首次使用。您可以提高调试技巧。

让我们尝试制作一个正方形范围的数组,其中数字在每一行的同一列位置按1递增。数组如下所示:

var A=[[1,6,11,16,21],[2,7,12,17,22],[3,8,13,18,23],[4,9,14,19,24][5,10,15,20,25]];

手工制作阵列

function makeArray() {
  var A=[[1,6,11,16,21],[2,7,12,17,22],[3,8,13,18,23],[4,9,14,19,24],[5,10,15,20,25]];
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var rg=sh.getRange(5,5,5,5);//could be this way
  //var rg=sh.getRange(5,5,A.length,A[0].length);//or in most programs this way
  rg.setValues(A);
}

答案 2 :(得分:0)

基于库珀的建议,这就是我如何使它工作的方法:

function testFourNew(sheetID, fromTabName, toTabName) {
  var sourceTab = SpreadsheetApp.openById(sheetID).getSheetByName(fromTabName);
  var targetTab = SpreadsheetApp.openById(sheetID).getSheetByName(toTabName);
  var srcrg = sourceTab.getDataRange();
  var srcvA = srcrg.getValues();
  var desvA=[];
  // var columns = [2,3,5]; //only want these columns
  var columns = String("2,3,5").split(','); //only want these columns
  var tstVal = "fur"; 
  var tstCol = 4; 
  for (var i=0;i<srcvA.length;i++) {
    var tA=[];
    if (srcvA[i][tstCol] ==tstVal) {
      for (var j=0;j<columns.length;j++) {
        //Logger.log(srcvA[i][columns[j]]);
        tA.push(srcvA[i][columns[j]]);
      }
      desvA.push(tA);
    }
  }
  targetTab.getRange(1, 1, desvA.length, desvA[0].length).setValues(desvA);
}

谢谢库珀的指导和建议!