社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Kerem Akagündüz • 5 年前 • 549 次点击  

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

用于此脚本的库:

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
 
549 次点击  
文章 [ 1 ]  |  最新文章 5 年前
tehhowch Tanaike
Reply   •   1 楼
tehhowch Tanaike    6 年前
  • 你想把 [[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) 在你的问题可以删除。
  • 这是一个示例修改。所以请根据你的情况修改一下。

参考文献:

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