如何获取正在循环的数组的行号?

Posted

技术标签:

【中文标题】如何获取正在循环的数组的行号?【英文标题】:How to get row number of an array that's being looped through? 【发布时间】:2020-10-17 09:48:13 【问题描述】:

使用 Google AppScripts 并在网上找到了我修改过的这个脚本。

注意:电子表格有标题。

    遍历第三列中的值 如果任何值包含“美元”一词,请将整行复制到“目标表”中 复制完成后删除该行 继续循环直到找到下一个“USD”...等等。

有效的方法: 我成功地遍历数组并将正确的行复制到“目标表”中

我需要什么帮助: 我不知道如何从原始工作表中删除该行。它总是最终删除之前的行,然后每次再次循环时跳过 1 行。我对这部分代码尝试了多种不同的格式,例如 i-1、i+1 等……不知道我在这里做错了什么:

if (i == 0) 
  ss1.deleteRow(i+2);
 else 
ss1.deleteRow(i)

我已将整个脚本粘贴在下面:

var etfar = ["Cash File"] //This is a string because I have multiple sheets I'm looping through
 
function cashCopy(etf) 
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ss1 = ss.getSheetByName(etf);
  var ss2 = ss.getSheetByName("Target Sheet");
  var lr = ss1.getLastRow();
  var lc = ss1.getLastColumn();

// gets the data in Cash File
var range = ss1.getRange(1, 1, lr, lc);
var data = range.getValues();

// loops through rows in data
for (var i = 0; i < data.length; i++) 
  var check = data[i][2] // ith row, 3rd column
  if (check.includes("USD"))  

 var rowToCopy = data[i];
 ss2.appendRow(rowToCopy);
    
    if (i == 0) 
      ss1.deleteRow(i+2);
     else 
    ss1.deleteRow(i)
                 

  ; 
; // end i


    for (var i = 0; i < etfar.length; i++) 
    cashCopy(etfar[i])
  

【问题讨论】:

【参考方案1】:

解释:

在工作表中迭代删除行的一种方法是创建一个向后 for 循环。

替换

for (var i = 0; i &lt; data.length; i++)

for (var i = data.length - 1; i &gt;= 0; i--)

这样,每次删除一行,data 仍然会对应正确的行。


另一个问题是你得到var range = ss1.getRange(1, 1, lr, lc)。这意味着,您从第一行(包括标题)开始迭代,然后使用这样的解决方法:

if (i == 0) 
  ss1.deleteRow(i+2);
 else 
ss1.deleteRow(i)
             

但实际上,您不需要首先包含标题。请改用:var range = ss1.getRange(2, 1, lr, lc) 并将 if/else 语句替换为:ss1.deleteRow(i+2)

因为data 索引从0 开始,但您的range 从行2 开始。


解决方案:

var etfar = ["Cash File"] //This is a string because I have multiple sheets I'm looping through
 
function cashCopy(etf) 
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ss1 = ss.getSheetByName(etf);
  var ss2 = ss.getSheetByName("Target Sheet");
  var lr = ss1.getLastRow();
  var lc = ss1.getLastColumn();

// gets the data in Cash File
var range = ss1.getRange(2, 1, lr, lc); // <- modification
var data = range.getValues();

// loops through rows in data
for (var i = data.length - 1; i >= 0; i--)
 
  var check = data[i][2] // ith row, 3rd column
  if (check.includes("USD"))  

 var rowToCopy = data[i];
 ss2.appendRow(rowToCopy);
    
 ss1.deleteRow(i+2); // <- new code
    
  ; 
; // end i


    for (var i = 0; i < etfar.length; i++) 
    cashCopy(etfar[i])
  

【讨论】:

以上是关于如何获取正在循环的数组的行号?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 if 语句和 for 循环之外获取数组

如何停止循环以仅获取第一个数组的内容?

excel vba中如何获取筛选数据的正确行号

如何获取呼叫行号和文件名

如何获取特定行号的日期时间索引值

在针对 XML 模式验证 XML 文件时如何获取错误的行号