簡體   English   中英

如何有效地使此Google Apps腳本循環?

[英]How can I make this Google Apps Script loop efficiently?

我正在編寫一個腳本,將一個單元格的值增加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.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();因為您在循環開始時立即用0覆蓋了vE 。我只是在var添加了聲明,聲明vP ,現在是qParc 。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM