0

J'ai ce script. Il filtre une plage par un critère, puis il copie les valeurs qui respectent les critères dans une feuille spécifique puis il supprime toute la ligne de la feuille d'origine qui respecte les critères. Donc, si ma gamme contient plus de 1000 lignes, il m'a été dit erreur: délai de script Google app.Comment faire pour réduire le temps d'exécution de ce script (délai d'attente de script de l'application Google)

J'ai mis mon code ici, pouvez-vous m'aider à obtenir une meilleure performance sur le temps d'exécution de ce script?

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

Votre code est incomplet. Veuillez coller à nouveau. Vous avez manqué quelques parenthèses. – Cooper

+0

maintenant C'est OK @Cooper –

+0

@Cooper J'ai trouvé la solution parfaite dans l'une de vos réponses passées https://stackoverflow.com/questions/42632622/use-google-apps-script-to-loop-through-the-whole- colonne/42633934 # 42633934 <- celui-ci, alors quoi d'autre? Je vous remercie! –

Répondre

0

Vous pouvez essayer ceci:

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

Et vous pourriez envisager la même chose sur vos données de destination.

+0

Si je mets un break, il ajoutera seulement 1 ligne mais ma gamme de filtres contient plus de 1000 lignes et je veux que mon script mette les valeurs de toutes ces lignes –

+0

Si je devais deviner je dirais qu'en utilisant une méthode intensive comme getValues ​​() dans une boucle est probablement à l'origine de votre problème. – mongoose36