Что быстрее? Расчет стоимости или формула - Редактор скриптов Google Sheets: - PullRequest
1 голос
/ 21 октября 2019

Я хотел бы знать, если это на самом деле быстрее ...

- сделать расчет значения непосредственно в редакторе сценариев

ИЛИ

- запустить скрипт, который выводит формулы в ячейки.

У меня сейчас есть следующее:

function recheck_qty(itemname){
    var itemcell = findcellbyvalue(itemname);
    var itemcellrange = SpreadsheetApp.getActive().getSheetByName('Inventory').getRange(itemcell);
    var row = itemcell.substring(1);
    var sold = checkqty_sold1(itemname);
    SpreadsheetApp.getActive().getSheetByName('Inventory').getRange("D"+row).setValue("=SUM(F"+row+":"+row+","+sold+")");
}
function checkqty_sold1(item) {
  var ss = SpreadsheetApp.getActive();
  var allsheets = ss.getSheets();
  var sold = "";
  var count = 0;
  for(var s in allsheets){
    var sheet = allsheets[s];
    var sheetname = sheet.getName();
    if(count>0){
      sold += ","
    }
    if(sheetname!='Inventory'){
        sold += 'IF(count(FILTER('+sheetname+'!F2:F,'+sheetname+'!B2:B="'+item+'"))<=0,0,-SUM(FILTER('+sheetname+'!F2:F,'+sheetname+'!B2:B="'+item+'")))';    
        count++;
    }
  } // end of loop
  return sold;
}

Раньше я делал реальные вычисления для var sold и значение "SUM (F" + row + ":" + row ". Но я понимаю, что для заполнения данных в ячейке на самом деле требуется некоторое время. функции getrange (), getsheets (), которые я вызываю ... но я не уверен.

Переходя на текущую, я смог сделать ее немного быстрее, но только время от времени. не всегда работает так быстро. Тем не менее, требуется некоторое время для загрузки.

1 Ответ

0 голосов
/ 22 октября 2019

По моим расчетам и тестированию на вашем листе, проблема, по-видимому, в основном связана с тем, где вы выполняете поиск элемента в листе «Инвентаризация» (функция findcellbyvalue()), особенно если у вас большое количество элементов. ,Ниже я предлагаю модификацию, которая может улучшить вашу производительность:

Модификация findcellbyvalue():

  • Это не вызывает sheet.getDataRange(), поскольку это не нужно (вы можете сделать sheet.getLastRow() вместо.
  • Он использует класс TextFinder , чтобы эффективно найти нужный элемент.
function findcellbyvalue(value) {
  var sheet = SpreadsheetApp.getActive().getSheetByName('Inventory');
  var lastRow = sheet.getLastRow();  
  var searchRange = sheet.getRange(3, 1, lastRow-1, 1);

  // returns a range (of the cell)
  var finder = searchRange.createTextFinder(value).matchEntireCell(true);
  return finder.findNext().getA1Notation();
}

В дополнение к этому я рекомендую вам посетитьследующие ссылки:

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