如何有效地使此Google Apps脚本循环?

时间:2019-03-04 14:51:07

标签: javascript google-apps-script google-sheets

我正在编写一个脚本,该脚本将一个单元格的值增加0.01,直到它与另一个单元格的值匹配为止(获取值,然后通过公式进行比较,看看其他单元格的值是否匹配)。问题是执行时间太长。在excel上执行非常简单,但我不知道如何在G-Apps脚本(都不是js)中进行编程。

我猜它花了太长时间,因为它在云上运行。反正有什么我可以解决的?

到目前为止,这里的代码:

function Calculate() {
  var ss = SpreadsheetApp.getActive();
  var vF = ss.getSheetByName('magic').getRange('C31').getValue();
  ss.getSheetByName('magic').getRange('C32').setValue(0);
  var vE = ss.getSheetByName('magic').getRange('C32').getValue();

  var vP

  for(vE=0;vE != vP;vE+=0.01){
    ss.getSheetByName('magic').getRange('C32').setValue(vE);
    var qParc = vF - vE;
    ss.getSheetByName('magic').getRange('C3').setValue(qParc);
    vP = ss.getSheetByName('magic').getRange('F3').getValue();

  }

提前谢谢!

1 个答案:

答案 0 :(得分:2)

由于vE != vP永远不会为假,因为JavaScript使用的浮点类型(大多数编程语言使用的IEEE-754双精度二进制浮点)本质上是不精确的,它很有可能运行“太长” 。众所周知,0.1 + 0.2不是0.3(它是0.30000000000000004)。结果,将==!=(或===!==)与可能的小数一起使用是不可靠的。 (如果它们是整数,则可以,只要它们不是真正大整数即可。)

如果您想更新一个值使其与另一个匹配,则可能不需要循环。只需将其中的差异添加到您要更新的内容中即可。

但是,如果您确实需要循环,请将!=替换为<

for (vE = 0; vE < vP; vE += 0.01) {

您还在那里重复很多操作,也许是昂贵的操作。一旦有了用于(例如)工作表或单元格的对象,请记住该对象引用并重新使用它:

function Calculate() {
  var ss = SpreadsheetApp.getActive();
  var magic = ss.getSheetByName('magic');
  var c32 = magic.getRange('C32');
  var c3 = magic.getRange('C3');
  var f3 = magic.getRange('F3');
  var vF = magic.getRange('C31').getValue();
  var vE, vP, qParc;

  for (vE = 0; vE < vP; vE += 0.01) {
    c32.setValue(vE);
    qParc = vF - vE;
    c3.setValue(qParc);
    vP = f3.getValue();
  }
}

(我还从中删除了不必要的var vE = c32.getValue();,因为您在循环开始时立即用vE覆盖了0。我只是将声明添加到了{{1} }声明var,现在声明vP。)