Script app boucle
Bonjour à vous tous,
Je me permets d'écrire pour la première fois sur ce forum pour vous demandez de l'aide.
Voici mon problème, j'ai un tableur avec une liste déroulante. Je voudrais archiver sur une nouvelle feuille les lignes avec une sélection précise.
De base le script fonctionne bien sauf qu'il ne fonctionne que sur la première ligne si sur celle d'après j'ai un blanc ou la réponse non attendu le script s'arrête.....
Je cherche donc le moyen de créer une boucle ou peut être pouvez-vous me dire pourquoi dans le script mon getRange("D1:D500") ne fonctionne pas...
Voici le script :
function transfert(){
var feuille = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var r = SpreadsheetApp.getActiveSpreadsheet().getRange("D1:D500");
if (r.getColumn() == 4 && feuille.getName() == 'Actif'){
if(r.getValue() == 'OUI'){
var destination = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Archive");
destination.insertRowBefore(2);
var plage = feuille.getRange('A' + r.getRow() + ':E' + r.getRow());
plage.copyTo(destination.getRange('A2'), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
Browser.msgBox("Ligne " + r.getRow() + " archivée !");
feuille.deleteRow(r.getRow());
}
}
if (r.getColumn() == 4 && feuille.getName() == 'Archive'){
if(r.getValue() != 'OUI'){
var destination = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Actif");
destination.insertRowBefore(2);
var plage = feuille.getRange('A' + r.getRow() + ':E' + r.getRow());
plage.copyTo(destination.getRange('A4'), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
Browser.msgBox("Ligne " + r.getRow() + " ré-activée !");
feuille.deleteRow(r.getRow());
}
}
}Merci d'avance pour votre aide.
Bonjour, et bienvenue
indente ton code pour y voir plus clair
as-tu un fichier pour tester ?
je comprends ta logique, mais google app script lui attend une boucle et non une déclaration globale comme
var r = SpreadsheetApp.getActiveSpreadsheet().getRange("D1:D500");il faut donc balayer de 1 à 500 avec une boucle, ce qui donnerait d'un point d evue syntaxique
function transfert() {
var feuille = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
for (var i = 1; i <= 500; i++) {
if (feuille.getName() == 'Actif') {
if (feuille.getRange(i, 4).getValue() == 'OUI') {
var destination = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Archive");
destination.insertRowBefore(2);
var plage = feuille.getRange('A' + i + ':E' + i);
plage.copyTo(destination.getRange('A2'), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
Browser.msgBox("Ligne " + i + " archivée !");
feuille.deleteRow(i);
}
}
if (feuille.getName() == 'Archive') {
if (feuille.getRange(i, 4).getValue() != 'OUI') {
var destination = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Actif");
destination.insertRowBefore(2);
var plage = feuille.getRange('A' + i + ':E' + i);
plage.copyTo(destination.getRange('A4'), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
Browser.msgBox("Ligne " + i + " ré-activée !");
feuille.deleteRow(i);
}
}
}
}mais cette écriture risque de se révéler très longue car il y a trop de getSheetByName ou de getValue dans les boucles ...
Bonjour Steelson,
Déjà je te remercie pour le temps que tu m'accorde et pour la réponse.
Voici le fichier en question, j'ai fait un fichier très simple pour tester le script.
https://docs.google.com/spreadsheets/d/1hqPs0gNKMKpdZyU7Smw4WbiliSDMC9HkVcYPVbGimuU/edit?usp=sharing
Steelson,
Je viens de coller ton code sur la feuille de calcule il fonctionne super bien.r
Après si tu pense qu'un autre code plus simple serais mieux je suis bien sur preneur :)
Dans tout les cas je te remercie déjà.
on peut toujours faire mieux, ici la première étape serait
function transfert() {
var feuille = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
for (var i = 1; i <= 500; i++) {
if (feuille.getName() == 'Actif') {
var destination = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Archive");
if (feuille.getRange(i, 4).getValue() == 'OUI') {
destination.insertRowBefore(2);
var plage = feuille.getRange('A' + i + ':E' + i);
plage.copyTo(destination.getRange('A2'), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
Browser.msgBox("Ligne " + i + " archivée !");
feuille.deleteRow(i);
}
}
if (feuille.getName() == 'Archive') {
var destination = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Actif");
if (feuille.getRange(i, 4).getValue() != 'OUI') {
destination.insertRowBefore(2);
var plage = feuille.getRange('A' + i + ':E' + i);
plage.copyTo(destination.getRange('A4'), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
Browser.msgBox("Ligne " + i + " ré-activée !");
feuille.deleteRow(i);
}
}
}
}après, si cela fonctionne c'est parfait, mieux vaut parfois ne rien toucher
En tout cas je te remercie pour le temps passé et pour les réponses.
Je me permet donc de marquer le post comme résolu.