задержка калькуляции и вызовы зависимых функций - PullRequest
0 голосов
/ 01 июня 2019

Вот функция, которая оцифровывает столбец с формулой:

function fillAccount(lastRow) {

  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('B1').activate();
  spreadsheet.getCurrentCell().setValue(' ');
  spreadsheet.getRange('B2').activate()
  .setFormula('=ifna(vlookup(C2,Accounts!$A$1:$A$7,1,false),B1)');
  spreadsheet.getRange('B3').activate();
  var currentCell = spreadsheet.getCurrentCell();
  spreadsheet.getRange('B3:B' + lastRow).activate();
  spreadsheet.getRange('B2').copyTo(spreadsheet.getActiveRange(), 
  SpreadsheetApp.CopyPasteType.PASTE_FORMULA, false);
}

Существует некоторая задержка с момента завершения этой функции, и все строки в столбце B заполняются результатами вычисления,Я хочу выполнить другую функцию после этой, но этой функции необходимо заполнить все строки, прежде чем она сможет выполняться.Вот как это будет выглядеть в скрипте драйвера:

fillAccount(lastrow);
copyAllData(); // this needs to have all rows in column B fully 
               // populated.

1 Ответ

0 голосов
/ 01 июня 2019

Прежде всего, ваша функция нуждается в некоторой очистке (это можно сделать и дальше, но это только начало):

function fillAccount(lastRow) {
  var spreadsheet = getSpread(); //custom method calling the Spreadsheet, change to your logic;

  var colB = spreadsheet.getRange('B1:B'+lastRow);
  var row1 = colB.getCell(1,1);
  var row2 = colB.getCell(2,1);      

  row1.setValue(' ');
  row2.setFormula('=ifna(vlookup(C2,RENAMED!$A$1:$A$7,1,false),B1)');
  row2.copyTo(colB.offset(1,0,lastRow-1), SpreadsheetApp.CopyPasteType.PASTE_FORMULA, false);

  SpreadsheetApp.flush(); //make sure changes are applied;      
}

Затем просто вызовите вторую функцию и убедитесь, что у вас есть доступ к значениям.чтобы обеспечить вычисление (если у вас довольно большая задержка (например,> 1 для каждой формулы вычислений), некоторые формулы могут заканчиваться значением #ERROR! - если вы хотите учесть это, добавьте проверку ==='#ERROR!', которая завершает вторую функцию послевстречая такое значение и рекурсивно перезапускает его):

/**
 * Caller function;
 */
function triggerFill() {

  //...your logic and lastRow initialization here;

  fillAccount(lastRow);
  copyAllData();
}

/**
 * Function accessing updated values;
 */
function copyAllData() {
  var spreadsheet = getSpread(); //custom method calling the Spreadsheet, change to your logic;
  var dataRange = spreadsheet.getDataRange(); //just an example that gets all data;
  var values = dataRange.getValues(); //just an example that gets all values;
  for(var i=0; i<values.length; i++) {
    if(values[i].indexOf('#ERROR!')!==-1) { //for high latency;
      Utilities.sleep(t) //change t to number of ms to wait to your liking;
      return copyAllData();
    }
  }

  //do other stuff, like cell copy;
}
...