Protection automatique de ligne - Apps Script

Bonjour à tous,

je suis nouveau sur ce forum et je cherche un script ou autre me permettant de protéger automatiquement une ligne lorsque celle-ci est complétée par un utilisateur.

cette protection commence à la cellule A9 et chaque ligne est composée de 3 cellules.

Merci par avance pour votre aide.

Bonne journée

Bonjour,

C'est assez commun, voici un un script que j'ai adapté, à tester :

function onEdit(e) {
  const sheet = e.source.getActiveSheet();
  var editRow = e.range.getRow();
  const startRow = 9;
  var now = new Date();
  var horodat = Utilities.formatDate(now, Session.getScriptTimeZone(), "dd/MM/yyyy - HH:mm:ss");

  if (editRow > startRow) {    
    const nbVal = sheet.getRange(editRow, 1, 1, 3).getValues().flat().filter(value => value !== "").length;
    if (nbVal === 3) {
      var rangeToProtect = sheet.getRange(editRow, 1, 1, 3);
      var protections = sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE);
      var protectedRanges = protections.some(function(protection) {return protection.getRange().getA1Notation() === rangeToProtect.getA1Notation();});
      if (!protectedRanges) {
        rangeToProtect.protect().setDescription("Ligne " + editRow + " complétée le " + horodat);
      }
    }
  }
}

Si tu souhaites de plus amples explications n’hésite pas demander.

Pierre,

merci pour ta réponse rapide.

Par contre lorsque j'exécute le script j'ai ce message d'erreur :

ErreurTypeError: Cannot read properties of undefined (reading 'source').

Merci de ton aide

Alors, la function utilisée s'appelle "onEdit" elle est prévue pour s'exécuter automatiquement à chaque modification dans le fichier, il n'y a pas à l'exécuter manuellement.

Voici pour info la liste des fonctions triggers : https://developers.google.com/apps-script/guides/triggers?hl=fr

je vais regarder ça de plus près.

Merci beaucoup

Bonjour Pierre,

le script n'a pas l'air de fonctionner. peux-tu jeter un œil sur mon document.

https://docs.google.com/spreadsheets/d/1shLnv2kRpCoBWlS7UJ9IK_ap9x4vW2mlm09kpKQL3DI/edit?usp=sharing

Merci de ton aide et de ta patience.

Bonjour,

Les protections sont bien mises :

image

MAIS le niveau de protection est trop faible, il autorise tout le monde.

+ il faut que le script retire la protection sur la ligne n'est pas complète.

Voici un script modifié, ça semble fonctionner, à tester:

function onEdit(e) {
  const sheet = e.source.getActiveSheet();
  var editRow = e.range.getRow();
  const startRow = 9;
  var now = new Date();
  var horodat = Utilities.formatDate(now, Session.getScriptTimeZone(), "dd/MM/yyyy - HH:mm:ss");

  if (editRow > startRow) {
    const nbVal = sheet.getRange(editRow, 1, 1, 3).getValues().flat().filter(value => value !== "").length;
    var rangeToProtect = sheet.getRange(editRow, 1, 1, 3);
    var protections = sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE);

    if (nbVal === 3) {
      var protectedRanges = protections.some(function(protection) {
        return protection.getRange().getA1Notation() === rangeToProtect.getA1Notation();
      });
      if (!protectedRanges) {
        var protection = rangeToProtect.protect().setDescription("Ligne " + editRow + " complétée le " + horodat);

        protection.removeEditors(protection.getEditors());
        protection.setDomainEdit(false);
      }
    } else {
      protections.forEach(function(protection) {
        if (protection.getRange().getA1Notation() === rangeToProtect.getA1Notation()) {
          protection.remove();
        }
      });
    }
  }
}

Pierre,

Merci beaucoup pour ton aide.

je vais faire un test avec mes différents collaborateurs.

Bonne journée

Rechercher des sujets similaires à "protection automatique ligne apps script"