У меня есть скрипт, который выполняет некоторую обработку и выводит в электронные таблицы 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 Некоторые из листов обновляются (очищены, заполнено и запускается автоматическое изменение размера), а некоторые из них создаются, а затем заполняются и выполняется автоматическое изменение размера.
Надеюсь, что это проясняет:)