1

我怎样才能使这个递归脚本更快?此代码中的 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;
    }
    
  }
}
4

1 回答 1

2

提供的代码示例包含一些缺失的引用——看起来像是部分脚本。因此我无法完全测试它。但我看到了几个问题 -

一个。您正在使用旧版本的脚本。您最好从新脚本重新开始,以便我们提供更好的建议。您拥有的是异步版本,它不再是主要的脚本模型。我想你会发现新版本更容易使用。

湾。您正在循环内部阅读并执行一大堆context.sync(). 每次执行此操作时,都会导致 Excel 服务器通信并引入大量延迟。您应该尝试事先阅读所有您想要的内容,并且只在循环内进行数据处理。在循环结束时,您可以进行更新并context.sync()保存更新。

如果您需要进一步的帮助,请通过 Excel 网页底部的“帮助改进办公室链接”向我们发送反馈,并附上您的电子邮件。或者,发布更易于阅读/理解的脚本的简化版本。

于 2020-09-01T16:52:19.997 回答