如何减少此脚本的执行时间(Google app脚本超时)

时间:2017-09-02 17:14:08

标签: javascript performance google-apps-script google-spreadsheet-api array-filter

我有这个脚本。 它按标准过滤范围, 然后它复制尊重特定工作表中的条件的值 然后它删除原始工作表中符合条件的所有行。 因此,如果我的范围包含超过1000行,则说错误:Google应用程序脚本超时。

我把我的代码放在这里,你可以帮助我更好地了解这个脚本的执行时间吗?

function trasferisciDati() {
var ui = SpreadsheetApp.getUi();
var response = ui.prompt('Inserisci il mese dei dati da esportare', '(Esempio: agosto (tutto minuscolo))', ui.ButtonSet.OK_CANCEL);
var inizioTRASFERISCIVALORI = Utilities.formatDate(new Date(), "CET", "HH:mm:ss.SSS");
 if (response.getSelectedButton() == ui.Button.OK) {
//get filtered range and set values to the new range
var description = ui.prompt('Inserisci una descrizione per questa esportazione', 'apparirà come tag dell\'esportrazione', ui.ButtonSet.OK_CANCEL);
var sourceData = SpreadsheetApp.openById("1XkYhjdQfgU7mVCR7E8mfZsf292I-cJ16PnpCimnd1v8").getSheetByName("Prova");
var destinationData = SpreadsheetApp.openById("1cdXMqqBwgWK5nCQUtAP_TyIIDOHksS7wWvSG4jRu658").getSheetByName("Prova");
var lastRow = sourceData.getLastRow();
var data = sourceData.getRange(1, 1, lastRow, 1).getValues();
var chiave = response.getResponseText();
  for(var i=0;i<data.length;i++)
{
 if (data[i][0] == chiave) {
   var filteredRow = sourceData.getRange(i+1,1,1,5).getValues();
destinationData.appendRow(filteredRow[0]);
 } 
}

//number of records of the filtered range
 var lastRow = destinationData.getLastRow();
var data = destinationData.getRange(1, 6, lastRow, 1).getValues();
var loop = 0  
  for(var i=0;i<data.length;i++)
{
  if(!data[i][0])
  {
   var loop = loop + 1
  }
}
Logger.log(Utilities.formatString('%1.0f', Math.floor(loop)))
 //appendi timestamp al rigo ed eventuale descrizione aggiuntiva inserita dall'utente
 var lastRow = destinationData.getLastRow();
 var data = destinationData.getRange(1, 6, lastRow, 1).getValues();
 var timestamp = Utilities.formatDate(new Date(), "CET", "dd/MM/YYYY HH.mm.ss") 
 for(var i=0;i<data.length;i++)
{
  if(!data[i][0])
  {
destinationData.getRange(i+1,6).setValue(timestamp)
destinationData.getRange(i+1,7).setValue(description.getResponseText())
  }
}
 //cancella l'intervallo originale
var maxRows = sourceData.getMaxRows();
var data = sourceData.getRange(1, 1, maxRows, 1).getValues();
  for(var i=data.length; i>=0;i--) 
{
 if (data[i] == chiave) {
sourceData.deleteRow(i+1)
  } 
  }
   var fineTRASFERISCIVALORI = Utilities.formatDate(new Date(), "CET", "HH:mm:ss.SSS");
   var inTime=inizioTRASFERISCIVALORI.split(":");
   var outTime= fineTRASFERISCIVALORI.split(":");
   var hr = outTime[0] - inTime[0]; 
   var min = ((outTime[1] - inTime[1])+hr*60)%60;
   var sec = ((outTime[2] - inTime[2])+min*60)%60;
   var duration = Utilities.formatString('%2.0f', Math.floor(hr)) + 'h ' + Utilities.formatString('%2.0f', Math.floor(min)) + 'm ' + Utilities.formatString('%2.0f', sec) + 's';  
   ui.alert('Trasferite '+ Utilities.formatString('%1.0f', Math.floor(loop)) +' righe in '+ duration, ui.ButtonSet.OK)
 } else if (response.getSelectedButton() == ui.Button.CANCEL) {
   SpreadsheetApp.getUi().alert('L\'utente ha annullato l\'operazione');
 }  else {
   SpreadsheetApp.getUi().alert('L\'utente ha chiuso la finestra di dialogo');
   }
}

1 个答案:

答案 0 :(得分:0)

你可以试试这个:

  var data = sourceData.getRange(1, 1, lastRow, 5).getValues();
  var chiave = response.getResponseText();
  for(var i=0;i<data.length;i++)
  {
     if (data[i][0] == chiave) 
     {
       //var filteredRow = sourceData.getRange(i+1,1,1,5).getValues();
       destinationData.appendRow(data[i]);
     } 
  }

您可能会在目标数据上考虑相同的事情。