更新整个工作表的单行格式

时间:2018-08-27 22:59:29

标签: python google-sheets-api google-api-python-client

我只想应用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()

1 个答案:

答案 0 :(得分:1)

当您将fields作为请求的一部分时,您向API端点指示它应使用您在上载资源中找到的信息覆盖目标范围内的指定字段。相应地,fields="*"被解释为“此请求指定给定范围的整个数据和元数据。从范围中删除任何以前的数据和元数据,而使用提供的内容。”

因此,您的updateCells请求中未指定的所有内容都将从请求中提供的range中删除(例如,值,公式,数据验证等)。

您可以在guide to batchUpdate

中了解更多信息

对于updateCell requestfields参数如下所述:

  

应更新的CellData字段。必须至少指定一个字段。根是CellData; “行值”。不应指定。单个“ *”可用作列出每个字段的简写。

如果您随后查看CellData的资源描述,则会看到以下字段:

  • “ userEnteredValue”
  • “有效值”
  • “ formattedValue”
  • “ userEnteredFormat”
  • “ effectiveFormat”
  • “超链接”
  • “笔记”
  • “ textFormatRuns”
  • “ dataValidation”
  • “数据透视表”

因此,您的请求的正确字段规范很可能是fields="effectiveFormat",因为这是您在row_data属性中提供的唯一字段。

如果您只是指定一种格式,请考虑使用repeatCell request