Python-Google Sheets API-未写入指定范围

时间:2019-01-15 17:50:52

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

我正在从网络上抓取一些数据并将其写入Google Spreadsheet。 经过漫长的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()

帮助!!!

1 个答案:

答案 0 :(得分:0)

  • 您要将[[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]]作为值。
      • 在这种情况下,尽管将值放在最后一行,但是当这些值将空元素添加到数组的顶部时,可能会导致这些值没有放在正确的位置。

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

修改后的脚本:

请将脚本(在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)可以删除。
  • 这是示例修改。因此,请根据您的情况进行修改。

参考文献:

如果我误解了你的问题,对不起。