gpsread Google Таблицы Защитите лист с предупреждением

Aug 20 2020

Я пытаюсь использовать gspreadбиблиотеку для защиты рабочего листа и предупреждения пользователя, если он собирается внести изменения, даже если он является редактором.

В Google Таблицах это называется «Показывать предупреждение при редактировании этого диапазона».

Gpsread имеет функцию add_protected_range Здесь . Через gpsread бегаю worksheet.add_protected_range('A1:J10', warning_only=True)и выдает ошибку

gspread.exceptions.APIError: {'code': 400, 'message': 'Недействительные запросы [0] .addProtectedRange: ProtectedRange - warningOnly. На нем нельзя установить редакторов. ',' Status ':' INVALID_ARGUMENT '}

Удаление не warning_onlyвозвращает ошибок, но редакторы все еще могут редактировать, что не является моей целью.

Как мне заставить это работать?

Также эта функция работает только для защиты диапазона. Есть ли способ защитить весь лист?

Ответы

1 Tanaike Aug 20 2020 at 08:36

Я считаю вашей целью следующее.

  • Вопрос 1: вы хотите отображать предупреждение, когда пользователи редактируют ячейку A1:J10на листе. Когда пользователи редактируют ячейки в защищенном диапазоне, вы хотите показать экран предупреждения.
  • Вопрос 2: вы хотите защитить лист вместо диапазона. Когда пользователи редактируют ячейки на защищенном листе, вы хотите показать экран предупреждения.

Ответ на вопрос 1:

Когда warningOnlyесть true, свойство editorsнельзя использовать. Но, когда я увидел сценарий add_protected_range, кажется, что включены редакторы по умолчанию. Ref Думаю, что по этому и возникает такая ошибка. Итак, в этом случае, чтобы этого избежать, как насчет прямого использования метода batchUpdate? Пример сценария выглядит следующим образом.

Пример сценария:

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)
  • При запуске вышеуказанного скрипта ячейки «A1: J10» из «Sheet1» защищены. И когда пользователи редактируют ячейки в защищенном диапазоне, открывается экран предупреждения.

Ответ на вопрос 2:

В этом случае, как насчет прямого использования метода batchUpdate? Пример сценария выглядит следующим образом.

Пример сценария:

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)
  • При запуске вышеуказанного скрипта лист «Sheet1» защищен. И когда пользователи редактируют ячейки в «Sheet1», открывается экран предупреждения.

Рекомендации:

  • models.py из gspread
  • batch_update (тело)
  • ProtectedRange