我只想应用JSON条目中的格式。我要做的第一件事是在电子表格中为所有列的第二行设置所需的格式。然后,我用.get
请求(从A2到AO3)检索了它们。
request = google_api.service.spreadsheets().get(
spreadsheetId=ss_id,
ranges="Tab1!A2:AO3",
includeGridData=True).execute()
我接下来要做的是收集每一列的每种格式,并将它们记录在字典中。
my_dictionary_of_formats = {}
row_values = row_1['sheets'][0]['data'][0]['rowData'][0]['values']
for column in range(0, len(row_values)):
my_dictionary_of_formats[column] = row_values[column]['effectiveFormat']
现在,我对所有专栏都有所有有效格式的字典。我现在在将该格式应用于每列的所有行时遇到了麻烦。我尝试了一个batchUpdate
请求:
cell_data = {
"effectiveFormat": my_dictionary_of_formats[0]}
row_data = {
"values": [
cell_data
]
}
update_cell = {
"rows": [
row_data
],
"fields": "*",
"range":
{
"sheetId": input_master.tab_id,
"startRowIndex": 2,
"startColumnIndex": 0,
"endColumnsIndex": 1
}
}
request_body = {
"requests": [
{"updateCells": update_cell}],
"includeSpreadsheetInResponse": True,
"responseIncludeGridData": True}
service.spreadsheets().batchUpdate(spreadsheetId=my_id, body=request_body).execute()
这消灭了一切,我不确定为什么。我认为我不了解fields='*
属性。
TL; DR 我想将格式应用于单列中的所有行。就像我在第二行,第一列中使用“绘画格式”工具并将其一直拖动到最后一行一样。
-----更新
嗨,感谢评论,这是我的解决方案:
###collect all formats from second row
import json
row_2 = goolge_api.service.spreadsheets().get(
spreadsheetId=spreadsheet_id,
ranges="tab1!A2:AO2",
includeGridData=True).execute()
my_dictionary = {}
row_values = row_2['sheets'][0]['data'][0]['rowData'][0]['values']
for column in range(0,len(row_values)):
my_dictionary[column] = row_values[column]
json.dumps(my_dictionary,open('config/format.json','w'))
###Part 2, apply formats
requests = []
my_dict = json.load(open('config/format.json'))
for column in my_dict:
requests.append(
{
"repeatCell": {
"range": {
"sheetId": tab_id,
"startRowIndex": str(1),
"startColumnIndex":str(column),
"endColumnIndex":str(int(column)+1)
},
"cell": {
"userEnteredFormat": my_dict[column]
},
'fields': "userEnteredFormat({})".format(",".join(my_dict[column].keys()))
}
})
body = {"requests": requests}
google_api.service.spreadsheets().batchUpdate(spreadsheetId=s.spreadsheet_id,body=body).execute()
答案 0 :(得分:1)
当您将fields
作为请求的一部分时,您向API端点指示它应使用您在上载资源中找到的信息覆盖目标范围内的指定字段。相应地,fields="*"
被解释为“此请求指定给定范围的整个数据和元数据。从范围中删除任何以前的数据和元数据,而使用提供的内容。”
因此,您的updateCells
请求中未指定的所有内容都将从请求中提供的range
中删除(例如,值,公式,数据验证等)。
对于updateCell
request,fields
参数如下所述:
应更新的
CellData
字段。必须至少指定一个字段。根是CellData
; “行值”。不应指定。单个“ *”可用作列出每个字段的简写。
如果您随后查看CellData
的资源描述,则会看到以下字段:
因此,您的请求的正确字段规范很可能是fields="effectiveFormat"
,因为这是您在row_data
属性中提供的唯一字段。
如果您只是指定一种格式,请考虑使用repeatCell
request。