我正在编写一个脚本,该脚本将一个单元格的值增加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();
}
提前谢谢!
答案 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
。)