gpsread la hoja de trabajo de Google Sheets Protect con advertencia

Aug 20 2020

Estoy tratando de usar la gspreadbiblioteca 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_onlyno 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

1 Tanaike Aug 20 2020 at 08:36

Creo que su objetivo es el siguiente.

  • Pregunta 1: desea mostrar la advertencia cuando los usuarios editaron la celda de A1:J10en 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 warningOnlyes true, la propiedad de editorsno 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