Python Google 工作表 API 通过单次批量更新进行值更新和 sheet 属性更新

Python Google Sheets API make values update and sheet properties update with a single batch update

我想知道我想更新到电子表格的一系列值是否可以在单个批量更新中与电子表格属性更新一起发送?例如(下面的代码)我想制作一个电子表格 属性 更新(添加工作表),然后将数据添加到同一个新添加的工作表中。如果可以使用单个请求完成,如何实现? (没有提出 1 个请求 .values().batchUpdate() 和第 2 个 .batchUpdate()

我有以下内容:

REQUESTS = []

# addSheet request
REQUESTS.append({"addSheet": {"properties": {"title": "MySheet",'sheetId': '0'}}})

# add value request
REQUESTS.append({'range':'MySheet!A1', 'values': list_of_lists, 'majorDimension':'COLUMNS'})

# create a request body
body = {"requests": REQUESTS}
# make update
sheet_service.spreadsheets().batchUpdate(spreadsheetId=sheet_id, body=body).execute()

上面的代码return出现以下错误:

"Invalid JSON payload received. Unknown name "range" at 'requests[1]': Cannot find field.
Invalid JSON payload received. Unknown name "values" at 'requests[1]': Cannot find field.
Invalid JSON payload received. Unknown name "majorDimension" at 'requests[1]': Cannot find field.". Details: "[{'@type': 'type.googleapis.com/google.rpc.BadRequest', 'fieldViolations': [{'field': 'requests[1]', 'description': 'Invalid JSON payload received. Unknown name "range" at \'requests[1]\': Cannot find field.'}, {'field': 'requests[1]', 'description': 'Invalid JSON payload received. Unknown name "values" at \'requests[1]\': Cannot find field.'}, {'field': 'requests[1]', 'description': 'Invalid JSON payload received. Unknown name "majorDimension" at \'requests[1]\': Cannot find field.'}]}]">

谢谢

我相信你的目标如下。

  • 您想将新的 sheet 插入 Google 传播sheet。
  • 您想将值添加到插入的 sheet。
  • 您想使用 Sheets API.
  • 中的 batchUpdate 方法通过一次 API 调用实现上述 2 个过程
  • 您想使用 googleapis 实现上述 python。

修改点:

  • 在这种情况下,为了将值添加到插入的 sheet,我想建议手动添加 sheet ID 作为唯一值。
  • 我认为您的第一个请求正文可以使用。但是你的第二个请求体不能用于 batchUpdate 方法。

当以上几点反映到你的脚本中,就会变成下面这样。

修改后的脚本:

spreadsheet_id = '###'  # Please set the Spreadsheet ID.
list_of_lists = [['sample value 1', 123, 456], ['sample value 2', 789, 123]]  ## Please set your values.

sheet_service = build('sheets', 'v4', credentials=creds)
rows = []
for r in list_of_lists:
    col = []
    for c in r:
        col.append({"userEnteredValue": ({"numberValue": c} if str(c).replace('.', '', 1).isdigit() else {"stringValue": c})})
    rows.append({"values": col})
print(rows)
new_sheet_id = 123456
body = {
    "requests": [
        {
            "addSheet": {
                "properties": {
                    "title": "MySheet",
                    "sheetId": new_sheet_id
                }
            }
        },
        {
            "updateCells": {
                "start": {
                    "sheetId": new_sheet_id,
                    "rowIndex": 0,
                    "columnIndex": 0
                },
                "rows": rows,
                "fields": "userEnteredValue"
            }
        }
    ]
}
res = sheet_service.spreadsheets().batchUpdate(spreadsheetId=spreadsheet_id, body=body).execute()
print(res)
  • 在此示例脚本中,123456 用作插入的 sheet 的 sheet ID。如果此值已被使用,请更改它。
  • 在此示例脚本中,字符串和数字类型用作插入的 sheet 的附加值。如果你想使用其他类型,请根据你的实际情况修改上面的脚本。

参考文献: