慢速归档Google Apps脚本

问题描述 投票:0回答:2

我正在制作财务跟踪表,并完成了其中的输入部分,并且工作正常。问题是,在大多数情况下,它会逐行运行,因此运行非常缓慢。除了有很多代码外,我无法弄清楚如何加快它的速度或将任何东西批处理在一起。另外,有关功能的开头和结尾的花括号未连接(当光标位于它们旁边时,它们都显示为红色),我无法理解。谁能帮忙清理一下我的代码以加快速度?这是有问题的函数:

function onClickSubmit(e) {
  var wkbk = SpreadsheetApp.getActiveSpreadsheet();
  var ss = wkbk.getSheetByName("Entry");

  //Bank Details Move
    var bankDeposit = ss.getRange(3,9).getValue();
    var bankWithdrawal = ss.getRange(3,10).getValue();
    var bankDate = ss.getRange(3,12).getValue();
    var targetSheet = wkbk.getSheetByName("BANK DS");
  if(bankDate != ""){
    //Finds first blank cell in column A, to enter new data in:
    var Avals = targetSheet.getRange("A1:A").getValues();
    var targetRow = Avals.filter(String).length + 1;
    var values = ss.getRange("A:A").getValues();
    var bankAmt = (bankDeposit - bankWithdrawal);
    var bankDetail = [[bankDate, bankAmt]];
    targetSheet.getRange(targetRow,1,1,2).setValues(bankDetail);
    targetSheet.getRange(targetRow-1,3).copyTo(targetSheet.getRange(targetRow,3));
    ss.getRange(3,9,1,4).clearContent();
  }
  //Work Chits Move
    var work1Hours = ss.getRange(5,9).getValue();
    var work1Job = ss.getRange(5,10).getValue();
    var work1Rate = ss.getRange(5,11).getValue();
    var work1Date = ss.getRange(5,12).getValue();
    var targetSheet = wkbk.getSheetByName("WORK DS");
  if(work1Date != ""){
    //Finds first blank cell in column A, to enter new data in:
    var Avals = targetSheet.getRange("A1:A").getValues();
    var targetRow = Avals.filter(String).length + 1;
    var values = ss.getRange("A:A").getValues();
    var work1Detail = [[work1Date,work1Job,work1Hours,work1Rate]];
    targetSheet.getRange(targetRow,1,1,4).setValues(work1Detail);
    targetSheet.getRange(targetRow-1,5,1,3).copyTo(targetSheet.getRange(targetRow,5,1,3));
    ss.getRange(5,9,1,4).clearContent();
  }
  var work2Hours = ss.getRange(6,9).getValue();
    var work2Job = ss.getRange(6,10).getValue();
    var work2Rate = ss.getRange(6,11).getValue();
    var work2Date = ss.getRange(6,12).getValue();
    var targetSheet = wkbk.getSheetByName("WORK DS");
  if(work2Date != ""){
    //Finds first blank cell in column A, to enter new data in:
    var Avals = targetSheet.getRange("A1:A").getValues();
    var targetRow = Avals.filter(String).length + 1;
    var values = ss.getRange("A:A").getValues();
    var work2Detail = [[work2Date,work2Job,work2Hours,work2Rate]];
    targetSheet.getRange(targetRow,1,1,4).setValues(work2Detail);
    targetSheet.getRange(targetRow-1,5,1,3).copyTo(targetSheet.getRange(targetRow,5,1,3));
    ss.getRange(6,9,1,4).clearContent();
  }
    var work3Hours = ss.getRange(7,9).getValue();
    var work3Job = ss.getRange(7,10).getValue();
    var work3Rate = ss.getRange(7,11).getValue();
    var work3Date = ss.getRange(7,12).getValue();
    var targetSheet = wkbk.getSheetByName("WORK DS");
  if(work3Date != ""){
    //Finds first blank cell in column A, to enter new data in:
    var Avals = targetSheet.getRange("A1:A").getValues();
    var targetRow = Avals.filter(String).length + 1;
    var values = ss.getRange("A:A").getValues();
    var work3Detail = [[work3Date,work3Job,work3Hours,work3Rate]];
    targetSheet.getRange(targetRow,1,1,4).setValues(work3Detail);
    targetSheet.getRange(targetRow-1,5,1,3).copyTo(targetSheet.getRange(targetRow,5,1,3));
    ss.getRange(7,9,1,4).clearContent();
  }

  //Receipts Move
  var i = 9
  var reDate = ss.getRange(i,12).getValue()
  var targetSheet = wkbk.getSheetByName("RECEIPTS DS");
  if (reDate !=""){
  while (reDate !="") {
    var reAmt = ss.getRange(i,9).getValue();
    var rePlace = ss.getRange(i,10).getValue();
    var reCat = ss.getRange(i,11).getValue();
    var reDate = ss.getRange(i,12).getValue();
    //Finds first blank cell in column A, to enter new data in:
    var Avals = targetSheet.getRange("A1:A").getValues();
    var targetRow = Avals.filter(String).length + 1;
    var values = ss.getRange("A:A").getValues();
    var reDetail = [[reDate,rePlace,reCat,reAmt]];
    targetSheet.getRange(targetRow,1,1,4).setValues(reDetail);
    targetSheet.getRange(targetRow-1,5,1,3).copyTo(targetSheet.getRange(targetRow,5,1,3));
    ss.getRange(i,9,1,4).clearContent();
    i++
  }
  }

  //Safe Move 3, 9, 13 (dates) 3-8, 9-12, 13-18
    var safeDate = ss.getRange(3,6).getValue();
    var targetSheet = wkbk.getSheetByName("SAFE DS");
  for (var i=3;i<9;i++){  
    var safeIn = ss.getRange(i,2).getValue();
    var safeOut = ss.getRange(i,4).getValue();
    var safeCnt = (safeIn - safeOut);
    var safeType = ss.getRange(i,3).getValue();

  if(safeCnt != 0){
    //Finds first blank cell in column A, to enter new data in:
    var Avals = targetSheet.getRange("A1:A").getValues();
    var targetRow = Avals.filter(String).length + 1;
    var values = ss.getRange("A:A").getValues();

    var safeDetail = [[safeDate, safeType,safeCnt]];
    targetSheet.getRange(targetRow,1,1,3).setValues(safeDetail);
//    targetSheet.getRange(targetRow-1,3).copyTo(targetSheet.getRange(targetRow,3));
    ss.getRange(i,2).clearContent();
    ss.getRange(i,4).clearContent();
  }
}
    ss.getRange(3,6).clearContent();
  //Safe Move 9 (rolls) 3-8, 9-12, 13-18
    var safeDate = ss.getRange(9,6).getValue();
    var targetSheet = wkbk.getSheetByName("SAFE DS");
  for (var i=9;i<13;i++){  
    var safeIn = ss.getRange(i,2).getValue();
    var safeOut = ss.getRange(i,4).getValue();
    var safeCnt = (safeIn - safeOut);
    var safeType = ss.getRange(i,3).getValue();

  if(safeCnt != 0){
    //Finds first blank cell in column A, to enter new data in:
    var Avals = targetSheet.getRange("A1:A").getValues();
    var targetRow = Avals.filter(String).length + 1;
    var values = ss.getRange("A:A").getValues();

    var safeDetail = [[safeDate, safeType,safeCnt]];
    targetSheet.getRange(targetRow,1,1,3).setValues(safeDetail);
    ss.getRange(i,2).clearContent();
    ss.getRange(i,4).clearContent();
  }
}
    ss.getRange(9,6).clearContent();
  //Safe Move (loose) 13-18
    var safeDate = ss.getRange(13,6).getValue();
    var targetSheet = wkbk.getSheetByName("SAFE DS");
  for (var i=13;i<19;i++){  
    var safeIn = ss.getRange(i,2).getValue();
    var safeOut = ss.getRange(i,4).getValue();
    var safeCnt = (safeIn - safeOut);
    var safeType = ss.getRange(i,3).getValue();

  if(safeCnt != 0){
    //Finds first blank cell in column A, to enter new data in:
    var Avals = targetSheet.getRange("A1:A").getValues();
    var targetRow = Avals.filter(String).length + 1;
    var values = ss.getRange("A:A").getValues();

    var safeDetail = [[safeDate, safeType,safeCnt]];
    targetSheet.getRange(targetRow,1,1,3).setValues(safeDetail);
    ss.getRange(i,2).clearContent();
    ss.getRange(i,4).clearContent();
  }
}
    ss.getRange(13,6).clearContent();
}

这里是工作表的副本,供您查看工作原理:https://docs.google.com/spreadsheets/d/1Ij7DPqQnVAR9cCpqZRf6QFUIKfgrvLvj-y5gyUPKJMw/edit?usp=sharing

提前感谢!

UPDATE我接受了两个答案中的更彻底的答案,但都提供了出色的见识。尽管此答案提供了最有用的信息,但其他答案也增加了很多。对于感兴趣的人,我使用了很多这样的编辑,还通过在循环/ if测试之外调用SpreadsheetApp方法来删除对SpreadsheetApp方法的调用,然后构建结果数组。这两个答案的组合使代码加速了大约400%,所以谢谢你们!!>

为了进一步帮助有兴趣加快Google脚本代码速度的人,这是我修改后的功能:

function onClickSubmit(e) {
  var wkbk = SpreadsheetApp.getActiveSpreadsheet();
  var ss = wkbk.getSheetByName("Entry");

  //Bank Details Move
    var t=ss.getRange(3,9,1,4).getValues()[0];
    var bankDeposit = t[0];
    var bankWithdrawal = t[1];
    var bankDate = t[3];
    var targetSheet = wkbk.getSheetByName("BANK DS");
  if(bankDate != ""){
    var targetRow = targetSheet.getRange(1,1,targetSheet.getLastRow()).getValues().length + 1;
    var bankAmt = (bankDeposit - bankWithdrawal);
    var bankDetail = [[bankDate, bankAmt]];
    targetSheet.getRange(targetRow,1,1,2).setValues(bankDetail);
    targetSheet.getRange(targetRow-1,3).copyTo(targetSheet.getRange(targetRow,3));
    ss.getRange(3,9,1,4).clearContent();
  }
  //Work Chits Move
    var vals=ss.getRange(5,9,3,4).getValues();
    var work1Hours = vals[0][0];
    var work1Job = vals[0][1];
    var work1Rate = vals[0][2];
    var work1Date = vals[0][3];
    var targetSheet = wkbk.getSheetByName("WORK DS");
  if(work1Date != ""){
    var targetRow = targetSheet.getRange(1,1,targetSheet.getLastRow()).getValues().length +1;
    var work1Detail = [[work1Date,work1Job,work1Hours,work1Rate]];
    targetSheet.getRange(targetRow,1,1,4).setValues(work1Detail);
    targetSheet.getRange(targetRow-1,5,1,3).copyTo(targetSheet.getRange(targetRow,5,1,3));
    ss.getRange(5,9,1,4).clearContent();
    targetRow = targetRow + 1;
  }
    var work2Hours = vals[1][0];
    var work2Job = vals[1][1];
    var work2Rate = vals[1][2];
    var work2Date = vals[1][3];
  if(work2Date != ""){
    var work2Detail = [[work2Date,work2Job,work2Hours,work2Rate]];
    targetSheet.getRange(targetRow,1,1,4).setValues(work2Detail);
    targetSheet.getRange(targetRow-1,5,1,3).copyTo(targetSheet.getRange(targetRow,5,1,3));
    ss.getRange(6,9,1,4).clearContent();
    targetRow = targetRow + 1;
  }
    var work3Hours = vals[2][0];
    var work3Job = vals[2][1];
    var work3Rate = vals[2][2];
    var work3Date = vals[2][3];
  if(work3Date != ""){
    var work3Detail = [[work3Date,work3Job,work3Hours,work3Rate]];
    targetSheet.getRange(targetRow,1,1,4).setValues(work3Detail);
    targetSheet.getRange(targetRow-1,5,1,3).copyTo(targetSheet.getRange(targetRow,5,1,3));
    ss.getRange(7,9,1,4).clearContent();
    targetRow = targetRow + 1
  }

  //Receipts Move
  var i = 0
  var targetSheet = wkbk.getSheetByName("RECEIPTS DS");
  var reDetail = [];
  var reVals=ss.getRange(9,9,20,4).getValues();
  var reDate = reVals[0,3]
  var targetRow = targetSheet.getRange(1,1,targetSheet.getLastRow()).getValues().length + 1;
  if (reDate !=""){
  while (reVals[i][3] !="") {
    var reAmt = reVals[i][0];
    var rePlace = reVals[i][1];
    var reCat = reVals[i][2];
    var reDate = reVals[i][3];
    var reDetailNew = [[reDate, rePlace, reCat, reAmt]];
    var reDetail = reDetail.concat(reDetailNew);
    i=i+1
  }
    targetSheet.getRange(targetRow,1,i,4).setValues(reDetail);
    targetSheet.getRange(targetRow-1,5,1,3).copyTo(targetSheet.getRange(targetRow,5,i,3));
    ss.getRange(9,9,i+1,4).clearContent();


  //Safe Move (bills)

    var targetSheet = wkbk.getSheetByName("SAFE DS");
    var Avals = targetSheet.getRange("A1:A").getValues();
    var targetRow = Avals.filter(String).length + 1;
    var safeVals = ss.getRange(3,2,16,5).getValues();
    var safeDate = safeVals[0][4];
  for (var i=0;i<6;i++){
    var safeIn = safeVals[i][0];
    var safeOut = safeVals[i][2];
    var safeCnt = (safeIn - safeOut);
    var safeType = safeVals[i][1];

  if(safeCnt != 0){    
    var safeDetail = [[safeDate, safeType,safeCnt]];
    targetSheet.getRange(targetRow,1,1,3).setValues(safeDetail);
    targetRow = targetRow + 1;
  }
}
  //Safe Move (rolls)
    var safeDate = safeVals[6][4];
  for (var i=6;i<10;i++){  
    var safeIn = safeVals[i][0];
    var safeOut = safeVals[i][2];
    var safeCnt = (safeIn - safeOut);
    var safeType = safeVals[i][1];

  if(safeCnt != 0){
    var safeDetail = [[safeDate, safeType,safeCnt]];
    targetSheet.getRange(targetRow,1,1,3).setValues(safeDetail);
    targetRow = targetRow + 1;
  }
}
  //Safe Move (loose)
    var safeDate = safeVals[10][4];
  for (var i=10;i<16;i++){  
    var safeIn = safeVals[i][0];
    var safeOut = safeVals[i][2];
    var safeCnt = (safeIn - safeOut);
    var safeType = safeVals[i][1];

  if(safeCnt != 0){
    var safeDetail = [[safeDate, safeType,safeCnt]];
    targetSheet.getRange(targetRow,1,1,3).setValues(safeDetail);
    targetRow = targetRow + 1;
  }
}
    ss.getRange(3,2,16,1).clearContent();
    ss.getRange(3,4,16,1).clearContent();
    ss.getRange(3,6,16,1).clearContent();
}
}

我正在制作财务跟踪表,并完成了其中的输入部分,并且工作正常。问题是,在大多数情况下,它会逐行运行,因此运行非常缓慢。除了很多...

performance google-apps-script optimization google-sheets
2个回答
1
投票

这里有一些建议:


1
投票

您的脚本很慢,因为它正在多次调用SpreadsheetApp方法。为了提高其性能,您应该更改逻辑以减少这些调用,并使用数组来操纵数据。

© www.soinside.com 2019 - 2024. All rights reserved.