Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.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 我如何才能使这个谷歌应用程序脚本有效地循环?_Javascript_Google Apps Script_Google Sheets - Fatal编程技术网

Javascript 我如何才能使这个谷歌应用程序脚本有效地循环?

Javascript 我如何才能使这个谷歌应用程序脚本有效地循环?,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我正在制作一个脚本,将一个单元格的值增加0.01,直到它与另一个单元格的值匹配为止(获取值,传递公式,然后查看另一个单元格的值是否匹配)。问题是执行时间太长。这在excel上非常简单,但我不知道如何用G-Apps脚本(也不知道js)编程 我想这需要很长时间,因为它是在云上运行的。有什么我能解决的吗 以下是迄今为止的代码: function Calculate() { var ss = SpreadsheetApp.getActive(); var vF = ss.getSheetByNa

我正在制作一个脚本,将一个单元格的值增加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();

  }
提前谢谢

更有可能是因为
vE!=vP
从来都不是假的,因为JavaScript使用的浮点类型(大多数编程语言使用的IEEE-754双精度二进制浮点)本质上是不精确的。著名的是,
0.1+0.2
不是
0.3
(它是
0.300000000000000004
)。因此,使用
==
是不可靠的=(或
==
!==
)可能带有小数。(如果它们是整数,只要它们不是真正的大整数就可以了。)

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


但是如果您确实需要循环,请更换
=它可以帮助你。公式是常数吗?如果公式是x^2,而其他单元格值是-1呢?这是一个非常复杂的公式,不是常数。随着条目的增加,另一个值减小。目标是找到两者匹配或最接近的值。听起来这是一个使用“电子表格语言”(单元格值和公式使用这些单元格+数值常量)编程的优化问题。如果您将“电子表格程序”转换为JavaScript(使用这些变量+数值常量的变量和公式),您将获得更快的结果。此外,考虑使用诸如牛顿方法的优化例程来更适当地计算期望的参数值,而不是仅仅增加固定量。使用优化例程可能意味着您不需要将逻辑重写为应用脚本。谢谢您指出这一点。问题是,在谷歌花了太长时间停止循环之前,循环甚至没有走得太远。换句话说,循环太慢,vE只会增加到9.55左右。我不知道如何在没有循环的情况下制作一个简单的宏=/@oliddan-我已经更新了答案。你在那里重复了很多潜在的昂贵操作…@t-j-crowder再次感谢你!所以问题是不必要的电话。我试图在调试模式下运行代码,出于某种原因,它停在这一行“c32.setValue(0);”@oliddan-我以为我已经删除了这一行(我现在已经删除了),但它应该是无害的。第一次循环迭代在该单元格中设置0。如果它停在那里,肯定有一些错误,这可能是在某处报告的…如果你查看Google应用程序脚本中的执行记录,你会发现(可能).setValue()和.getValue()是昂贵的操作。是否有任何原因需要不断更新工作表,而不是在内存中进行更新,并在循环后进行更新?气体和板材的最佳实践通常是一次更新所有板材。
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();
  }
}