Google Apps 脚本 - 根据 for 循环匹配将数据范围移动到值 =“是”

Posted

技术标签:

【中文标题】Google Apps 脚本 - 根据 for 循环匹配将数据范围移动到值 =“是”【英文标题】:Google Apps Script - move data range based on for loop matching to value = "Yes" 【发布时间】:2018-10-16 08:58:18 【问题描述】:

我正在尝试使用 for 循环在数据表中查找某些值,并且根据该值是否为 =“是”,它将将该行移动到另一张表。循环应进一步查找 requesttype 的值(在本例中为 SRM、CC 或 TM1),并仅将行的某些部分移动到另一个工作表。

因此,for 循环应根据数据表中两个不同列的输入复制行:“所有输出”

因此,虽然我的代码在运行时通常可以正常工作,但它似乎只对输入“是”的行的一半执行该函数。

每次我运行脚本时,应该移动一半的行,移动,但另一半留在原始工作表中。我可以运行代码直到只剩下一行,在这种情况下什么都不会发生。

这是我所拥有的:

function myonEdit2() 
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getActiveCell();

  var sheetNameToWatch = "Open Requests";
  var columnNumberToWatch = 38;
  var watchColumn = 2;
  var valueToWatch = "Yes";

  var datarange = sheet.getRange(9, 2, 900, 36).getValues();
  var sheetNameToMoveTheRowTo = "Closed Requests" 

  for (i = 0; i < datarange.length -1; i++) 
    if (datarange[i][35] == "Yes") 
      var targetSheet = ss.getSheetByName(sheetNameToMoveTheRowTo);
      if (datarange[i][0] == "SRM") 
        var targetRange3 = targetSheet.getRange(targetSheet.getLastRow() + 1, 2);
        sheet.getRange(i, 2, 1, 8).moveTo(targetRange3);
        sheet.deleteRow(rowstart + i);
           
      else if (datarange[i][0] == "GC")  
        var targetRange3 = targetSheet.getRange(targetSheet.getLastRow() + 1, 2);
        sheet.getRange(i, 2, 1, 8).moveTo(targetRange3);
        sheet.deleteRow(i);
      
      else if (datarange[i][0] == "TM1")  
        var targetRange4 = targetSheet.getRange(targetSheet.getLastRow() + 1, 2, 1, 6);
        sheet.getRange(i, 2, 1, 6).moveTo(targetRange4);
        var targetRange5 = targetSheet.getRange(targetSheet.getLastRow(), 10, 1, 1)
        sheet.getRange(i, 13, 1, 1).copyTo(targetRange5)
        sheet.deleteRow(i);
      
    
  

正如我所说,代码工作正常,但它并没有针对它应该执行的所有行执行。

从上面可以看出,我将 for 循环范围定义为表所在的完整数据表。然后我创建第一个(主)if 条件,即数据范围的第 36 列为“是”。这应该定义脚本将针对哪些行执行。

第二个 if 条件定义了应该复制行的哪些确切列,并取决于第一列是 = SRM、CC 还是 TM1。

如果有人能帮我弄清楚为什么代码不能对所有行都执行,那就太好了。

Example sheet

【问题讨论】:

如前所述,您正在向前迭代并改变被迭代的底层范围,而不补偿所述突变。 感谢您的回答。但是我不确定如何补偿突变。我知道如果我需要通过 for (i = lastrow; i&gt;9,i--) 进行反向迭代但是,当我运行它时,即使我尝试只运行删除行部分,它仍然会和以前一样。 确保您在问题中显示的代码反映了您的尝试并描述了这些尝试的结果。还要了解 javascript Array 元素索引和 Range 行号和列号之间的区别 【参考方案1】:

我也遇到过类似的问题,这似乎也是这里的问题。 您正在获取数据范围并向其添加一个 for 循环来处理每一行。现在,您正在删除其间的行,但有一个已定义的数据数组,您在其中添加了 for 循环。因此,当前几行将被删除时,for 循环数组结构仍将保持不变,但工作表结构将发生变化,例如考虑第二行被删除并且您的条件在 i=5 处匹配,但工作表结构现在将具有第 5 行向上移动。

因此,您可以尝试添加要保留在数组中的行并清除工作表一次,然后在处理完成后将该数组一次性添加到工作表以复制工作表数据或尝试删除已删除的行从处理完成后的工作表移动到另一张工作表

【讨论】:

我明白你的意思。那应该是问题所在。但是我不完全确定如何实现这一点。我对编码很陌生,因此我的经验非常有限。您介意与我分享您如何解决可能遇到的类似问题的代码吗? 我没有遇到完全相同的问题,但是像这样我想从工作表中删除重复的行,我试图删除它们之间的行。如果此代码可以帮助您开发类似的逻辑。参考文章链接:developers.google.com/apps-script/articles/removing_duplicates

以上是关于Google Apps 脚本 - 根据 for 循环匹配将数据范围移动到值 =“是”的主要内容,如果未能解决你的问题,请参考以下文章

Google Apps 脚本:自定义函数,仅根据条件连接多行中的首字母

Google Apps 脚本根据文件名将我的驱动器文件移动到团队驱动器文件夹

如何在 Google Apps 脚本中添加和删除边框

如何使用 Google Apps 脚本将公式添加到 Google 表格?

例外:未配置访问 - API 更新后使用 Google Apps 脚本的 BigQuery

使用 Apps 脚本对 Google 表格中的边框进行条件格式设置