为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

扬帆大鱼 2023-05-19 14:51:39
使用 Google AppScripts 并在网上找到了这个我修改过的脚本。注意:电子表格有标题。运行在第 3 列中找到的值如果任何值包含单词“USD”,则将整行复制到“目标表”复制完成后删除该行继续循环直到找到下一个“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 Filevar range = ss1.getRange(1, 1, lr, lc);var data = range.getValues();// loops through rows in datafor (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 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

解释:

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

替换

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

for (var i = data.length - 1; i >= 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从 row 开始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])

  }


查看完整回答
反对 回复 2023-05-19
  • 1 回答
  • 0 关注
  • 80 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信