Как я могу улучшить скорость при прохождении через сотни строк? - PullRequest
0 голосов
/ 23 декабря 2018

Я пытаюсь пройтись по рабочему листу и рассчитать основную стоимость позиции «Первый пришел, первый вышел».Мой рабочий лист сейчас всего в ~ 120 строках, но он, несомненно, будет расти со временем.Функция уже выполняется довольно медленно, поэтому я ищу решения о том, как ее ускорить.Я также программист noob, и я впервые использую javascript, поэтому любые другие советы приветствуются!

Спасибо!

function FifoCostBasis(symbol, quantity) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Transactions Import");
  var lastRow = 150;
  var lastCol = 12;
  var costBasisSold = Number(0);
  var quantitySold = Number(0);


    for (var row = lastRow; row >= 2; row--){
      var action = sheet.getRange(row,2).getValue();
      var sym = sheet.getRange(row,3).getValue();
      var qSold = Number(sheet.getRange(row,5).getValue());
      var cbSold = Number(sheet.getRange(row,10).getValue());
      var price = Number(sheet.getRange(row, 6).getValue()); 

      if(["Buy", "Reinvest Shares", "Short Term Cap Gain Reinvest", 
"Qual Div Reinvest", "Long Term Cap Gain 
Reinvest"].indexOf(action)>=0
         && sym == symbol){
        quantitySold += qSold;
        costBasisSold += cbSold;

        if(quantitySold > quantity){ 
          var difference = quantitySold - quantity;
          var cbSoldAdj = difference*price;
          quantitySold = quantitySold - difference;
          costBasisSold = costBasisSold - cbSoldAdj;  
        };
      };
    };

      return costBasisSold;

};

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Что-то вроде этого может работать для вас:

function FifoCostBasis(symbol, quantity) {
  if(symbol && quantity){
    var ss=SpreadsheetApp.getActiveSpreadsheet();
    var sh=ss.getSheetByName("Transactions Import");
    var lastRow=150;//there is a sh.getLastRow() function that might work for you
    var lastCol=12;//there is a sh.getLastColumn() function that might work for you
    var rg=sh.getRange(2,1,149,12);//row 2, column 1, num rows = 150-2+1, 12 columns
    var vA=rg.getValues();//all data for the entire sheet is acquired here
    var costBasisSold=0;
    var quantitySold=0;
    for(var i=vA.length-1;i>=0;i++){//i=0 is row 2
      var action=vA[i][1];
      var sym=vA[i][2];
      var qSold=Number(vA[i][4]);
      var dbSold=Number(vA[i][9]);
      var price=Number(vA[i][5]);
      if((["Buy","Reinvest Shares","Short Term Cap Gain Reinvest","Qual Div Reinvest","Long Term Cap Gain Reinvest"].indexOf(action)>=0) && sym==symbol){
        quantitySold += qSold;
        costBasisSold += cbSold;
      }
      if(quantitySold > quantity) { 
        var difference = quantitySold - quantity;
        var cbSoldAdj = difference*price;
        quantitySold = quantitySold - difference;
        costBasisSold = costBasisSold - cbSoldAdj;  
      }
    }
    return costBasisSold;
  }else{
    throw('Error: Invalid Inputs in function FifoCostBasis');
  }
}
0 голосов
/ 24 декабря 2018

Вы должны минимизировать вызовы getValue ().Вместо того, чтобы получать по одному значению за раз, вы должны раскрыть массив значений.

var data = sheet.getRange(2, 1, lastRow, lastCol).getValues();

Это вернет объект массива Javascript.Следует помнить, что массив Javascript начинается со значения индекса 0.

 var row2 = data[0];  //Since we the range started at row 2, row 2 will be at position 0.
 var row2col1 = row[0][0];

Если вы работаете со значениями в массиве, процесс будет намного быстрее.

...