gpsread la hoja de trabajo de Google Sheets Protect con advertencia
Estoy tratando de usar la gspread
biblioteca para proteger una hoja de trabajo y advertir al usuario si está a punto de hacer un cambio, incluso si es un editor.
En Hojas de cálculo de Google, esto se llama "Mostrar una advertencia al editar este rango".
Gpsread tiene una función add_protected_range
aquí . A través de gpsread corro worksheet.add_protected_range('A1:J10', warning_only=True)
y me sale un error
gspread.exceptions.APIError: {'código': 400, 'mensaje': 'Solicitudes no válidas [0] .addProtectedRange: ProtectedRange es warningOnly. Los editores no se pueden configurar en él. ',' Status ':' INVALID_ARGUMENT '}
La eliminación warning_only
no devuelve ningún error, pero los editores aún pueden editar, lo cual no es mi objetivo.
¿Cómo hago para que esto funcione?
Además, esta función solo funciona para proteger el rango. ¿Hay alguna forma de proteger toda la hoja?
Respuestas
Creo que su objetivo es el siguiente.
- Pregunta 1: desea mostrar la advertencia cuando los usuarios editaron la celda de
A1:J10
en la hoja. Cuando los usuarios editan las celdas en el rango protegido, desea mostrar la pantalla de advertencia. - Pregunta 2: desea proteger una hoja en lugar de un rango. Cuando los usuarios editan las celdas en la hoja protegida, desea mostrar la pantalla de advertencia.
Respuesta a la pregunta 1:
Cuando warningOnly
es true
, la propiedad de editors
no se puede utilizar. Pero, cuando vi el guión add_protected_range
, parece que se incluyen los editores predeterminados. Ref . Creo que por esto, se produce tal error. Entonces, en este caso, para evitar esto, ¿qué tal si usamos directamente el método batchUpdate? El script de muestra es el siguiente.
Ejemplo de guion:
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)
- Cuando se ejecuta el script anterior, las celdas de "A1: J10" de "Sheet1" están protegidas. Y cuando los usuarios editaron las celdas en el rango protegido, se abre la pantalla de advertencia.
Respuesta a la pregunta 2:
En este caso, también, ¿qué tal si se usa directamente el método batchUpdate? El script de muestra es el siguiente.
Ejemplo de guion:
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)
- Cuando se ejecuta el script anterior, la hoja de "Sheet1" está protegida. Y cuando los usuarios editaron las celdas en "Hoja1", se abre la pantalla de advertencia.
Referencias:
- modelos.py de gspread
- batch_update (cuerpo)
- ProtectedRange