Planilhas gpsread do Google Proteger planilha com aviso
Estou tentando usar a gspreadbiblioteca para proteger uma planilha e avisar o usuário se ele está prestes a fazer uma alteração, mesmo que seja um editor.
No Planilhas Google, isso é chamado de "Mostrar um aviso ao editar este intervalo"
Gpsread tem uma função add_protected_range aqui . Via gpsread eu corro worksheet.add_protected_range('A1:J10', warning_only=True)e recebo um erro
gspread.exceptions.APIError: {'code': 400, 'message': 'Solicitações inválidas [0] .addProtectedRange: ProtectedRange is warningOnly. Editores não podem ser definidos nele. ',' Status ':' INVALID_ARGUMENT '}
A remoção warning_onlynão retorna nenhum erro, mas os editores ainda podem editar, o que não é meu objetivo.
Como faço para que isso funcione?
Além disso, esta função só funciona para proteger o intervalo. Existe uma maneira de proteger a planilha inteira?
Respostas
Eu acredito em seu objetivo da seguinte maneira.
- Pergunta 1: Você deseja mostrar o aviso quando os usuários editarem a célula ou
A1:J10na planilha. Quando os usuários editam as células no intervalo protegido, você deseja mostrar a tela de aviso. - Pergunta 2: você deseja proteger uma planilha em vez de um intervalo. Quando os usuários editam as células na planilha protegida, você deseja mostrar a tela de aviso.
Resposta para a pergunta 1:
Quando warningOnlyé true, a propriedade de editorsnão pode ser usada. Mas, quando vi o script add_protected_range, parece que os editores padrão estão incluídos. Ref Eu acho que por isso, esse erro ocorre. Portanto, neste caso, para evitar isso, que tal usar diretamente o método batchUpdate? O script de amostra é o seguinte.
Script de amostra:
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 o script acima é executado, as células de "A1: J10" de "Planilha1" são protegidas. E quando os usuários editaram as células no intervalo protegido, a tela de aviso é aberta.
Resposta para a pergunta 2:
Nesse caso, também, que tal usar diretamente o método batchUpdate? O script de amostra é o seguinte.
Script de amostra:
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 o script acima é executado, a folha de "Folha1" é protegida. E quando o usuário edita as células da "Planilha1", a tela de aviso é aberta.
Referências:
- models.py de gspread
- batch_update (body)
- ProtectedRange