Py学习  »  Python

python-google sheets api-不写入指定范围

Kerem Akagündüz • 4 年前 • 413 次点击  

我正在从网上抓取一些数据并将其写入谷歌电子表格。 经过长时间的逃避之后,我请求你的帮助。

用于此脚本的库:

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()

救命啊!!!

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/46573
 
413 次点击  
文章 [ 1 ]  |  最新文章 4 年前
tehhowch Tanaike
Reply   •   1 楼
tehhowch Tanaike    5 年前
  • 你想把 [[max_temp, avg_temp, min_temp]] B-C、E-G和H-J列。

如果我的理解是正确的,那么这次修改怎么样?

修改点:

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

在我的环境中,我以前在这种情况下感到困惑。所以我想了个办法解决了我的问题。在这个解决方案中, AppendCellsRequest 属于 spreadsheets.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) 在你的问题可以删除。
  • 这是一个示例修改。所以请根据你的情况修改一下。

参考文献:

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