gpsread Google Sheets Protect-Arbeitsblatt mit Warnung
Ich versuche, eine gspreadBibliothek zu verwenden, um ein Arbeitsblatt zu schützen und den Benutzer zu warnen, wenn er eine Änderung vornehmen möchte, auch wenn er ein Editor ist.
In Google Sheets wird dies als "Warnung beim Bearbeiten dieses Bereichs anzeigen" bezeichnet.
Gpsread hat eine Funktion add_protected_range hier . Über gpsread laufe ich worksheet.add_protected_range('A1:J10', warning_only=True)und bekomme eine Fehlermeldung
gspread.exceptions.APIError: {'code': 400, 'message': 'Ungültige Anforderungen [0] .addProtectedRange: ProtectedRange ist warningOnly. Editoren können nicht darauf gesetzt werden. ',' Status ':' INVALID_ARGUMENT '}
Das Entfernen warning_onlygibt keinen Fehler zurück, aber die Editoren können immer noch bearbeiten, was nicht mein Ziel ist.
Wie bringe ich das zum Laufen?
Auch diese Funktion dient nur dazu, den Bereich zu schützen. Gibt es eine Möglichkeit, das gesamte Blatt zu schützen?
Antworten
Ich glaube Ihr Ziel wie folgt.
- Frage 1: Sie möchten die Warnung anzeigen, wenn Benutzer die Zelle
A1:J10im Blatt bearbeitet haben . Wenn Benutzer die Zellen im geschützten Bereich bearbeiten, möchten Sie den Warnbildschirm anzeigen. - Frage 2: Sie möchten ein Blatt anstelle eines Bereichs schützen. Wenn Benutzer die Zellen im geschützten Blatt bearbeiten, möchten Sie den Warnbildschirm anzeigen.
Antwort auf Frage 1:
Wann warningOnlyist true, kann die Eigenschaft von editorsnicht verwendet werden. Aber als ich das Skript sah add_protected_range, scheinen die Standardeditoren enthalten zu sein. Ref Ich denke, dass dadurch ein solcher Fehler auftritt. Um dies zu vermeiden, können Sie in diesem Fall die BatchUpdate-Methode direkt verwenden. Das Beispielskript lautet wie folgt.
Beispielskript:
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)
- Wenn das obige Skript ausgeführt wird, sind die Zellen von "A1: J10" von "Sheet1" geschützt. Wenn Benutzer die Zellen im geschützten Bereich bearbeitet haben, wird der Warnbildschirm geöffnet.
Antwort auf Frage 2:
Wie wäre es auch in diesem Fall mit der direkten Verwendung der batchUpdate-Methode? Das Beispielskript lautet wie folgt.
Beispielskript:
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)
- Wenn das obige Skript ausgeführt wird, ist das Blatt "Sheet1" geschützt. Und wenn Benutzer die Zellen in "Sheet1" bearbeitet haben, wird der Warnbildschirm geöffnet.
Verweise:
- models.py von gspread
- batch_update (body)
- ProtectedRange