Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使此office脚本更快?_Javascript_Excel_Office Scripts - Fatal编程技术网

Javascript 如何使此office脚本更快?

Javascript 如何使此office脚本更快?,javascript,excel,office-scripts,Javascript,Excel,Office Scripts,如何使这个递归脚本更快? 此代码中的RNumber通过公式在电子表格中计算,并在每次迭代后进行检查 我通常从大于50000的数字向下迭代,脚本运行速度非常慢。因此,我添加了一个可变的迭代步骤,但这并不理想,而且运行速度也不快 非常感谢您的帮助 async function findMaxDrawdown(context: Excel.RequestContext, currentMonth: number ) { var maxAvailableMonth; var monthsCo

如何使这个递归脚本更快? 此代码中的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;
    }
    
  }
}

异步函数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链接”向我们发送反馈,并附上您的电子邮件。或者,发布更易于阅读/理解的简化版脚本