我有下面的代碼可以檢查表格中的“CASH”字樣。找到后,它將將該行復制到新作業表,然后洗掉該行。
之前,我的值范圍是這樣設定的:
var range = ss1.getRange(2, 1, lr, lc);
但是現在我的作業表有 6000 多行,這是非常低效的。我已經對其進行了更改,以便它只查看一個范圍,lr-100這樣它就不必挖得那么深了。
由于進行了更改,我洗掉行ss1.deleteRow(i 2)的舊代碼不再有效,因為i僅在該特定行中參考該行range(即,如果它是那 100 行中的第 90 行i = 90,那么最終會洗掉我作業表中的第 90 行例如,應該是 6500。
問題如何以我的腳本設定的這種新方式找到正確的行#?
var etfar = ["BOTZ"]
function doCash() {
for (var i = 0; i < etfar.length; i ) {
cashMoney(etfar[i])
}
};
function cashMoney(etf) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var ss1 = ss.getSheetByName(etf);
var ss2 = ss.getSheetByName("Cash");
var lr = ss1.getLastRow();
var lc = ss1.getLastColumn();
var range = ss1.getRange(lr-100, 1, lr, lc);
var data = range.getValues();
for (var i = data.length - 1; i >= 0; i--)
{
var check = data[i][4] // ith row, 3rd column
if (check.includes("CASH")) {
var rowUsd = data[i];
// something has to happen here to find the exact row
ss2.appendRow(rowUsd);
//ss1.deleteRow(i 2); <-- this is old code. Prior, in my 'range' I used to start my rows from "2", but that was highly inefficient and I've changed it to "lr-100" so that it begins checking from the last 100 rows instead
}
};
};
uj5u.com熱心網友回復:
我想這就是你想要的
function cashMoney(etf) {
var ss = SpreadsheetApp.getActive();
var sh1 = ss.getSheetByName(etf);
var sh2 = ss.getSheetByName("Cash");
var lr = sh1.getLastRow();
var lc = sh1.getLastColumn();
var range = sh1.getRange(lr - 100, 1, 101, lc);
var data = range.getValues();
var d = 0;
for (var i = data.length - 1; i >= 0; i--) {
var check = data[i][4] // ith row, 3rd column
if (check.includes("CASH")) {
var rowUsd = data[i];
sh2.appendRow(rowUsd);
sh.deleteRow(lr - 100 i - d );The row is data start row i
}
};
}
d 跟蹤已從電子表格中洗掉的行,這是必要的,因為它們尚未從資料集中洗掉。
uj5u.com熱心網友回復:
從now that my sheet has 6000 rows, this is highly inefficient.,在您的情況下,為了減少腳本的處理成本,使用 Sheets API 怎么樣?當 Sheets API 用于您的情況時,所有行可能都可以處理。當 Sheets API 用于您的腳本時,它變為如下。
修改后的腳本:
此腳本使用 Sheets API。因此,請在 Advanced Google services 中啟用 Sheets API。并且,請設定etfar.
function sample() {
var etfar = ["Sheet1", "Sheet2",,,]; // Please set your sheet names.
var ss = SpreadsheetApp.getActiveSpreadsheet();
var dstSheet = ss.getSheetByName("Cash");
var dstSheetId = dstSheet.getSheetId();
var lastRow = dstSheet.getLastRow();
var { copyRows, deleteRows } = etfar.reduce((o, e) => {
var srcSheet = ss.getSheetByName(e);
var srcSheetId = srcSheet.getSheetId();
srcSheet.getRange("E2:E" srcSheet.getLastRow()).getValues().forEach(([v], i) => {
if (v == "CASH") {
o.copyRows.push({ copyPaste: { source: { sheetId: srcSheetId, startRowIndex: i 1, endRowIndex: i 2, startColumnIndex: 0 }, destination: { sheetId: dstSheetId, startRowIndex: lastRow, endRowIndex: lastRow 1, startColumnIndex: 0 } } });
o.deleteRows.push({ deleteDimension: { range: { sheetId: srcSheetId, dimension: "ROWS", startIndex: i 1, endIndex: i 2 } } });
lastRow ;
}
});
return o;
}, { copyRows: [], deleteRows: [] });
var requests = [...copyRows, ...deleteRows.reverse()];
if (requests.length == 0) return;
Sheets.Spreadsheets.batchUpdate({ requests }, ss.getId());
}
運行此腳本時,從 的作業表中檢索由列“E”搜索的值
etfar,并將這些值附加到目標作業表“Cash”。而且,每張紙的復制行也被洗掉。在這個腳本中,這些行程可以通過一個 API 呼叫來運行。
筆記:
- 當我看到你的劇本時
var check = data[i][4] // ith row, 3rd column,我認為那data[i][4]是“E”。但是你說3rd column。它是“C”列。如果要從“C”列中搜索“CASH”的值,請修改getRange("E2:E" srcSheet.getLastRow())為getRange("C2:C" srcSheet.getLastRow())。
參考:
- 方法:電子表格.batchUpdate
- 復制粘貼請求
- 洗掉維度請求
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/457230.html
