我正在从网络上抓取一些数据并将其写入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()
帮助!!!
答案 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列,有两种方法:
'Sheet1!B11'
作为范围。
'Sheet1!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()
Sheet1
,并将值设置为max_temp, avg_temp, min_temp
。range_list = [1, 4, 7]
表示B,E和H列。在这种情况下,第一个索引为0。range_list
的值都被创建为请求正文并使用。这样,可以通过一个API调用来放置值。因此,您问题中的for i in range(3)
可以删除。如果我误解了你的问题,对不起。