javascript - 我怎样才能使这个办公脚本更快?

标签 javascript excel office-scripts

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

相关文章:

excel - 使用 Python 将值列表写入不同列中的 csv 文件

excel - 如何编写执行预定义查询以将数据加载到工作表中的办公脚本?

excel - 我可以将带有 Office 脚本的 excelsheet 发送给另一个组织中的人员吗

javascript - 使用 ajax 调用 WebMethod 时出现 500 Internal Server Error

javascript - Angular-nvD3 条形图 y 轴缩放错误(AngularJS)

javascript - ">>= "运算符是什么?

javascript - 为什么必须将其作为数组而不是字符串传入?

excel - 在 XSSFWorkbook 中保存时日期字段未以正确格式保存

php - 如何使用 PhpSpreadSheet 折线图在每个标记中设置可见数据标签?