Javascript 如何使此office脚本更快?
如何使这个递归脚本更快? 此代码中的RNumber通过公式在电子表格中计算,并在每次迭代后进行检查 我通常从大于50000的数字向下迭代,脚本运行速度非常慢。因此,我添加了一个可变的迭代步骤,但这并不理想,而且运行速度也不快 非常感谢您的帮助Javascript 如何使此office脚本更快?,javascript,excel,office-scripts,Javascript,Excel,Office Scripts,如何使这个递归脚本更快? 此代码中的RNumber通过公式在电子表格中计算,并在每次迭代后进行检查 我通常从大于50000的数字向下迭代,脚本运行速度非常慢。因此,我添加了一个可变的迭代步骤,但这并不理想,而且运行速度也不快 非常感谢您的帮助 async function findMaxDrawdown(context: Excel.RequestContext, currentMonth: number ) { var maxAvailableMonth; var monthsCo
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;
}
}
}
异步函数findMaxDrawdown(上下文:Excel.RequestContext,currentMonth:number){
var maxAvailableMonth;
var月数;
var monthsRange;
var dscrThreshold=context.workbook.worksheets.getItem(“DDSHEET1”).getRange(“B14”);
wait 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”)
月荷载(“值”);
精度系数。荷载(“值”);
finalTestVariable.load(“值”);
dscrThreshold.load(“值”);
负载数(“值”);
wait context.sync();
maxAvailableMonth=months.value[0][currentMonth-1];
MonthCount=context.workbook.worksheets.getItem(“DDSHEET1”).getRange(“B17”);
月数荷载(“值”);
wait context.sync();
console.log(当前月)
对于(设i=maxAvailableMonth;i>-1;i-=precisionFactor.values[0][0]){
if(当前月<数月数值[0][0]-1){
如果(i=rNumberThreshold.values[0][0]){
如果(currentMonth==monthCount.values)
{
返回;
}
其他的
{
等待findMaxDrawdown(上下文,当前月份+1);
var finalTest=context.workbook.worksheets.getItem(“DDSHEET2”).getRange(“D2”).getOffsetRange(1,currentMonth+1);
最终试验荷载(“值”);
wait context.sync();
finalTestVariable.load(“值”)
wait context.sync();
if(finalTest.values[0][0]==finalTestVariable.values[0][0]){
持续
}否则{
if(finalTest.values[0][0]>finalTestVariable.values[0][0]){
返回;
}
否则{
}
}
打破
}
}
其他的
{
继续;
}
}
}
提供的代码示例包含很少缺少的引用—看起来像是一个部分脚本。因此,我不能完全测试它。但我看到了几个问题-
a。您正在使用旧版本的脚本。你最好从新剧本开始,这样我们才能提供更好的建议。您拥有的是异步版本,它不再是主脚本模型。我想你会发现新版本更容易使用
b。您正在阅读一个循环的内部内容,并执行一系列context.sync()
。每次这样做都会导致Excel服务器通信,并会引入大量延迟。您应该尝试预先读取所有需要的内容,并且只在循环内部进行数据处理。在循环结束时,您可以执行更新和context.sync()
保存更新
如果您需要更多帮助,请通过Excel web底部的“帮助改进office链接”向我们发送反馈,并附上您的电子邮件。或者,发布更易于阅读/理解的简化版脚本