gpsread Google Sheets Protect Worksheet avec avertissement

Aug 20 2020

J'essaie d'utiliser la gspreadbibliothèque pour protéger une feuille de calcul et avertir l'utilisateur s'il est sur le point d'apporter une modification, même s'il s'agit d'un éditeur.

Dans Google Sheets, cela s'appelle "Afficher un avertissement lors de la modification de cette plage"

Gpsread a une fonction add_protected_range ici . Via gpsread, je cours worksheet.add_protected_range('A1:J10', warning_only=True)et j'obtiens une erreur

gspread.exceptions.APIError: {'code': 400, 'message': 'Demandes non valides [0] .addProtectedRange: ProtectedRange est warningOnly. Les éditeurs ne peuvent pas y être définis. ',' Status ':' INVALID_ARGUMENT '}

La suppression warning_onlyne renvoie aucune erreur, mais les éditeurs sont toujours en mesure de modifier, ce qui n'est pas mon objectif.

Comment faire fonctionner cela?

De plus, cette fonction ne fonctionne que pour protéger la plage. Existe-t-il un moyen de protéger la feuille entière?

Réponses

1 Tanaike Aug 20 2020 at 08:36

Je crois que votre objectif est le suivant.

  • Question 1: vous souhaitez afficher l'avertissement lorsque les utilisateurs ont modifié la cellule de A1:J10dans la feuille. Lorsque les utilisateurs modifient les cellules de la plage protégée, vous souhaitez afficher l'écran d'avertissement.
  • Question 2: Vous souhaitez protéger une feuille au lieu d'une plage. Lorsque les utilisateurs modifient les cellules de la feuille protégée, vous souhaitez afficher l'écran d'avertissement.

Réponse à la question 1:

Quand warningOnlyest true, la propriété de editorsne peut pas être utilisée. Mais, quand j'ai vu le script add_protected_range, il semble que les éditeurs par défaut soient inclus. Ref Je pense que par là, une telle erreur se produit. Donc, dans ce cas, pour éviter cela, que diriez-vous d'utiliser directement la méthode batchUpdate? L'exemple de script est le suivant.

Exemple de script:

spreadsheetId = "###" # Please set the Spreadsheet ID.
sheetName = "Sheet1" # Please set the sheet name.

client = gspread.authorize(credentials)
ss = client.open_by_key(spreadsheetId)
sheetId = ss.worksheet(sheetName)._properties['sheetId']
request_body = {
    "requests": [
        {
            "addProtectedRange": {
                "protectedRange": {
                    "range": {
                        "sheetId": sheetId,
                        "startRowIndex": 0,
                        "endRowIndex": 10,
                        "startColumnIndex": 0,
                        "endColumnIndex": 10
                    },
                    "warningOnly": True
                }
            }
        }
    ]
}
res = ss.batch_update(request_body)
  • Lorsque le script ci-dessus est exécuté, les cellules de "A1: J10" de "Sheet1" sont protégées. Et lorsque les utilisateurs ont modifié les cellules de la plage protégée, l'écran d'avertissement s'ouvre.

Réponse à la question 2:

Dans ce cas, pourquoi ne pas utiliser directement la méthode batchUpdate? L'exemple de script est le suivant.

Exemple de script:

spreadsheetId = "###" # Please set the Spreadsheet ID.
sheetName = "Sheet1" # Please set the sheet name.

client = gspread.authorize(credentials)
ss = client.open_by_key(spreadsheetId)
sheetId = ss.worksheet(sheetName)._properties['sheetId']
request_body = {
    "requests": [
        {
            "addProtectedRange": {
                "protectedRange": {
                    "range": {
                        "sheetId": sheetId,
                    },
                    "warningOnly": True
                }
            }
        }
    ]
}
res = ss.batch_update(request_body)
  • Lorsque le script ci-dessus est exécuté, la feuille de "Sheet1" est protégée. Et lorsque les utilisateurs ont modifié les cellules dans "Sheet1", l'écran d'avertissement est ouvert.

Références:

  • models.py de gspread
  • batch_update (corps)
  • ProtectedRange