Как сделать этот цикл скрипта Google Apps эффективным? - PullRequest
0 голосов
/ 04 марта 2019

Я делаю скрипт, который увеличивает значение ячейки на 0,01, пока оно не совпадет со значением другой ячейки (получит значение, передайте формулу, чем посмотрите, совпадает ли значение другой ячейки).Проблема в том, что выполнение занимает слишком много времени.Это было очень просто сделать в Excel, но я не знаю, как программировать в G-Apps Script (ни в 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 голосов
/ 04 марта 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...