Verrouiller plusieurs colonnes séparément

Tout tout nouveau avec Apps Script.

J'ai un fichier d'inscription à différents évènements avec un quota de 10 pour chacun.

J'ai obtenu de JExcel2fr une macro vba me permettant de verrouiller les cellules de la colonne concernée lorsque le quota est atteint (voir commentaire dans le code) :

  • la 11° inscription est effacée et un MsgBox apparaît.
Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) 
' JExcel2fr 19/09/24
' https://forum.excel-pratique.com/excel/verrouiller-plusieurs-plages-separement-195615
Dim Plg As Range 
If Not Intersect(Range("B4:B24,C4:C24,D4:D24,E4:E24,F4:F24,G4:G24,H4:H24,I4:I24,J4:J24,K4:K24,L4:L24,M4:M24,N4:N24"), Target) Is Nothing Then
Set Plg = Range(Cells(4, Target.Column), Cells(24, Target.Column)) 
If WorksheetFunction.CountA(Plg) > 10 Then 
' Optionnel 
Application.EnableEvents = False 
Target.ClearContents 
Application.EnableEvents = True MsgBox "10 places maximum SVP", vbCritical, "OUPS..." 
' Demande initiale 
Plg.Locked = True 
Else Plg.Locked = False 
End If 
End If 
Set Plg = Nothing 
End Sub

Y a-t-il moyen d'adapter ce code sur Apps Script , SVP ?

https://docs.google.com/spreadsheets/d/1WWHbz-k6FKVnnFkrwNKukoPRJHuGZI-_yw7dxHBhCYo/edit?usp=sharing

Sur ce fichier, j'ai simplement ajouté une MFC qui colore une colonne dès que la 10° inscription est validée. Mais les suivantes sont quand même acceptées...

Merci

Bonjour,

J'ai appliqué un script répondant à votre demande sur votre fichier, le voici ici au besoin :

/**
 * Fonction déclenchée automatiquement lorsque l'utilisateur modifie une cellule de la feuille.
 * Si la modification entraine en ligne 2 le nombre "10" alors la colonne correspondante est verrouillée.
 *
 * @param {Event} e - L'événement onEdit qui contient des informations sur la modification.
 */
function onEdit(e) {
  var sheet = e.source.getActiveSheet();  // Récupère la feuille active
  var range = e.range; // Récupère la cellule modifiée
  var col = range.getColumn(); // Récupère la colonne de la cellule modifiée
  if (sheet.getRange(2,col).getValue() == 10) {  // Vérifie si la valeur de la cellule en ligne 2 dans la colonne modifiée est égale à 10
    lockCol(sheet,col); // si oui, lance la 2nd fonction lockCol en passant comme arguement le numéro de colonne et la feuille
  }
}

/**
 * Verrouille une colonne spécifique dans la feuille de calcul, en retirant l'accès d'édition
 * à tous les utilisateurs (sauf proprietaire).
 *
 * @param {GoogleAppsScript.Spreadsheet.Sheet} sheet - La feuille où la colonne doit être verrouillée.
 * @param {number} col - Le numéro de la colonne à verrouiller.
 */
function lockCol(sheet,col) {
  var range = sheet.getRange(1, col, sheet.getMaxRows()); // selectionne une plage : ligne 1, colonne modifiée, ligne maximum de  la feuille.
  var protection = range.protect().setDescription('Colonne ' + col + ' verrouillée limite atteinte'); // protège la plage avec nom personnalisé (il est aussi possible de mettre la date, l'heure, etc.)
  protection.removeEditors(protection.getEditors()); // retire les droits d'éditions
}

Bjr,

Cette procédure ne fonctionne pas. Personne à part le propriétaire ne peut s'inscrire à l'évènement. Verrouillage trop élevé.

Il faudrait qu'un visiteur qui dispose du lien puisse s'inscrire lui-même au lieu de demander au propriétaire de l'inscrire.

Merci

J'ai fait des tests, n'importe quel visiteur peut s'inscrire, sauf dans les colonnes qui sont protégées.

Désolé, si je ne suis pas connecté avec mon compte propriétaire, j'ai l'avertissement

image

En fait, c'est la colonne F qui est entièrement bloquée.

Les autres colonnes sont aléatoires. Elles bloquent à 10, 11, 12...

image

Alors, vous en tant que propriétaire pouvez faire ce que vous voulez, mais essayez en ouvrant votre fichier sans y être connecté.

Si je en suis pas connecté, rien ne fonctionne correctement et la colonne F reste inaccessible

image

En faisant des tests, on a dû la verrouiller :

image

Il y avait autant de blocages que d'essais sur les colonnes.

Tout supprimé : F:F libérée.

Merci

Mais on peut toujours ajouter des inscriptions > 10.

A force de gratter le Net, j'ai trouvé une solution qui m'évite de créer des MFC sur chaque colonne, en intégrant la coloration dans la condition true / false

function onEdit(e) { 

var sheet = e.source.getActiveSheet(); 

var range = e.range; 

var column = range.getColumn()

; var row = range.getRow(); 

// Définir la plage à vérifier var plgRange = sheet.getRange(4, column, 21); 

// Vérifier si la cellule modifiée est dans la plage spécifiée 

if (column >= 2 && column <= 14 && row >= 4 && row <= 24) { 

var values = plgRange.getValues(); 

var count = 0; 

// Compter le nombre de cellules non vides 

for (var i = 0; i < values.length; i++) { 

if (values[i][0] !== "") { 

count++; } 

} 

if (count > 10) { 

// Message d'alerte

sheet.getRange(row, column).clearContent(); 

SpreadsheetApp.getUi().alert("10 places maximum SVP", "OUPS...", SpreadsheetApp.getUi().ButtonSet.OK); 

// Coloration de la plage en rouge

plgRange.setBackground("red"); 

plgRange.setLocked(true); 

} else {

// La plage reste/redevient blanche

plgRange.setBackground("white"); 

plgRange.setLocked(false); 

} 

} 

}
Rechercher des sujets similaires à "verrouiller colonnes separement"