gpt4 book ai didi

javascript - 优化代码 - getValue() 和循环

转载 作者:行者123 更新时间:2023-11-30 11:40:44 25 4
gpt4 key购买 nike

我在编码方面有点新手,尤其是 Javascript/Google 脚本语言。我已经创建了下面的代码,并且它可以工作,但是现在我已经有了一个可以工作的代码,我想看看如何优化它。在我看来,所有的 getValue() 调用都会对性能造成重大影响,而且我从来都不擅长优化循环。任何人都知道完成与此代码相同的更好方法吗?

它的作用:检查我的一个文件夹中的每个电子表格,看看它是否需要运行脚本的其余部分。如果为真,它会打开该工作表并计算包含数据的行数,使用它来限制它在循环中检查的行数。然后它会查找标记为推送的任何行,并将该范围复制到我的驱动器中的另一个电子表格。然后它继续到文件夹中的下一个文件并执行相同的操作。

这是我的代码:

function myVupdate() {  
try {
var folder = DriveApp.getFolderById("123abc"),
files = folder.getFiles();
while (files.hasNext()) {
var file = files.next(),
sss = SpreadsheetApp.open(file);
SpreadsheetApp.setActiveSpreadsheet(sss);

//Work orders update
var ss = sss.getSheetByName("Sheet2"),
refresh = ss.getRange("W3").getValue();
if (refresh == 0) {continue};
var avals = ss.getRange("D5:D").getValues(),
count = avals.filter(String).length,
rows = count + 5
var val = ss.getDataRange().getValues();
for (var row=5; row < rows; row++) {
var cell = ss.getDataRange().getCell(row, 23).getValue();
if (cell == 0) {
var cells = [["v" + "WO-" + val[row-1][3] + "_" + val[row-1][2],val[row-1][13],val[row-1][14],val[row-1][15],new Date()]];
var tss = SpreadsheetApp.openById("target_spreadsheet"),
ts = tss.getSheetByName("Sheet5");
ts.insertRowBefore(2);
var last_hmy = ts.getRange(3,1).getValue();
ts.getRange(2,1).setValue(last_hmy+1);
ts.getRange(2,2,cells.length,cells[0].length).setValues(cells);
ts.getRange(2,7).setValue(sss.getName());
ss.getRange(row,17).setValue(last_hmy+1);
ss.getRange(row,18,cells.length,cells[0].length).setValues(cells);

//Turnover update
var ss = sss.getSheetByName("Sheet1"),
avals = ss.getRange("D5:D").getValues(),
count = avals.filter(String).length,
rows = count + 5
var val = ss.getDataRange().getValues();
}
}
for (var row=5; row < rows; row++) {
var cell = ss.getDataRange().getCell(row, 24).getValue();
if (cell == 0) {

var cells = [["v" + val[row-1][3] + "_" + val[row-1][2],val[row-1][12],val[row-1][15],val[row-1][16],new Date()]];
var tss = SpreadsheetApp.openById("target_spreadsheet"),
ts = tss.getSheetByName("Sheet5");
ts.insertRowBefore(2);
var last_hmy = ts.getRange(3,1).getValue();
ts.getRange(2,1).setValue(last_hmy+1);
ts.getRange(2,2,cells.length,cells[0].length).setValues(cells);
ts.getRange(2,7).setValue(sss.getName());
ss.getRange(row,18).setValue(last_hmy+1);
ss.getRange(row,19,cells.length,cells[0].length).setValues(cells);
}
}
}
}
catch(e) {
// Browser.msgBox("An error occured. A log has been sent for review.");
var errorSheet = SpreadsheetApp.openById ("target_sheet").getSheetByName("Error Log"),
source = sss.getName();
lastRow = errorSheet.getLastRow();
var cell = errorSheet.getRange('A1');
cell.offset(lastRow, 0).setValue(e.message);
cell.offset(lastRow, 1).setValue(e.fileName);
cell.offset(lastRow, 2).setValue(e.lineNumber);
cell.offset(lastRow, 3).setValue(source);
cell.offset(lastRow, 4).setValue(new Date());
MailApp.sendEmail("my@email.com", "Error report - " + new Date(),
"\r\nSource: " + source + "\r\n"
+ "\r\nMessage: " + e.message
+ "\r\nFile: " + e.fileName
+ "\r\nLine: " + e.lineNumber
);
}
}

最佳答案

您好,欢迎来到 Stack Overflow,

首先,你是对的。 getValue()setValue() 调用越多,性能就越差,请阅读有关最佳实践的更多信息 here . Google 建议您尽可能批量处理这些内容。以下是立即引起注意的一件事:

var val = ss.getDataRange().getValues();

所以现在您在二维数组中拥有工作表上的所有值。这意味着在接下来的位中

var ss = sss.getSheetByName("Sheet2"),
refresh = ss.getRange("W3").getValue();
if (refresh == 0) {continue};
var avals = ss.getRange("D5:D").getValues(),
count = avals.filter(String).length,
rows = count + 5
var val = ss.getDataRange().getValues();
for (var row=5; row < rows; row++) {
var cell = ss.getDataRange().getCell(row, 23).getValue();

不再需要每个 getValue()getValues()。相反,您知道 refresh = val[2][22] 因为您需要第 3 行和第 23 列,因为您已经拥有包含该工作表数据的整个范围。

avals 相同,因为 D5:D 范围内的所有值都在 vals[n][3] 中,其中 n 4 开始。 请记住,数组索引从 0 开始(因此第一行和第一列是 vals[0][0]

因此,无论您在何处尝试使用 ss 电子表格中的 getValues(),您都已经拥有该数据。您还可以做的是操纵您拥有的数组,因此您始终只更改该数组中的值。完成后,您可以使用 ss.getDataRange().setValues(vals) 将整个数组推回到相同的范围(您可以将范围存储在变量中,例如 datRange = ss.getDataRange() 然后执行 datRange.setValues(vals)

您只需要为任何其他工作表使用单独的数据数组。由于相同的想法贯穿始终,因此我没有详细介绍其余代码。由于您已经使用 getValues() 获取了所有内容,因此不再有任何理由对该范围内的任何单元格使用 getValue()

关于javascript - 优化代码 - getValue() 和循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42776311/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com