简体   繁体   中英

Slow Execution for Copying Data from One Sheet to Another Using Google App Script

I would like your help in speeding up this script please. I got the script from an answer from Stack overflow. It is taking longer than it should (30-50 seconds), although previously it didn't.

function FormExec() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sinput = ss.getSheetByName("Slip");

  var rng1 = sinput.getRange("B3").getValue();
  var rng2 = sinput.getRange("D3").getValue();
  var rng3 = sinput.getRange("B5").getValue();
  var rng4 = sinput.getRange("D5").getValue();
  var rng5 = sinput.getRange("B7").getValue();
  var rng6 = sinput.getRange("D7").getValue();
  var rng7 = sinput.getRange("J1").getValue();

  if(rng1 == 0 || rng2 == 0 || rng3 == 0 || rng4 == 0 || rng5 == 0 || rng6 == 0) {

  Browser.msgBox('Please fill all required fields.');

  } else {

  var soutput = ss.getSheetByName("Form Responses 5");
  var input = sinput.getRange(1, 10, 15).getValues();
  var flatin = [].concat.apply([], input);
  soutput.getRange(soutput.getLastRow()+1, 1,1,15).setValues([flatin]);
  soutput.insertRowAfter(soutput.getLastRow());  
    resetSlip();
  };
}

function resetSlip() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sinput = ss.getSheetByName("Slip");
  sinput.getRange("B3").clearContent();
  sinput.getRange("B11:H11").clearContent();
  sinput.getRange("B19").clearContent();
  sinput.getRange("D3").clearContent();
  sinput.getRange("B21:E21").clearContent();
  sinput.getRange("B5").clearContent();
  sinput.getRange("B15:E15").clearContent();
  sinput.getRange("B13:I13").clearContent();
  sinput.getRange("D5").clearContent();
  sinput.getRange("B9:I9").clearContent();
  sinput.getRange("B7").clearContent();
  sinput.getRange("D7").clearContent();
  sinput.getRange("B17:C17").clearContent();
  sinput.getRange("B5").setFormula("=K1");
  sinput.getRange("D3").setValue("=L1");
  sinput.getRange("B7").setValue("=M1");
}

This is probably the best your going to get. Personally, I wouldn't mess around with Form Response Pages. I'd recommend using an onFormSubmit trigger and building a page of your own.

function FormExec() {
  var ss = SpreadsheetApp.getActive();
  var sh=ss.getSheetByName("Slip");
  var ui=SpreadsheetApp.getUi();

  var rng1 = sh.getRange("B3").getValue();
  var rng2 = sh.getRange("D3").getValue();
  var rng3 = sh.getRange("B5").getValue();
  var rng4 = sh.getRange("D5").getValue();
  var rng5 = sh.getRange("B7").getValue();
  var rng6 = sh.getRange("D7").getValue();
  var rng7 = sh.getRange("J1").getValue();

  if(rng1==0||rng2==0||rng3==0||rng4==0||rng5==0||rng6==0) {
    ui.alert('Please fill all required fields.');
  }else{
    var soutput=ss.getSheetByName("Form Responses 5");
    var input=sh.getRange(1,10,15,1).getValues();
    var flatin = input.map(function(r){return r[0];});
    soutput.getRange(soutput.getLastRow()+1, 1,1,flatin.length).setValues([flatin]);
    soutput.insertRowAfter(soutput.getLastRow());  
    sh.getRange("B3").clearContent();
    sh.getRange("B11:H11").clearContent();
    sh.getRange("B19").clearContent();
    sh.getRange("D3").clearContent();
    sh.getRange("B21:E21").clearContent();
    sh.getRange("B5").clearContent();
    sh.getRange("B15:E15").clearContent();
    sh.getRange("B13:I13").clearContent();
    sh.getRange("D5").clearContent();
    sh.getRange("B9:I9").clearContent();
    sh.getRange("B7").clearContent();
    sh.getRange("D7").clearContent();
    sh.getRange("B17:C17").clearContent();
    sh.getRange("B5").setFormula("=K1");
    sh.getRange("D3").setFormula("=L1");
    sh.getRange("B7").setFormula("=M1");
  }
}

Scripts that affect the spreadsheet looks tend to be slow. I'd reorganize my date to make it possible to get all your data and one time in an array and process it all at one time and replace it with a minimum number of setValues() and then a SpreadsheetApp.flush().

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM