将一行从一张纸复制到另一张

时间:2012-11-12 02:11:16

标签: google-apps-script google-sheets

我知道之前已经问过这个问题因为我花了最近5个小时从这里尝试所有这些,甚至是关闭的谷歌产品论坛。我无法阻止任何循环。条件得到满足,但循环继续运行和运行。我一直在网上复制其他的例子并插入我自己的变量,但最后,我会有5行连续几次进入新工作表,直到工作表累了或者其他东西。

我已经尝试了getDataRange ...我已经尝试了getRange ...我已经尝试了var in循环和其他循环,我已经尝试了所有这些,所以请看看并让我知道这段代码如何保持导致行多次添加到新工作表中:

function runReportAllMemCos1() {
  var sheet1 = sskey.getSheetByName('Businesses');
  var sheet2 = sskey.getSheetByName('tempsheet');

  var data = sheet1.getRange(1,1, sheet1.getLastRow(), sheet1.getLastColumn()).getValues();

  var dest = [];
  for (var i = 0; i < data.length; i++ ) {
    if (data[i][12] == "Associate") { 
      dest.push(data[i]); 
    } Logger.log(data)
    if (dest.length > 0 ) {
    sheet2.getRange(sheet2.getLastRow()+1,1,dest.length,dest[0].length).setValues(dest);
    }
  }
}

感谢您的帮助!

2 个答案:

答案 0 :(得分:6)

我真的不同意user1795832的答案,因为它没有使用批处理写入,而只是在每次条件为真时将数据写入工作表2 ...那么为什么要使用数组呢?

在循环完成后,尝试简单地批量写入工作表2,它应该按预期工作。

function runReportAllMemCos1() {
  var sheet1 = sskey.getSheetByName('Businesses');
  var sheet2 = sskey.getSheetByName('tempsheet');

  var data = sheet1.getRange(1,1, sheet1.getLastRow(), sheet1.getLastColumn()).getValues();

  var dest = [];
  for (var i = 0; i < data.length; i++ ) {
    Logger.log(data[i][12]);// just to check if the condition is true sometimes ;-)
    if (data[i][12] == "Associate") { 
      dest.push(data[i]); 
    }
  } // here is the end of the for loop

  Logger.log(dest) ; // log the dest array instead

  if (dest.length > 0 ) { // if something has been written in your array then batch write it to the dest. sheet
    sheet2.getRange(sheet2.getLastRow()+1,1,dest.length,dest[0].length).setValues(dest);
  }
}

编辑:评论后选择您要复制的列的其他可能性

function runReportAllMemCos1() {
  var sheet1 = sskey.getSheetByName('Businesses');
  var sheet2 = sskey.getSheetByName('tempsheet');

  var data = sheet1.getRange(1,1, sheet1.getLastRow(), sheet1.getLastColumn()).getValues();

  var dest = [];
  for (var i = 0; i < data.length; i++ ) {
    Logger.log(data[i][12]);// just to check if the condition is true sometimes ;-)
    if (data[i][12] == "Associate") { 
      var destRow = []; // initialise intermediate array
      destRow.push(data[i][1],data[i][2],data[i][12]);// choose here the columns you want to add (here col2, 3 & 13)
      dest.push(destRow); 
    }
  } // here is the end of the for loop
  Logger.log(dest) ; // log the dest array instead
  if (dest.length > 0 ) { // if something has been written in your array then batch write it to the dest. sheet
    sheet2.getRange(sheet2.getLastRow()+1,1,dest.length,dest[0].length).setValues(dest);
  }
}

答案 1 :(得分:1)

是的,问题是你的dest变量。你没有在每个循环之后重置它,所以每一行都会在那里不断复杂并且每次重复(所以当循环第三行时,第1行和第2行仍然在dest变量中)。把“dest = [];”就在你的for循环中,它会起作用。

function runReportAllMemCos1() {
  var sheet1 = sskey.getSheetByName('Businesses');
  var sheet2 = sskey.getSheetByName('tempsheet');

  var data = sheet1.getRange(1,1, sheet1.getLastRow(), sheet1.getLastColumn()).getValues();

  var dest = [];
  for (var i = 0; i < data.length; i++ ) {
    dest = [];
    if (data[i][12] == "Associate") { 
      dest.push(data[i]); 
    } Logger.log(data)
    if (dest.length > 0 ) {
      sheet2.getRange(sheet2.getLastRow()+1,1,dest.length,dest[0].length).setValues(dest);
    }
  }
}