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])
}
添加回答
舉報