web-dev-qa-db-fra.com

Puis-je protéger le formatage d'un Google Sheets?

J'ai une feuille de calcul Google qui comporte de nombreuses mises en forme et formules, dans différentes colonnes, certaines colonnes sont pilotées par des formules et d'autres par des entrées. La feuille de calcul est partagée avec différents utilisateurs et je l’administre.

Problèmes:

  • Protection de la formule: Je ne veux pas qu'un utilisateur de la feuille de calcul puisse modifier les colonnes de formules, je souhaite donc la protéger. Il existe une fonctionnalité de protection intégrée (basée sur la plage ou sur la feuille) dans Google Sheets, mais cela vous empêche également d'insérer de nouvelles lignes, ce que je dois toujours permettre aux utilisateurs de faire.

  • Protection du format: À mesure que les utilisateurs entrent des données dans la feuille de calcul au fil du temps, le formatage est toujours modifié et/ou modifié.

Existe-t-il un moyen de verrouiller la mise en forme d’une feuille de calcul afin qu’elle ne puisse pas être modifiée?

Par exemple, la colonne F serait toujours:

text-align: right aligned,
cell-format: financial
2 decimal places
text-color: black text
cell-background: light green background
font: Arial

Je me suis déjà rendu en ligne, mais ces fonctionnalités ne peuvent pas être obtenues via les paramètres Google Sheets intégrés. Les éléments ci-dessus sont-ils réalisables via un script personnalisé Google Sheets?

4
sam

La façon de résoudre le problème consiste à utiliser une combinaison de fonctions personnalisées dans un tableur Google et un script Google. Je vais utiliser des exemples pour essayer de trouver une solution à votre problème

Protection de la formule :

Si j'ai bien compris, les utilisateurs devront saisir de nouvelles entrées dans une nouvelle ligne. Cela signifie que vous pouvez appliquer la formule automatiquement à cette nouvelle ligne, ce qui pourrait les empêcher de modifier cette formule en premier lieu.

1) Pour appliquer la formule à la nouvelle ligne, utilisez ArrayFormula. L'exemple ci-dessous additionnera les valeurs de la colonne F à la colonne I dans chaque ligne.

=arrayFormula((F:F+G:G+H:H+I:I))
 read as = F1+G1+H1+I1 in row 1, =F2+G2+H2+I2 in row2 and so on

vous pouvez obtenir plus élaboré et supprimer 0 valeurs de la feuille comme si

=arrayFormula(if((F:F+G:G+H:H+I:I) = 0,"",(F:F+G:G+H:H+I:I)))

Plus de détails peuvent être trouvé ici . Vous éviterez ainsi à un utilisateur de saisir la formule, ce qui réduirait sa modification. ArrayFormula applique/corrige automatiquement la formule même lorsqu'une nouvelle ligne est insérée ou supprimée.

2) Étant donné que la matrice serait appliquée dans la première ligne (ou une ligne spécifique). Définissez Protection dans la première ligne (ou cette ligne spécifique) de sorte que vous seul puissiez la modifier, ce qui signifie indirectement que personne ne peut modifier les formules de la feuille. Ceci n'empêche pas l'utilisateur de modifier en dessous de la ligne 1 ce qui affecte le fonctionnement de arrayFormula, c'est pourquoi vous avez utilisé la protection par formule (décrite ci-dessous)

Protection du format:

1) Comme ci-dessus, vous pouvez configurer la première ligne comme étant la ligne principale qui sera utilisée pour formater les lignes restantes. Etant donné que vous allez également le verrouiller, personne ne pourra le modifier sauf vous!

2) Pour copier automatiquement le formatage, vous pouvez utiliser le déclencheur onEdit (e) dans les feuilles de Google. Le code ci-dessous fait exactement cela:

function onOpen(e){
 var ui = SpreadsheetApp.getUi()
 ui.createMenu("Format sheet").addItem("Format", "setFormat").addToUi()

}
function onEdit(e){           //This is activated each time a modification happens in the sheet
  var ss = SpreadsheetApp.getActive()
  var sheet =ss.getActiveSheet()
  if(sheet.getSheetName() == "Sheet1"){
  var entryRange = e.range
  var range  = sheet.getRange(1,entryRange.getColumn(),1,entryRange.getNumColumns())              //This will be you range to get the formatting from row "1" and corresponding column based on the column being edited
  Logger.log(entryRange.getA1Notation())
  range.copyFormatToRange(sheet, entryRange.getColumn(), entryRange.getNumColumns()+entryRange.getColumn()-1, entryRange.getRow(), entryRange.getNumRows()+entryRange.getRow()-1)
  Logger.log(entryRange.getColumn())
  if(entryRange.getColumn() == 10){                                 //This column value will not be allowed modified except for row 1 of that column
    if (entryRange.getRow() != 1){                                  //The columns in row "1" will be allowed to modified
    e.range.setValue((e.oldvalue == undefined? "": e.oldvalue))
    }
  }
  }
}

function setFormat(){
  var ss = SpreadsheetApp.getActive()
  var sheet = ss.getActiveSheet()
  var firstRow = sheet.getRange(1, 1, 1, sheet.getLastColumn())
  var dataRange = sheet.getDataRange()
  firstRow.copyFormatToRange(sheet, 1, dataRange.getNumColumns(), 2, dataRange.getNumRows())

}

Copiez ce qui précède dans votre éditeur de script dans les feuilles de Google et enregistrez-le. Rechargez ensuite votre feuille Google. À ce stade, tout ce que vous modifiez dans la ligne "1" ne sera pas affecté. Cependant, toute modification apportée aux lignes ci-dessous, inciteraEdit à copier automatiquement le format de la première ligne et à l'appliquer à cette ligne de la colonne correspondante.

Protection par formule de colonne: Ce code dans la fonction onEdit empêchera la modification d'une colonne spécifique, la colonne 10 dans ce cas. Mais peut être modifié pour protéger n'importe quelle colonne. (Pour comprendre pourquoi nous avons besoin de cela, lisez Formule Protection: 2) ci-dessus)

if(entryRange.getColumn() == 10){                                 //This column value will not be allowed modified except for row 1 of that column
        if (entryRange.getRow() != 1){                                  //The columns in row "1" will be allowed to modified
        e.range.setValue((e.oldvalue == undefined? "": e.oldvalue))
        }
      }

Il remplacera l'ancienne valeur dans la colonne 10 à partir de la colonne 2. Cependant, si quelqu'un copie une nouvelle ligne entière dans laquelle modifiera également la ligne 10, cela ne l'empêchera pas d'être modifié.

Vous pouvez le modifier pour vous permettre de modifier la ligne 10 comme suit

if(entryRange.getColumn() == 10 && Session.getEffectiveUser().getEmail() != "Your Email Here")

Remarque: Si vous apportez cette modification, veillez à exécuter la fonction onEdit à partir de l'éditeur de script une fois pour lui donner le droit d'accéder à votre emailID.

Enfin, lorsque vous rechargez la feuille, vous remarquerez un nouvel élément de menu appelé Formater la feuille. Vous pouvez l'utiliser pour appliquer le format de la ligne "1" à toutes les lignes situées en dessous! Ce qui est fait par la fonction setFormat(). C'est un code de secours, au cas où des personnes modifieraient la mise en forme après que le déclencheur onEdit définisse la mise en forme. onEdit(e) n'est pas déclenché lorsque l'utilisateur modifie le format d'une cellule.

J'espère que ça t'as aidé!

5
Jack Brown