【问题标题】:Python - Google Sheets API - Not Writing to the Specified RangePython - Google Sheets API - 未写入指定范围
【发布时间】:2019-01-15 17:50:52
【问题描述】:

我正在从网络上抓取一些数据并将其写入 Google 电子表格。 经过长时间的 DuckDuckGo'ing 我正在寻求您的帮助。

我用于此脚本的库:

from __future__ import print_function
from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
import requests
from bs4 import BeautifulSoup
from datetime import date, timedelta

下面的代码在for i in range(3) 循环中。

即使我手动写range='Sheet1!E:G',它仍然从A列开始写。

当我用另一个工作表名称替换工作表名称时,它会将值附加到该特定工作表,但仍未使用指定范围。我尝试了各种范围,但仍然不行。

    SCOPES = 'https://www.googleapis.com/auth/spreadsheets'
    spreadsheet_id = '*******'
    store = file.Storage('token.json')
    creds = store.get()
    if not creds or creds.invalid:
        flow = client.flow_from_clientsecrets('credentials.json', SCOPES)
        creds = tools.run_flow(flow, store)
    service = build('sheets', 'v4', http=creds.authorize(Http()))

        values = [
            [
                max_temp, avg_temp, min_temp
            ]

        ]
        body = {
            'values': values
        }

        range_list = ['B:D','E:G','H:J']
        range_name = f'Sheet1!{range_list[i]}'

        sheet = service.spreadsheets()
        result = sheet.values().append(
            spreadsheetId=spreadsheet_id, range=range_name,
            valueInputOption='USER_ENTERED', body=body).execute()

求助!!!

【问题讨论】:

  • 我的回答是否向您展示了您想要的结果?你能告诉我吗?这对我学习也很有用。如果这可行,与您有相同问题的其他人也可以将您的问题作为可以解决的问题。如果您对我的回答有疑问,我深表歉意。到时候,可以问一下你现在的情况吗?我想学习解决你的问题。
  • 非常感谢您的详细回答@Tanaike!对不起,我很忙,好几天都不能在这个项目上工作。我实际上需要它像它所说的那样工作。所以我不想使用任何解决方法。我想我会尝试使用“更新”而不是“附加”,直到 Google 解决了这个问题。 (或者告诉我们使用他们的 API 的正确方法)
  • 感谢您的回复。如果我误解了您的回复,请告诉我。我的回答对您的情况没有用,因为您想使用values().append()。如果我的理解是正确的,我认为我对此表示歉意,我必须删除我的答案。如果我误解了您的回复,我深表歉意。顺便问一下tell us the right way to use their API的事吗?
  • 我说的是 Google 代表 :)
  • 感谢您的回复。对于你的问题,我有什么可以做的吗?如果我的回答对您的情况没有用。我必须道歉并修改它。

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


【解决方案1】:
  • 您想将 [[max_temp, avg_temp, min_temp]] 的值放在 B-C、E-G 和 H-J 列中。

如果我的理解是正确的,那么这个修改呢?

修改点:

  • 如果使用values.append,则当[[max_temp, avg_temp, min_temp]]'Sheet1!B:D' 分别用作值和范围时,这些值将放在A-C 列中。即使使用'Sheet1'的范围,结果也是一样的。
  • 要将[[max_temp, avg_temp, min_temp]]写入B-C列,有两种方法:
    1. 当最后一行假设为 10 时,它使用'Sheet1!B11' 作为范围。
      • 在这种情况下,需要知道最后一行。
    2. 当使用'Sheet1!B:D'的范围时,它使用[["", max_temp, avg_temp, min_temp]]作为值。
      • 在这种情况下,虽然将值放在最后一行,但当值将空元素添加到数组顶部时,会出现值没有放在正确位置的情况。

在我的环境中,我之前一直对这种情况感到困惑。所以我想了一个解决方法并解决了我的问题。在此解决方法中,使用了spreadsheets.batchUpdateAppendCellsRequest 的方法。我认为您的情况可能有多种解决方法,因此请仅将其视为其中之一。

修改脚本:

请将您的脚本(service = build('sheets', 'v4', http=creds.authorize(Http())) 之后)更新为以下行:

spreadsheet_id = "#####"  # Please set spreadsheet ID here.
sheetId = 0  # Please set sheet ID here.
values = [[max_temp, avg_temp, min_temp]]
range_list = [1, 4, 7]  # columns B, E and H. First index is 0.
rows = [{'values': ([{}] * e) + [{'userEnteredValue': {'stringValue': r}} for r in values[0]]} for e in range_list]
body = {'requests': [{'appendCells': {'rows': rows, 'sheetId': 0, 'fields': "userEnteredValue.stringValue"}}]}
result = service.spreadsheets().batchUpdate(spreadsheetId=spreadsheet_id, body=body).execute()

注意:

  • 此修改后的脚本假定您的环境可以使用 Sheets API。
  • 使用此脚本时,请将工作表ID设置为Sheet1,并将值设置为max_temp, avg_temp, min_temp
  • range_list = [1, 4, 7] 表示 B、E 和 H 列。在这种情况下,第一个索引为 0。
  • 在这个修改后的脚本中,range_list 的所有值都被创建为请求正文并被使用。这样,可以通过一个 API 调用来放置这些值。所以您问题中的for i in range(3) 可以删除。
  • 这是一个示例修改。所以请根据您的情况进行修改。

参考资料:

如果我误解了你的问题,我很抱歉。

【讨论】:

  • @tehhowch 感谢您的编辑。我想从中学习。
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多