python-3.x - Python Google Sheets API 通过一次批量更新来更新值和工作表属性

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

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

谢谢

最佳答案

我相信您的目标如下。

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

修改点:

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

当以上几点反射(reflect)到您的脚本中时,它会变成如下所示。

修改后的脚本:

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。如果该值已被使用,请更改它。
  • 在此示例脚本中,字符串和数字类型用作插入工作表的附加值。如果您想使用其他类型,请根据您的实际情况修改上述脚本。

引用文献:

关于python-3.x - Python Google Sheets API 通过一次批量更新来更新值和工作表属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64099894/

相关文章:

python - 为什么模块不可调用

C# Google Sheets APIv4 填充请求体

java - 使用maven出现异常

python - itertools 的 chain.from_iterable 和 chain() 的更简化解释

python - 获取 postgresql 唯一日期的内存有效方式?

linux - 读取带有 unicode 字符的文本文件 - Python3

c# - 查询谷歌电子表格行

node.js - 如何使用 Google Drive API 创建电子表格文件,并将默认选项卡标题设置为 "Sheet1"以外的其他内容

google-app-engine - Google App Engine Go 1.11 应用程序无法访问 Google 电子表格

python - python 上的前向声明与使用 globals()