Скорее всего, он работает "слишком долго", потому что 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
в начале цикла. Я просто добавил объявление к var
, объявив vP
и, теперь, qParc
.)