我創建了以下函式,該函式遍歷 Google 表格中的行,如果其他兩個列中的任何一個中的值包含五個可能的子字串中的任何一個,則將文本“否”放在特定列中,否則將文本“是”在那一欄中。該功能按預期作業,但速度非常慢。
具體來說,這是一張包含用戶帳戶資訊的表格。每行是一個用戶記錄。emailCol包含用戶的電子郵件地址,并lastNameCol包含用戶的姓氏。如果電子郵件地址或姓氏包含陣列中的任何子字串patterns,則將 的值設定realAcctCol為“否”,否則將該值設定為“是”。
該腳本目前需要 20 分鐘來迭代 1400 行。有沒有辦法更快地做到這一點?
我來自 Microsoft Excel/VBA 背景,所以我傾向于迭代范圍。我是否錯過了更有效地執行此操作的明顯方法?
function checkRealUsers() {
const patterns = ["notreal","demo","notauser","test","debug"];
const realAcctCol = 9;
const emailCol = 3;
const lastNameCol = 2;
var curRow = 2;
var ss = SpreadsheetApp.getActive();
var sheet = ss.getSheetByName("Registered Customers");
var curEmail = sheet.getRange(curRow, emailCol).getValues()[0][0];
var curLastName = sheet.getRange(curRow, lastNameCol).getValues()[0][0];
//console.log(curVals[0][0]);
while(curEmail != "") {
sheet.getRange(curRow, realAcctCol).setValues([["Yes"]]);
//console.log(curEmail.toLowerCase() " " curLastName.toLowerCase());
for (var ndx in patterns) {
//console.log(patterns[ndx]);
if ((curEmail.toLowerCase().indexOf(patterns[ndx]) != -1) || (curLastName.toLowerCase().indexOf(patterns[ndx]) != -1)) {
//console.log("Test account!");
sheet.getRange(curRow, realAcctCol).setValues([["No"]]);
}
}
curRow = curRow 1;
curEmail = sheet.getRange(curRow, emailCol).getValues()[0][0];
curLastName = sheet.getRange(curRow, lastNameCol).getValues()[0][0];
}
}
uj5u.com熱心網友回復:
- 哎呀,我把錯誤的答案放在這里,但我想我把它找回來了,因為他們把它保存在歷史中(感謝這樣做)。
這個函式使用陣列來“希望”完成同樣的事情,但應該運行得更快。
function checkRealUsers() {
const patterns = ["notreal", "demo", "notauser", "test", "debug"];
const curRow = 2;
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName("Registered Customers");
const vs = sh.getRange(2, 1, sh.getLastRow() - 1, 9).getDisplayValues();
let col9 = sh.getRange(2, 9, sh.getLastRow() - 1).getValues();
vs.forEach((r, i) => {
if (patterns.includes(r[2]) || patterns.includes[r[1]]) {
col9[i][0] == "No"
}
});
sh.getRange(2,9,col9.length,col9[0].length).setValues(col9);
}
uj5u.com熱心網友回復:
我相信你的目標如下。
- 你的腳本作業正常。但是,您希望降低腳本的流程成本。
- 您想從“B”和“C”列中檢索值。當這些檢索到的值包含 的詞時
"notreal","demo","notauser","test","debug",您希望將其放入No“I”列。當這些檢索到的值不包含 的詞時"notreal","demo","notauser","test","debug",您希望將其放入Yes“I”列。
在這種情況下,以下修改后的腳本如何?
修改后的腳本:
function checkRealUsers() {
const patterns = ["notreal","demo","notauser","test","debug"];
const sheet = SpreadsheetApp.getActive().getSheetByName("Registered Customers");
const values = sheet
.getRange("B2:C" sheet.getLastRow())
.getValues()
.map(([b, c]) => [patterns.every(p => !b.toLowerCase().includes(p) && !c.toLowerCase().includes(p)) ? "Yes" : "No"]);
sheet.getRange(2, 9, values.length, 1).setValues(values);
}
- 在該變形例中,值從列“B”和“C”,并檢查檢索到的檢索值是否包括的值
["notreal","demo","notauser","test","debug"],然后,陣列包括的值No和Yes被創建。并且,創建的陣列被放入“I”列。
參考:
- 地圖()
- 每一個()
- 包括()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/355009.html
標籤:javascript 表现 谷歌应用程序脚本 谷歌表格
