繁体   English   中英

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

[英]Google apps script select specific rows with specific columns

我试图弄清楚如何使用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。

编辑:

不需要[]周围的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]);

报表制作工具

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

功能:

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数据表:

在此处输入图片说明

当然,您必须构建自己的函数以从上表中加载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);
}

基于以上库珀的建议,这就是我如何使它起作用的方式:

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);
}

谢谢库珀的指导和建议!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM