gpsread Fogli Google Proteggi foglio di lavoro con avviso

Aug 20 2020

Sto cercando di utilizzare la gspreadlibreria 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_onlynon 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

1 Tanaike Aug 20 2020 at 08:36

Credo il tuo obiettivo come segue.

  • Domanda 1: vuoi mostrare l'avviso quando gli utenti hanno modificato la cella del A1:J10foglio. 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 editorsnon 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