Google Sheets API — форматирование вставленных значений

#python #google-spreadsheet-api

#python #google-sheets-api

Вопрос:

С помощью этого кода я обновил несколько строк в электронной таблице Google. Запрос проходит успешно и возвращает мне приведенное updatedRange ниже.

 result = service.spreadsheets().values().append(
    spreadsheetId=spreadsheetId,
    range=rangeName,
    valueInputOption="RAW",
    insertDataOption="INSERT_ROWS",
    body=body
).execute()
print(result)
print("Range updated")
updateRange = result['updates']['updatedRange']
  

Теперь я хотел бы выполнить batchUpdate запрос, чтобы установить форматирование или установить защищенный диапазон, но для этих API требуется диапазон, указанный как startRowIndex , endRowIndex и так далее.

Как я могу получить индекс строк из updatedRange ?

Комментарии:

1. Я не уверен, есть ли способ получить индексы строк / столбцов из updatedRange . Что я могу предложить, так это создать функцию, которая будет подсчитывать строки и столбцы на основе updatedRange значения. Как указано в документе : обновление электронных таблиц , «существует несколько разных способов достижения одного и того же результата». Но если вы чувствуете, что эта функция поможет, попробуйте подать ее здесь .

Ответ №1:

В ожидании собственного или лучшего ответа я опубликую функцию, которую я создал для перевода a namedRange в a gridRange . Функция далека от совершенства и не преобразует имя листа в идентификатор листа (я оставил эту задачу другой конкретной функции), но принимает именованные диапазоны в форме:

  • sheet!A:B
  • sheet!A1:B
  • sheet!A:B5
  • sheet!A1:B5

Вот код

     import re

    def namedRange2Grid(self, rangeName):
        ascii_uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
        match = re.match(".*?!([A-Z0-9] ):([A-Z0-9] )", rangeName)
        if match:
            start = match.group(1)
            end = match.group(2)
            matchStart = re.match("([A-Z]{1,})([1-9] ){0,}", start)
            matchEnd = re.match("([A-Z]{1,})([1-9] ){0,}", end)
            if matchStart and matchEnd:
                GridRange = {}
                letterStart = matchStart.group(1)
                letterEnd = matchEnd.group(1)
                if matchStart.group(2):
                    numberStart = int(matchStart.group(2))
                    GridRange['startRowIndex'] = numberStart - 1
                if matchEnd.group(2):
                    numberEnd = int(matchEnd.group(2))
                    GridRange['endRowIndex'] = numberEnd

                i = 0
                for l in range(0, len(letterStart)):
                    i = i   (l * len(ascii_uppercase))
                    i = i   ascii_uppercase.index(letterStart[l])
                GridRange['startColumnIndex'] = i

                i = 0
                for l in range(0, len(letterEnd)):
                    i = i   (l * len(ascii_uppercase))
                    i = i   ascii_uppercase.index(letterEnd[l])
                GridRange['endColumnIndex'] = i   1

                return GridRange