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 !
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.
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 »);
}
}
_
Je n’ai pas trouvé de méthode « getSheetById() » ou quelque chose de similaire.
Du coup, voici deux solutions que je vous propose :
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.
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.
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)
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.
Hi Gilles! It sounds like you’re making great progress with your script! To run the function on multiple sheets, you can use a loop. You can get the sheets by name and then apply your Empty function to each one. Here’s a quick example to get you started:
function Empty() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
for (var i = 1; i <= 10; i++) {
var sheet = spreadsheet.getSheetByName(i.toString());
if (sheet) {
sheet.getRange(‹ F3:F32 ›).createTextFinder(« TRUE »).replaceAllWith(« FALSE »);
}
}
}
This should uncheck the boxes in all sheets named « 1 » to « 10 ». Hope this helps!