gpsread Google Sheets Protect Worksheet with Warning

Aug 20 2020

Tôi đang cố gắng sử dụng gspreadthư viện để bảo vệ trang tính và cảnh báo người dùng nếu họ sắp thực hiện thay đổi ngay cả khi họ là người chỉnh sửa.

Trong Google Trang tính, điều này được gọi là "Hiển thị cảnh báo khi chỉnh sửa phạm vi này"

Gpsread có một chức năng add_protected_range Tại đây . Qua gpsread, tôi chạy worksheet.add_protected_range('A1:J10', warning_only=True)và gặp lỗi

gspread.exceptions.APIError: {'code': 400, 'message': 'Yêu cầu không hợp lệ [0] .addProtectedRange: ProtectedRange is warningOnly. Không thể đặt trình chỉnh sửa trên đó. ',' Status ':' INVALID_ARGUMENT '}

Loại bỏ warning_onlytrả về không có lỗi nhưng sau đó người chỉnh sửa vẫn có thể chỉnh sửa, đó không phải là mục tiêu của tôi.

Làm cách nào để tôi làm việc này?

Ngoài ra, chức năng này chỉ hoạt động để làm cho phạm vi được bảo vệ. Có cách nào để bảo vệ toàn bộ trang tính không?

Trả lời

1 Tanaike Aug 20 2020 at 08:36

Tôi tin rằng mục tiêu của bạn như sau.

  • Câu hỏi 1: Bạn muốn hiển thị cảnh báo khi người dùng chỉnh sửa ô A1:J10trong trang tính. Khi người dùng chỉnh sửa các ô trong phạm vi được bảo vệ, bạn muốn hiển thị màn hình cảnh báo.
  • Câu hỏi 2: Bạn muốn bảo vệ một trang tính thay vì một dải ô. Khi người dùng chỉnh sửa các ô trong trang tính được bảo vệ, bạn muốn hiển thị màn hình cảnh báo.

Câu trả lời cho câu hỏi 1:

Khi warningOnlytrue, tài sản của editorslon không được sử dụng. Nhưng, khi tôi xem kịch bản add_protected_range, có vẻ như các trình chỉnh sửa mặc định được bao gồm. Tham khảo Tôi nghĩ rằng do điều này, lỗi như vậy xảy ra. Vì vậy, trong trường hợp này, để tránh điều này, làm thế nào về việc sử dụng trực tiếp phương thức batchUpdate? Kịch bản mẫu như sau.

Kịch bản mẫu:

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)
  • Khi tập lệnh trên được chạy, các ô "A1: J10" của "Sheet1" được bảo vệ. Và khi người dùng chỉnh sửa các ô trong phạm vi được bảo vệ, màn hình cảnh báo sẽ được mở.

Câu trả lời cho câu hỏi 2:

Trong trường hợp này, làm thế nào về việc sử dụng trực tiếp phương thức batchUpdate? Kịch bản mẫu như sau.

Kịch bản mẫu:

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)
  • Khi tập lệnh trên được chạy, trang tính của "Sheet1" được bảo vệ. Và khi người dùng chỉnh sửa các ô trong "Sheet1", màn hình cảnh báo sẽ được mở.

Người giới thiệu:

  • models.py trong tổng số gspread
  • batch_update (body)
  • ProtectedRange