Запрос autoResizeDimensions для Google Sheets API не работает должным образом - PullRequest
0 голосов
/ 06 мая 2020

У меня есть скрипт, который выполняет некоторую обработку и выводит в электронные таблицы Google. После загрузки данных на рабочий лист мне нужно автоматически изменить размер столбцов, чтобы они соответствовали содержимому. По мере того как я исследовал API, единственный способ сделать это - использовать запрос API «autoResizeDimensions».

Вот как выглядит результат запроса (извините, мне пришлось испортить символы): Результат выполнения запроса API

Как видите, между фактическим «концом содержимого в ячейке» и границей столбца есть некоторое пространство.

Однако, когда я выбираю столбцы в браузере , откройте окно изменения размера и нажмите на опцию «подогнать под данные», я получаю именно то, что мне нужно:

Ожидаемый результат

Кто-нибудь, пожалуйста, помогите Мне нравятся колонки?

Спасибо!

PS Я использую Python 3.6.7 и модуль gspread 3.1.0. Есть встроенный метод для выполнения запросов batch_update. Вот как я использую его для загрузки pandas фрейма данных в электронную таблицу:

def clear_sheet(sheet):
    """Fill sheet with empty cells starting from B2"""
    empty_cells = []
    for col_index in range(10):
        for row_index in range(1000):
            empty_cells.append(Cell(row=row_index+2, col=col_index+2, 
                value=''))

    sheet.update_cells(empty_cells)


def upload_frame(sheet, frame):
    """Upload frame to sheet starting from B2"""
    frame_cells = []
    frame_as_list = frame.fillna('').values.tolist()
    for row_index, row in enumerate(frame_as_list):
        for col_index, cell_value in enumerate(row):
            frame_cells.append(Cell(row=row_index+2, col=col_index+2, 
                 value=cell_value))

    sheet.update_cells(frame_cells)


def set_autoresize(sheet):
    """Set autoresize for first 11 columns of sheet"""
    body = {
        "requests": [
            {
                "autoResizeDimensions": {
                    "dimensions": {
                        "sheetId": sheet._properties['sheetId'],
                        "dimension": "COLUMNS",
                        "startIndex": 0,
                        "endIndex": 11
                    },
                }
            }
        ]
    }
    sheet.spreadsheet.batch_update(body)

gc = gspread.authorize(CREDENTIALS)
report_worksheet = gc.open_by_key(SPREADSHEET_ID)

update_all = False
current_sheet_titles = [sheet.title for sheet in report_worksheet.worksheets()]
print('Current sheets: {}'.format(current_sheet_titles))
for month, frame in monthly_frames.items():
    sheet_title = '{}-{}'.format(current_year, month)
    if sheet_title not in current_sheet_titles:
        print('Creating sheet {}'.format(sheet_title))
        new_sheet = report_worksheet.worksheet('Template').duplicate(insert_sheet_index=0, new_sheet_name=sheet_title)
        upload_frame(new_sheet, frame)
        set_autoresize(new_sheet)
    elif (frame['Billing Completed'] == 'No').values.any() or update_all:
        print('Updating sheet {}'.format(sheet_title))
        sheet = report_worksheet.worksheet(sheet_title)
        # Update sheet
        clear_sheet(sheet)
        upload_frame(sheet, frame)
        set_autoresize(sheet)
    else:
        print('Skipping sheet {}'.format(sheet_title))

Там есть montly_frames dict со следующей структурой: '2020-05': report_frame Некоторые из листов обновляются (очищены, заполнено и запускается автоматическое изменение размера), а некоторые из них создаются, а затем заполняются и выполняется автоматическое изменение размера.

Надеюсь, что это проясняет:)

...