簡體   English   中英

如何獲取正在循環的數組的行號?

[英]How to get row number of an array that's being looped through?

使用 Google AppScripts 並在網上找到了我修改過的這個腳本。

注意:電子表格有標題。

  1. 運行在第 3 列中找到的值
  2. 如果任何值包含“USD”一詞,請將整行復制到“目標表”中
  3. 復制完成后刪除該行
  4. 繼續循環直到找到下一個“美元”……等等。

什么有效:我能夠成功地遍歷數組並將正確的行復制到“目標表”中

我需要什么幫助:我不知道如何從原始工作表中刪除該行。 它總是最終刪除之前的行,然后每次再次循環時跳過 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])
  }

解釋:

迭代刪除工作表中的行的一種方法是創建一個向后的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從第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])
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM