我怎样才能使这个递归脚本更快?
此代码中的 RNumber 通过公式在电子表格中计算,并在每次迭代后检查
我通常从 > 50000 的数字向下迭代,并且脚本运行非常缓慢。结果,我添加了一个可变迭代步骤,但这并不理想,并且仍然运行不快。
真的很感激一些帮助!
async function findMaxDrawdown(context: Excel.RequestContext, currentMonth: number ) {
var maxAvailableMonth;
var monthsCount;
var monthsRange;
var dscrThreshold = context.workbook.worksheets.getItem("DDSHEET1").getRange("B14");
await context.sync();
const end = 0;
var finalTestVariable = context.workbook.worksheets.getItem("DDSHEET2").getRange("B16")
var precisionFactor = context.workbook.worksheets.getItem("DDSHEET1").getRange("B18");
numberMonths = context.workbook.worksheets.getItem("DDSHEET1").getRange("B17")
months.load("values");
precisionFactor.load("values");
finalTestVariable.load("values");
dscrThreshold.load("values");
numberMonths.load("values");
await context.sync();
maxAvailableMonth = months.values[0][currentMonth - 1];
monthsCount = context.workbook.worksheets.getItem("DDSHEET1").getRange("B17");
monthsCount.load("values");
await context.sync();
console.log(currentMonth)
for (let i = maxAvailableMonth; i > -1; i-= precisionFactor.values[0][0]) {
if (currentMonth < numberMonths.values[0][0]-1) {
if( i < precisionFactor.values[0][0]){
i = 0
}
}
context.workbook.worksheets.getItem("DDSHEET2").getRange("D2").getOffsetRange(1, currentMonth).values = [
[i]
];
await context.sync();
var currentMonthRNumber = context.workbook.worksheets.getItem("DDSHEET2").getRange("D2").getOffsetRange(2, currentMonth);
currentMonthRNumber.load("values");
await context.sync();
if (currentMonthRNumber.values[0][0] >= rNumberThreshold.values[0][0]) {
if (currentMonth == monthsCount.values)
{
return;
}
else
{
await findMaxDrawdown(context, currentMonth + 1);
var finalTest = context.workbook.worksheets.getItem("DDSHEET2").getRange("D2").getOffsetRange(1, currentMonth + 1);
finalTest.load("values");
await context.sync();
finalTestVariable.load("values")
await context.sync();
if (finalTest.values[0][0] == finalTestVariable.values[0][0]){
continue
} else{
if (finalTest.values[0][0] > finalTestVariable.values[0][0]) {
return;
}
else {
}
}
break
}
}
else
{
continue;
}
}
}
最佳答案
提供的代码示例包含一些缺失的引用——看起来像是部分脚本。因此我无法完全测试它。但我看到了几个问题 -
一个。您正在使用旧版本的脚本。您最好从新脚本重新开始,以便我们提供更好的建议。您拥有的是异步版本,它不再是主要的脚本模型。我想你会发现新版本更容易使用。
湾。您正在阅读循环内部并执行一大堆 context.sync()
.每次执行此操作时,都会导致 Excel 服务器通信并引入大量延迟。您应该尝试事先阅读所有您想要的内容,并且只在循环内进行数据处理。在循环结束时,您可以进行更新和 context.sync()
保存更新。
如果您需要进一步的帮助,请通过 Excel 网页底部的“帮助改进办公室链接”向我们发送反馈,并附上您的电子邮件。或者,发布更易于阅读/理解的脚本的简化版本。
关于javascript - 我怎样才能使这个办公脚本更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63619934/