【问题标题】:Python Google Sheets API make values update and sheet properties update with a single batch updatePython Google Sheets API 通过单批更新进行值更新和工作表属性更新
【发布时间】:2020-09-28 09:54:05
【问题描述】:

我想知道我想更新到电子表格的一系列值是否可以与电子表格属性更新一起在单个批量更新中发送?例如(下面的代码)我想更新电子表格属性(添加工作表),然后将数据添加到同一个新添加的工作表中。如果可以使用单个请求来完成,如何实现? (不发出 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()

上面的代码返回如下错误:

"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.'}]}]">

谢谢

【问题讨论】:

    标签: python-3.x google-sheets-api


    【解决方案1】:

    我相信你的目标如下。

    • 您想在 Google 电子表格中插入新工作表。
    • 您想将值添加到插入的工作表中。
    • 您希望使用 Sheets API 中的 batchUpdate 方法,通过一次 API 调用实现上述 2 个流程。
    • 您想使用 googleapis for python 实现上述目标。

    修改点:

    • 在这种情况下,为了将值添加到插入的工作表中,我建议手动添加工作表 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 用作插入工作表的工作表 ID。如果此值已被使用,请更改它。
    • 在此示例脚本中,字符串和数字类型用作插入工作表的附加值。如果您想使用其他类型,请根据您的实际情况修改上述脚本。

    参考资料:

    【讨论】:

    • @Simas 感谢您的回复。我很高兴你的问题得到了解决。也谢谢你。
    猜你喜欢
    • 1970-01-01
    • 2021-06-16
    • 2023-01-29
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    相关资源
    最近更新 更多