【问题标题】:copy one row from one sheet to another将一行从一张纸复制到另一张纸
【发布时间】:2015-03-13 00:29:47
【问题描述】:

我知道以前有人问过这个问题,因为我在过去的 5 个小时里从这里尝试了所有这些,甚至是关闭的谷歌产品论坛。我无法停止任何循环。条件得到满足,但循环继续运行。我一直在从网上的其他示例中复制并插入自己的变量,但最后,我将有 5 行多次转到新工作表,直到工作表变得疲倦或其他什么。

我试过 getDataRange...我试过 getRange...我试过 var in loops 和其他循环,我都试过了,所以请看看,让我知道这段代码是如何保存的导致行被多次添加到新工作表中:

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

感谢您的帮助!

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    我不太同意 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);
      }
    }
    

    【讨论】:

    • 天哪,就是这样。我错过了整天看足球来解决这个问题,因为我在循环中有 setValues。再次感谢@Serge 的大力帮助!
    • 快速问题 - 使用上述方法,我可以从 sheet1 中选择特定列发送到 sheet2 吗?例如,我尝试将列号放在 dest.push(data[i][2]); 中,但我一直收到错误消息。
    • 不确定我是否完全理解您想要什么...您是否希望在条件为真时仅复制特定列,而不将其他列复制到工作表 2 上?
    • 是的 - 假设我有 sheet1 范围,然后根据搜索词过滤这些行,但随后只希望 sheet1 中的一列或两列移动到 sheet2。问题似乎是不同的范围大小,但我正在努力如何操作它们
    • 你必须使用中间数组,我会更新我的答案:-)
    【解决方案2】:

    是的,问题是你的 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);
        }
      }
    }
    

    【讨论】:

    • 谢谢 - 另一个答案中的解决方案也有帮助 - 我在循环中有 setValues,所以这就是它不断重写行的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多