Page 1 sur 1

Lancer un script sur plusieurs feuilles

Publié : 26 sept. 2024 13:07
par Gilles
Bonjour,

Débutant en codage, je suis bloqué sur mon projet car je ne sais pas utiliser "openByUrl" ou "OpenByID"...

Le script de la fonction est OK (déclenché par le Menu)...
Le voici :

function onOpen(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var menu=[{name:"Vider les cases à cocher", functionName:"Vider"}]
ss.addMenu("Réinitialiser",menu);
}

function Vider() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
sheet.getRange('F3:F32').createTextFinder("TRUE").replaceAllWith("FALSE");
}


Il me permet de décocher toutes les cases à cocher de la colonne F, lignes 3 à 32.

Mon problème :  je souhaite que ce script se lance sur plusieurs feuilles afin de m'éviter d'aller sur chaque feuille pour le lancer...
Les feuilles se nomment "1" jusqu'à "10".

Apparemment il faut créer une table avec les URL et faire une boucle "for" mais j'avoue qu'on est proche du chinois pour moi !

Quelqu'un peut-il m'aider ??

D'avance merci pour votre retour !

Gilles

 

Re: Lancer un script sur plusieurs feuilles

Publié : 26 sept. 2024 13:10
par Gilles
D'autre part, est-il possible que ce futur script soit lancé par un bouton depuis un autre fichier Google sheet ?? (les 2 fichiers sont liés par des fonctions IMPORTRANGE et "communiquent entre eux")
J'entends bien que le script doit se trouver sur l'App Script du fichier qui va lancer le script, mais je souhaite que le script s'exécute sur un autre fichier.

Re: Lancer un script sur plusieurs feuilles

Publié : 27 sept. 2024 11:26
par Gilles
Bonjour,

J'ai trouvé une solution :

function onOpen(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var menu=[{name:"Vider les cases à cocher", functionName:"Vider"}]
ss.addMenu("Réinitialiser",menu);
}
function Vider() {
  var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("1");
  var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("2");
  var sheet3 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("3");
  var sheet4 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("4");
  var sheet5 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("5");
  var sheet6 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("6");
  var sheet7 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("7");
  var sheet8 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("8");
  var sheet9 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("9");
  var sheet10 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("10");
    sheet1.getRange('F3:F32').createTextFinder("TRUE").replaceAllWith("FALSE");
    sheet2.getRange('F3:F32').createTextFinder("TRUE").replaceAllWith("FALSE");
    sheet3.getRange('F3:F32').createTextFinder("TRUE").replaceAllWith("FALSE");
    sheet4.getRange('F3:F32').createTextFinder("TRUE").replaceAllWith("FALSE");
    sheet5.getRange('F3:F32').createTextFinder("TRUE").replaceAllWith("FALSE");
    sheet6.getRange('F3:F32').createTextFinder("TRUE").replaceAllWith("FALSE");
    sheet7.getRange('F3:F32').createTextFinder("TRUE").replaceAllWith("FALSE");
    sheet8.getRange('F3:F32').createTextFinder("TRUE").replaceAllWith("FALSE");
    sheet9.getRange('F3:F32').createTextFinder("TRUE").replaceAllWith("FALSE");
    sheet10.getRange('F3:F32').createTextFinder("TRUE").replaceAllWith("FALSE");
}

Ce qui amène une autre question : comment faire si ma sheet change de nom, sans avoir à modifier le script ???? (ex: "1" devient "Test1")
 

Re: Lancer un script sur plusieurs feuilles

Publié : 30 sept. 2024 11:24
par papa s
Bonjour,

Vous pouvez utiliser getSheets()[ i ] ou i est la position de la feuille (de 0 à 9 dans votre cas).

Et pour la boucle for voici comment éviter d'écrire toutes vos lignes : 
function Vider() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets(); // Récupérer toutes les feuilles

  for (var i = 0; i < sheets.length; i++) { // Boucle sur toutes les feuilles
    var sheet = sheets[ i ];
    sheet.getRange('F3:F32').createTextFinder("TRUE").replaceAllWith("FALSE");
  }
}

 

Re: Lancer un script sur plusieurs feuilles

Publié : 02 oct. 2024 13:17
par Gilles
Merci pour votre retour...
Super idée ! Cela me permettrait de changer le nom des feuilles sans avoir à modifier le script. Top !

Le souci dans mon cas c'est le l'ordre des feuilles peut changer aussi...
Savez-vous si cela est possible en utilisant l'url ou l'ID de la feuille ?


 

Re: Lancer un script sur plusieurs feuilles

Publié : 03 oct. 2024 16:33
par papa s
Intéressant.

Je n'ai pas trouvé de méthode "getSheetById()" ou quelque chose de similaire.

Du coup, voici deux solutions que je vous propose :
  1. Utiliser une cellule spécifique comme identifiant : Vous pouvez définir une cellule dans chaque feuille, par exemple en A1, où vous indiquez un texte identifiable comme "A vider". Ensuite, le script peut parcourir toutes les feuilles et appliquer la fonction uniquement sur celles où cette cellule contient ce texte. C’est une solution simple qui permet d’ajouter ou de retirer des feuilles de manière flexible. Toutefois, je ne suis pas fan car cela ajoute un élément visible dans les feuilles (un texte en A1) qui n’est pas nécessaire pour les utilisateurs.
  2. Identifier les feuilles par leur "sheetId" : Une autre solution consiste à récupérer l'ID unique des feuilles avec un script comme celui-ci :
   function afficherId() {
     var ss = SpreadsheetApp.getActiveSpreadsheet();
     var sheets = ss.getSheets();
     for (var i = 0; i < sheets.length; i++) {
       Logger.log('Nom de la feuille: ' + sheets[ i ].getName() + ', ID: ' + sheets[ i ]
.getSheetId());
     }
   }
   Cela vous permettra d’obtenir les identifiants ("sheetId") de chaque feuille. Ensuite, vous pouvez les indiquer directement dans la liste du script "Vider()". Ce script parcourra toutes les feuilles et appliquera les modifications uniquement à celles dont l'ID est dans la liste.

   function Vider() {
     var ss = SpreadsheetApp.getActiveSpreadsheet();
     var sheetIds = [id1, id2, id3, id4, id5, id6, id7, id8, id9, id10]; // Remplacez id1 à id10 par les identifiants réels de vos feuilles
     
     var sheets = ss.getSheets();

     for (var i = 0; i < sheets.length; i++) {
       var sheet = sheets[ i ];
       var sheetId = sheet.getSheetId();
       if (sheetIds.indexOf(sheetId) !== -1) {
         sheet.getRange('F3:F32').createTextFinder("TRUE").replaceAllWith("FALSE");
       }
     }
   }


Dans cette fonction, je fais une boucle for qui parcourt toutes les feuilles. Pour chaque feuille, je récupère son identifiant (sheetId). Ensuite, je vérifie si cet identifiant fait partie de la liste des ID à modifier, en utilisant sheetIds.indexOf(sheetId) qui renvoie -1 si l'ID n'est pas dans la liste.

Cette deuxième solution me parait plus propre puisqu'elle ne modifie pas les cellules visibles dans les feuilles et permet d'identifier les feuilles directement par leur "sheetId", qui reste constant même si vous renommez ou déplacez des feuilles.

Re: Lancer un script sur plusieurs feuilles

Publié : 03 oct. 2024 18:14
par Gilles
1000 mercis.
Je vais essayer d'adapter votre idée à mon fichier ;-)

J'ai une dernière question :
Est-il possible de lancer un script depuis un fichier pour qu'il s'exécute sur un autre fichier ?? (Apparemment c'est possible sur Excel mais je ne trouve rien de similaire sur Google Sheet)

Encore merci pour votre aide !

Re: Lancer un script sur plusieurs feuilles

Publié : 07 oct. 2024 12:15
par papa s
Oui, c'est possible. Pour cela il vous faut l'ID de votre autre fichier et remplacer SpreadsheetApp.getActiveSpreadsheet() par SpreadsheetApp.openById(id).

Je crois qu'il existe également une variante avec l'url du fichier.

Re: Lancer un script sur plusieurs feuilles

Publié : 15 oct. 2024 13:00
par Gilles
Super ! ça marche !!!
Merci beaucoup pour votre aide précieuse ;-)

Bonne journée !