Planilhas gpsread do Google Proteger planilha com aviso

Aug 20 2020

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

1 Tanaike Aug 20 2020 at 08:36

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