Циклический просмотр данных и настройка формулы IndexMatch на основе значения ячейки - слишком медленно из-за .getValue () - PullRequest
0 голосов
/ 18 октября 2018

У меня есть код, который проходит по моим строкам и в зависимости от значения в столбце 2 возвращает различные типы формул IndexMatch.Мой код работает очень хорошо и помещает формулы в соответствующие столбцы, однако это очень медленно.

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

Теперь мне нужно выяснить, как улучшить скорость кода, но, поскольку я новичок в кодировании, я не совсем уверен, как решить эту проблему.

Вот что у меня есть:

function setFormulas() {

  var ss = SpreadsheetApp.getActiveSpreadsheet(); //gets the workbook being used
  var sheet = ss.getSheetByName("Open Requests"); //gets the active worksheet


  var sheetnametoWatch ="Open Requests"; //defines sheet 

  var columnnumbertoWatch = 14
  var valuetoWatch = ""
  var CostCenter = "'Open Requests'!"
  var lastrow = sheet.getLastRow();

  var datarange = sheet.getRange(11,2,lastrow -1,50).getValues()
  var row = 10

  for (i=0;i<datarange.length;i++){
    var rowID = 10 + i + 1

    if (datarange[i][0] == "CC"){
      var addedCell = '=CONCATENATE(F'+rowID+',N'+rowID+',K'+rowID+')';
      sheet.getRange(row + i+1,35).setFormula(addedCell);

      var MatchedCell = '=INDEX(Input!$Q:$Q,MATCH('+CostCenter+'$AI$'+rowID+',Input!$K:$K,0))';
      sheet.getRange(row + i+1,17).setFormula(MatchedCell); 

      sheet.getRange(row + i+1,18).setValue("kristin.j@ni.com")
    }
    else if (datarange[i][0] == "CC + TM1"){
      var addedCell = '=CONCATENATE(F'+rowID+',N'+rowID+',K'+rowID+')';
      sheet.getRange(row + i+1,35).setFormula(addedCell);

      var MatchedCell = '=INDEX(Input!$Q:$Q,MATCH('+CostCenter+'$AI$'+rowID+',Input!$K:$K,0))';
      sheet.getRange(row + i+1,17).setFormula(MatchedCell); 

      sheet.getRange(row + i+1,18).setValue("kristin.j@ni.com")
    }
    else if (datarange[i][0] == "GC"){
      sheet.getRange(row + i+1,18).setValue("kristin.j@ni.com")
    }

  }

 }

Итак, как вы можете видеть, я перебираю данные и затем в зависимости от того, будет ли столбец = CC, CC + TM1, GC, будетустановите другие ячейки равными соответствующей формуле.

Было бы здорово, если бы кто-нибудь помог мне ускорить этот процесс.

1 Ответ

0 голосов
/ 19 октября 2018

У меня возникают некоторые проблемы с точным следованием того, что делает код, но на высоком уровне я думаю, что вы хотите сделать следующее: вместо установки формул для конкретных ячеек при циклическом цикле for используйте циклвыяснить, какие ячейки должны быть установлены, какие формулы и хранить эту информацию.Затем в конце цикла for вызовите sheet.getRange(x,y).setFormula(Formula); всего несколько раз, возможно, один раз для каждой формулы.

Похоже, это может сработать?

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