gpsread Lindungi Lembar Kerja Google Sheets dengan Peringatan

Aug 20 2020

Saya mencoba menggunakan gspreadperpustakaan untuk melindungi lembar kerja dan memperingatkan pengguna jika mereka akan membuat perubahan bahkan jika mereka adalah editor.

Di Google Sheets, ini disebut "Tampilkan peringatan saat mengedit rentang ini"

Gpsread memiliki fungsi add_protected_range disini . Melalui gpsread saya menjalankan worksheet.add_protected_range('A1:J10', warning_only=True)dan saya mendapatkan kesalahan

gspread.exceptions.APIError: {'code': 400, 'message': 'Permintaan tidak valid [0] .addProtectedRange: ProtectedRange is warningOnly. Editor tidak dapat disetel padanya. ',' Status ':' INVALID_ARGUMENT '}

Menghapus warning_onlymengembalikan tidak ada kesalahan tetapi kemudian editor masih dapat mengedit, yang bukan tujuan saya.

Bagaimana cara membuat ini bekerja?

Selain itu, fungsi ini hanya berfungsi untuk membuat rentang terlindungi. Apakah ada cara untuk membuat seluruh lembar terlindungi?

Jawaban

1 Tanaike Aug 20 2020 at 08:36

Saya yakin tujuan Anda sebagai berikut.

  • Pertanyaan 1: Anda ingin memperlihatkan peringatan saat pengguna mengedit sel A1:J10di lembar. Saat pengguna mengedit sel dalam rentang yang dilindungi, Anda ingin menampilkan layar peringatan.
  • Pertanyaan 2: Anda ingin melindungi sheet, bukan rentang. Saat pengguna mengedit sel di lembar yang diproteksi, Anda ingin menampilkan layar peringatan.

Jawaban untuk pertanyaan 1:

Ketika warningOnlyadalah true, milik editorskaleng tidak digunakan. Tapi, ketika saya melihat skripnya add_protected_range, tampaknya editor default disertakan. Ref Saya pikir dengan ini, kesalahan seperti itu terjadi. Jadi dalam kasus ini, untuk menghindari hal ini, bagaimana kalau langsung menggunakan metode batchUpdate? Contoh skripnya adalah sebagai berikut.

Contoh skrip:

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)
  • Saat skrip di atas dijalankan, sel "A1: J10" dari "Sheet1" diproteksi. Dan saat pengguna mengedit sel dalam rentang yang dilindungi, layar peringatan akan terbuka.

Jawaban untuk pertanyaan 2:

Dalam kasus ini, juga, bagaimana jika langsung menggunakan metode batchUpdate? Contoh skripnya adalah sebagai berikut.

Contoh skrip:

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)
  • Ketika skrip di atas dijalankan, lembar "Sheet1" dilindungi. Dan ketika pengguna mengedit sel di "Sheet1", layar peringatan akan terbuka.

Referensi:

  • models.py dari gspread
  • batch_update (body)
  • ProtectedRange