google sheets calulation latency and dependant function calls

柔情痞子 提交于 2019-12-02 15:21:31

问题


Here is a function that pupulates a column with a formula:

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);
}

There is some latency from the time this function completes and all of the rows in column B are populated with the results of the calculation. I want to execute another function after this one but that function need to have all rows populated before it can execute. Here is how it would appear in driver script:

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

回答1:


First of all, your function needs a bit of cleanup (it can be done refined further, but that's a start):

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;      
}

Then, simply call the second function and make sure you access values to ensure calculation (if you have a pretty long latency (e.g. > 1s for each formula calc), some formulas might end up with #ERROR! value - if you want to account for that, add check ==='#ERROR!' that terminates second function upon encountering such a value and recursively restarts it):

/**
 * 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;
}


来源:https://stackoverflow.com/questions/56402123/google-sheets-calulation-latency-and-dependant-function-calls

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!