问题描述
如何使此递归脚本更快? 此代码中的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;
}
}
}
解决方法
提供的代码示例包含一些缺少的参考-看起来像是部分脚本。因此,我无法完全测试它。但是我看到几个问题-
a。您正在使用旧版本的脚本。您最好从新脚本开始,以便我们提供更好的建议。您拥有的是异步版本,该版本不再是主要的脚本模型。我认为您会发现使用新版本要容易得多。
b。您正在循环内阅读并做大量的context.sync()
。每次执行此操作时,都将导致Excel服务器通信,并会导致大量延迟。您应该尝试先阅读所有想要的内容,然后只在循环内部进行数据处理。在循环结束时,您可以进行更新,并context.sync()
保存更新。
如果您需要进一步的帮助,请通过Excel网站底部的“帮助改善办公室链接”向我们发送反馈,并附上您的电子邮件。或者,发布易于阅读/理解的脚本简化版本。