gpsread Fogli Google Proteggi foglio di lavoro con avviso
Sto cercando di utilizzare la gspread
libreria per proteggere un foglio di lavoro e avvisare l'utente se sta per apportare una modifica anche se è un editor.
In Fogli Google si chiama "Mostra un avviso quando si modifica questo intervallo"
Gpsread ha una funzione add_protected_range
qui . Tramite gpsread corro worksheet.add_protected_range('A1:J10', warning_only=True)
e ricevo un errore
gspread.exceptions.APIError: {'code': 400, 'message': 'Richieste non valide [0] .addProtectedRange: ProtectedRange è warningOnly. Gli editor non possono essere impostati su di esso. "," Status ":" INVALID_ARGUMENT "}
La rimozione warning_only
non restituisce alcun errore, ma gli editor sono ancora in grado di modificare, il che non è il mio obiettivo.
Come posso farlo funzionare?
Anche questa funzione funziona solo per rendere la gamma protetta. C'è un modo per proteggere l'intero foglio?
Risposte
Credo il tuo obiettivo come segue.
- Domanda 1: vuoi mostrare l'avviso quando gli utenti hanno modificato la cella del
A1:J10
foglio. Quando gli utenti modificano le celle nell'intervallo protetto, si desidera visualizzare la schermata di avviso. - Domanda 2: vuoi proteggere un foglio invece di un intervallo. Quando gli utenti modificano le celle nel foglio protetto, si desidera visualizzare la schermata di avviso.
Risposta per la domanda 1:
Quando warningOnly
è true
, la proprietà di editors
non può essere utilizzata. Ma, quando ho visto lo script add_protected_range
, sembra che gli editor predefiniti siano inclusi. Rif . Penso che in questo modo si verifica un tale errore. Quindi in questo caso, per evitare ciò, che ne dici di utilizzare direttamente il metodo batchUpdate? Lo script di esempio è il seguente.
Script di esempio:
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)
- Quando viene eseguito lo script precedente, le celle di "A1: J10" di "Sheet1" sono protette. E quando gli utenti modificano le celle nell'intervallo protetto, viene visualizzata la schermata di avviso.
Risposta per la domanda 2:
Anche in questo caso, che ne dici di utilizzare direttamente il metodo batchUpdate? Lo script di esempio è il seguente.
Script di esempio:
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)
- Quando viene eseguito lo script precedente, il foglio di "Sheet1" è protetto. E quando gli utenti modificano le celle in "Foglio1", viene visualizzata la schermata di avviso.
Riferimenti:
- models.py di gspread
- batch_update (corpo)
- ProtectedRange