I am trying to write my first google app script, inside a google spreadsheet. Like many people I have a problem with the script execution speed. I spent quite a bit of time trying to do this.
I understood that it was necessary to avoid google API calls as much as possible (.getDataRange(), .getRow(), getActiveSpreadsheet()) and to work with arrays.
Depending on the sheet were the user is, different scripts are executed. The code written for the sheet "0- FORMULAIRE" is too slow. I want to optimize it. In this sheet my script take 1s to execute each time. Is there anything else I can do?
I searched for myself, but now I have no more ideas ... Any help will be welcome... Thank you very much!
The code to optimize :
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getActiveSheet();
var nom_feuille_actuelle = ss.getActiveSheet().getName();
//
if (nom_feuille_actuelle == "0- FORMULAIRE") {
// --- Fonction 2 ---
var debut_colonne_cases = 17
var colonne_statut = 23
//
var cellule_actuelle = s.getActiveRange();
var ligne = cellule_actuelle.getRow();
var colonne = cellule_actuelle.getColumn();
if (debut_colonne_cases <= colonne <= debut_colonne_cases + 3) {
var matrice = s.getRange(ligne,debut_colonne_cases,1,7);
var valeurs_matrice = matrice.getValues();
var valeur_cellule = valeurs_matrice[0][colonne - debut_colonne_cases];
var valeur_cellule_colonne_plus_1 = valeurs_matrice[0][1];
var valeur_cellule_colonne_plus_3 = valeurs_matrice[0][3];
if(colonne == debut_colonne_cases) {
if (valeur_cellule == "VRAI") {
var nouvelles_valeurs_matrice = [["VRAI","FAUX","FAUX","FAUX",,,"Réussi"]];
matrice.setValues(nouvelles_valeurs_matrice);
s.getRange(ligne, colonne_statut).clearDataValidations();
}
else if (valeur_cellule == "FAUX") {
var nouvelles_valeurs_matrice = [["FAUX","FAUX","FAUX","FAUX",,,"-------------------"]];
matrice.setValues(nouvelles_valeurs_matrice);
s.getRange(ligne, colonne_statut).clearDataValidations();
};
}
else if(colonne == debut_colonne_cases + 1) {
if (valeur_cellule == "VRAI" && valeur_cellule_colonne_plus_3 == "VRAI") {
var nouvelles_valeurs_matrice = [["FAUX","VRAI","FAUX","VRAI",,,"Souhaité"]];
matrice.setValues(nouvelles_valeurs_matrice);
s.getRange(ligne, colonne_statut).clearDataValidations();
}
else if (valeur_cellule == "VRAI") {
var nouvelles_valeurs_matrice = [["FAUX","VRAI","FAUX","FAUX",,,"Echec"]];
matrice.setValues(nouvelles_valeurs_matrice);
s.getRange(ligne, colonne_statut).clearDataValidations();
}
else if (valeur_cellule == "FAUX" && valeur_cellule_colonne_plus_3 == "VRAI") {
var nouvelles_valeurs_matrice = [["FAUX","FAUX","FAUX","VRAI",,,"Souhaité"]];
matrice.setValues(nouvelles_valeurs_matrice);
s.getRange(ligne, colonne_statut).clearDataValidations();
}
else if (valeur_cellule == "FAUX") {
var nouvelles_valeurs_matrice = [["FAUX","FAUX","FAUX","FAUX",,,"-------------------"]];
matrice.setValues(nouvelles_valeurs_matrice);
s.getRange(ligne, colonne_statut).clearDataValidations();
};
}
else if(colonne == debut_colonne_cases + 2) {
if (valeur_cellule == "VRAI") {
var nouvelles_valeurs_matrice = [["FAUX","FAUX","VRAI","FAUX",,,"-- Précisez --"]];
matrice.setValues(nouvelles_valeurs_matrice);
s.getRange(ligne, colonne_statut).setDataValidation(SpreadsheetApp.newDataValidation()
.setAllowInvalid(true)
.requireValueInList(["-- Précisez --", "1- Démarré", "2- Sous peu", "3- Lointain"], true)
.build());
}
else if (valeur_cellule == "FAUX") {
var nouvelles_valeurs_matrice = [["FAUX","FAUX","FAUX","FAUX",,,"-------------------"]];
matrice.setValues(nouvelles_valeurs_matrice);
s.getRange(ligne, colonne_statut).clearDataValidations();
};
}
else if(colonne == debut_colonne_cases + 3) {
if (valeur_cellule == "VRAI" && valeur_cellule_colonne_plus_1 == "VRAI") {
var nouvelles_valeurs_matrice = [["FAUX","VRAI","FAUX","VRAI",,,"Souhaité"]];
matrice.setValues(nouvelles_valeurs_matrice);
s.getRange(ligne, colonne_statut).clearDataValidations();
}
else if (valeur_cellule == "VRAI") {
var nouvelles_valeurs_matrice = [["FAUX","FAUX","FAUX","VRAI",,,"Souhaité"]];
matrice.setValues(nouvelles_valeurs_matrice);
s.getRange(ligne, colonne_statut).clearDataValidations();
}
else if (valeur_cellule == "FAUX" && valeur_cellule_colonne_plus_1 == "VRAI") {
var nouvelles_valeurs_matrice = [["FAUX","VRAI","FAUX","FAUX",,,"Echec"]];
matrice.setValues(nouvelles_valeurs_matrice);
s.getRange(ligne, colonne_statut).clearDataValidations();
}
else if (valeur_cellule == "FAUX") {
var nouvelles_valeurs_matrice = [["FAUX","FAUX","FAUX","FAUX",,,"-------------------"]];
matrice.setValues(nouvelles_valeurs_matrice);
s.getRange(ligne, colonne_statut).clearDataValidations();
};
};
};
}
The entire code for my function onEdit :
function onEdit(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getActiveSheet();
var nom_feuille_actuelle = ss.getActiveSheet().getName();
//
if (nom_feuille_actuelle == "0- FORMULAIRE") {
// --- Fonction 2 ---
var debut_colonne_cases = 17
var colonne_statut = 23
//
var cellule_actuelle = s.getActiveRange();
var ligne = cellule_actuelle.getRow();
var colonne = cellule_actuelle.getColumn();
if (debut_colonne_cases <= colonne <= debut_colonne_cases + 3) {
var matrice = s.getRange(ligne,debut_colonne_cases,1,7);
var valeurs_matrice = matrice.getValues();
var valeur_cellule = valeurs_matrice[0][colonne - debut_colonne_cases];
var valeur_cellule_colonne_plus_1 = valeurs_matrice[0][1];
var valeur_cellule_colonne_plus_3 = valeurs_matrice[0][3];
if(colonne == debut_colonne_cases) {
if (valeur_cellule == "VRAI") {
var nouvelles_valeurs_matrice = [["VRAI","FAUX","FAUX","FAUX",,,"Réussi"]];
matrice.setValues(nouvelles_valeurs_matrice);
s.getRange(ligne, colonne_statut).clearDataValidations();
}
else if (valeur_cellule == "FAUX") {
var nouvelles_valeurs_matrice = [["FAUX","FAUX","FAUX","FAUX",,,"-------------------"]];
matrice.setValues(nouvelles_valeurs_matrice);
s.getRange(ligne, colonne_statut).clearDataValidations();
};
}
else if(colonne == debut_colonne_cases + 1) {
if (valeur_cellule == "VRAI" && valeur_cellule_colonne_plus_3 == "VRAI") {
var nouvelles_valeurs_matrice = [["FAUX","VRAI","FAUX","VRAI",,,"Souhaité"]];
matrice.setValues(nouvelles_valeurs_matrice);
s.getRange(ligne, colonne_statut).clearDataValidations();
}
else if (valeur_cellule == "VRAI") {
var nouvelles_valeurs_matrice = [["FAUX","VRAI","FAUX","FAUX",,,"Echec"]];
matrice.setValues(nouvelles_valeurs_matrice);
s.getRange(ligne, colonne_statut).clearDataValidations();
}
else if (valeur_cellule == "FAUX" && valeur_cellule_colonne_plus_3 == "VRAI") {
var nouvelles_valeurs_matrice = [["FAUX","FAUX","FAUX","VRAI",,,"Souhaité"]];
matrice.setValues(nouvelles_valeurs_matrice);
s.getRange(ligne, colonne_statut).clearDataValidations();
}
else if (valeur_cellule == "FAUX") {
var nouvelles_valeurs_matrice = [["FAUX","FAUX","FAUX","FAUX",,,"-------------------"]];
matrice.setValues(nouvelles_valeurs_matrice);
s.getRange(ligne, colonne_statut).clearDataValidations();
};
}
else if(colonne == debut_colonne_cases + 2) {
if (valeur_cellule == "VRAI") {
var nouvelles_valeurs_matrice = [["FAUX","FAUX","VRAI","FAUX",,,"-- Précisez --"]];
matrice.setValues(nouvelles_valeurs_matrice);
s.getRange(ligne, colonne_statut).setDataValidation(SpreadsheetApp.newDataValidation()
.setAllowInvalid(true)
.requireValueInList(["-- Précisez --", "1- Démarré", "2- Sous peu", "3- Lointain"], true)
.build());
}
else if (valeur_cellule == "FAUX") {
var nouvelles_valeurs_matrice = [["FAUX","FAUX","FAUX","FAUX",,,"-------------------"]];
matrice.setValues(nouvelles_valeurs_matrice);
s.getRange(ligne, colonne_statut).clearDataValidations();
};
}
else if(colonne == debut_colonne_cases + 3) {
if (valeur_cellule == "VRAI" && valeur_cellule_colonne_plus_1 == "VRAI") {
var nouvelles_valeurs_matrice = [["FAUX","VRAI","FAUX","VRAI",,,"Souhaité"]];
matrice.setValues(nouvelles_valeurs_matrice);
s.getRange(ligne, colonne_statut).clearDataValidations();
}
else if (valeur_cellule == "VRAI") {
var nouvelles_valeurs_matrice = [["FAUX","FAUX","FAUX","VRAI",,,"Souhaité"]];
matrice.setValues(nouvelles_valeurs_matrice);
s.getRange(ligne, colonne_statut).clearDataValidations();
}
else if (valeur_cellule == "FAUX" && valeur_cellule_colonne_plus_1 == "VRAI") {
var nouvelles_valeurs_matrice = [["FAUX","VRAI","FAUX","FAUX",,,"Echec"]];
matrice.setValues(nouvelles_valeurs_matrice);
s.getRange(ligne, colonne_statut).clearDataValidations();
}
else if (valeur_cellule == "FAUX") {
var nouvelles_valeurs_matrice = [["FAUX","FAUX","FAUX","FAUX",,,"-------------------"]];
matrice.setValues(nouvelles_valeurs_matrice);
s.getRange(ligne, colonne_statut).clearDataValidations();
};
};
};
}
//
//
else if (nom_feuille_actuelle == "PARAMETRES") {
// --- Fonction 1 ---
//var ss = SpreadsheetApp.getActiveSpreadsheet();
//var s = ss.getActiveSheet()
//var s = ss.getSheetByName("PARAMETRES");
var ligne = ss.getActiveSheet().getActiveRange().getRow();
var valeurs_colonne_A = s.getRange("A:A").getValues();
var valeur_ligne_actuelle_colonne_B = s.getRange(ligne, 2).getValues();
if (!isNaN(parseFloat(valeur_ligne_actuelle_colonne_B)) && isFinite(valeur_ligne_actuelle_colonne_B)) { // Vérifie si la valeur récupérée colonne B est bien un nombre ou pas
for(var i = ligne; i < valeur_ligne_actuelle_colonne_B; i++){
if(valeurs_colonne_A[i] == "hide") {
s.hideRows(i+1, 1);
}
else {
s.showRows(i+1, 1);
}
}
}
};
};