gpsread Google Sheets Protect Worksheet avec avertissement
J'essaie d'utiliser la gspread
bibliothè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_only
ne 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
Je crois que votre objectif est le suivant.
- Question 1: vous souhaitez afficher l'avertissement lorsque les utilisateurs ont modifié la cellule de
A1:J10
dans 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 warningOnly
est true
, la propriété de editors
ne 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