0

Ich habe dieses Stück Skript. Sie filtern einen Bereich nach einem Kriterium, Dann kopiert es Werte, die Kriterien in einem bestimmten Blatt dann beachten Es löscht alle Zeilen im Originalblatt, die die Kriterien erfüllen. Also, wenn mein Bereich mehr als 1000 Zeilen enthält, heißt es mir Fehler: Google App Script Timeout.Wie reduziere ich die Ausführungszeit dieses Skripts (Google App Script Timeout)

Ich habe meinen Code hier, können Sie mir helfen, eine bessere Leistung über die Ausführungszeit dieses Skripts zu bekommen?

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'); 
    } 
} 
+0

Ihr Code ist unvollständig. Bitte fügen Sie sie erneut ein. Sie haben einige Klammern verloren. – Cooper

+0

Jetzt ist es in Ordnung @ Cooper –

+0

@ Cooper Ich fand die perfekte Lösung in einer Ihrer Vergangenheit Antwort https://stackoverflow.com/questions/42632622/use-google-apps-script-to-loop-through-the- Spalte/42633934 # 42633934 <- diese, also was noch? Vielen Dank! –

Antwort

0

Sie könnten versuchen, diese:

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

Und Sie könnten die gleiche Sache auf Ihre Zieldaten berücksichtigen.

+0

Wenn ich Pause mache, wird es nur 1 Zeile anhängen, aber mein Filterbereich enthält mehr als 1000 Zeilen und ich möchte, dass mein Skript die Werte aller Zeilen setzen –

+0

Wenn ich raten würde würde ich sagen, dass eine ressourcenintensive Methode wie getValues ​​() innerhalb einer Schleife verursacht wahrscheinlich Ihr Problem. – mongoose36

Verwandte Themen