使用 gspread 或 googleapiclient 将行附加到 Google 表格
Append rows to Google Sheets using gspread or googleapiclient
任务: 我有一个数据框,我想将该数据附加到 Google Sheet。 sheet 具有与 DF 完全相同的列,并且具有我不想覆盖的现有数据,但只需使用 DF 中的值在 sheet 的末尾添加行。
目前已尝试:
- 我已经使用以下代码遵循了 gspread 上的文档:
import json
df2.to_json(orient = 'columns')
values = df2.to_json(orient = 'columns')
wks.append_row (values, value_input_option='USER_ENTERED')
结果:API错误:{
"error":{
"code": 400,
"message": "'data.values[0]' 处的值无效 (type.googleapis.com/google.protobuf.ListValue),
- 我已经按照 Google 的 API 参考文档进行操作:https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/append
!pip install --upgrade google-api-python-client
from pprint import pprint
from googleapiclient import discovery
from oauth2client.service_account import ServiceAccountCredentials
scope = ['https://spreadsheets.google.com/feeds',
'https://www.googleapis.com/auth/drive',
'https://www.googleapis.com/auth/drive.file',
'https://www.googleapis.com/auth/spreadsheets']
credentials = ServiceAccountCredentials.from_json_keyfile_name('NAME.json', scope)
gc = gspread.authorize(credentials)
wks = gc.open("SHEETNAME").sheet1
service = discovery.build(wks,'v1', credentials)
spreadsheet_id = 'MYID'
value_input_option = INSERT_ROWS
values = df2.to_json(orient = 'columns')
insert_data_option = values
request = service.spreadsheets().values().append(spreadsheetId=spreadsheet_id, range=range_, valueInputOption=value_input_option, insertDataOption=insert_data_option, body=value_range_body)
response = request.execute()
pprint(response)
结果:AttributeError:'ServiceAccountCredentials'对象没有属性'request'
问题:这些解决方案中的任何一个都是正确的方法吗?我该如何解决错误?或者有没有更简单的完全不同的选择?
谢谢!
- 您想将
df2
的值附加到 Google Spreadsheet.
- 您想通过服务帐户使用 gspread 来实现此目的。
- 您已经能够通过服务帐户使用表格 API 获取和输入 Google Spreadsheet 的值。
如果我的理解是正确的,这个答案怎么样?请将此视为几个可能答案中的一个。
修改点:
- 在您的情况下,使用
df2.values.tolist()
代替 df2.to_json(orient = 'columns')
怎么样?通过这个,值被转换为二维数组。
- 当
df2
的值有多行时,我建议使用values_append
的方法,而不是append_row
的方法。因为 append_row
用于一维数组。在这种情况下,当使用几行的值时,需要在循环中使用append_row
。当values_append
用于多行的值时,这些值可以通过一个API调用来放置。
修改后的脚本:
当您的脚本修改时,请修改如下。
spreadsheetId = '###' # Please set the Spreadsheet ID.
sheetName = 'Sheet1' # Please set the sheet name.
client = gspread.authorize(credentials)
sh = client.open_by_key(spreadsheetId)
df2 = pd.DataFrame({'col1': ['a1', 'a2', 'a3'], 'col2': ['b1', 'b2', 'b3']}) # This is a sample value.
values = df2.values.tolist()
sh.values_append(sheetName, {'valueInputOption': 'USER_ENTERED'}, {'values': values})
df2 = pd.DataFrame({'col1': ['a1', 'a2', 'a3'], 'col2': ['b1', 'b2', 'b3']})
是一个示例值。使用它时,值将附加到 sheet.
参考文献:
如果我误解了您的问题并且这不是您想要的方向,我深表歉意。
任务: 我有一个数据框,我想将该数据附加到 Google Sheet。 sheet 具有与 DF 完全相同的列,并且具有我不想覆盖的现有数据,但只需使用 DF 中的值在 sheet 的末尾添加行。
目前已尝试:
- 我已经使用以下代码遵循了 gspread 上的文档:
import json
df2.to_json(orient = 'columns')
values = df2.to_json(orient = 'columns')
wks.append_row (values, value_input_option='USER_ENTERED')
结果:API错误:{ "error":{ "code": 400, "message": "'data.values[0]' 处的值无效 (type.googleapis.com/google.protobuf.ListValue),
- 我已经按照 Google 的 API 参考文档进行操作:https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/append
!pip install --upgrade google-api-python-client
from pprint import pprint
from googleapiclient import discovery
from oauth2client.service_account import ServiceAccountCredentials
scope = ['https://spreadsheets.google.com/feeds',
'https://www.googleapis.com/auth/drive',
'https://www.googleapis.com/auth/drive.file',
'https://www.googleapis.com/auth/spreadsheets']
credentials = ServiceAccountCredentials.from_json_keyfile_name('NAME.json', scope)
gc = gspread.authorize(credentials)
wks = gc.open("SHEETNAME").sheet1
service = discovery.build(wks,'v1', credentials)
spreadsheet_id = 'MYID'
value_input_option = INSERT_ROWS
values = df2.to_json(orient = 'columns')
insert_data_option = values
request = service.spreadsheets().values().append(spreadsheetId=spreadsheet_id, range=range_, valueInputOption=value_input_option, insertDataOption=insert_data_option, body=value_range_body)
response = request.execute()
pprint(response)
结果:AttributeError:'ServiceAccountCredentials'对象没有属性'request'
问题:这些解决方案中的任何一个都是正确的方法吗?我该如何解决错误?或者有没有更简单的完全不同的选择?
谢谢!
- 您想将
df2
的值附加到 Google Spreadsheet. - 您想通过服务帐户使用 gspread 来实现此目的。
- 您已经能够通过服务帐户使用表格 API 获取和输入 Google Spreadsheet 的值。
如果我的理解是正确的,这个答案怎么样?请将此视为几个可能答案中的一个。
修改点:
- 在您的情况下,使用
df2.values.tolist()
代替df2.to_json(orient = 'columns')
怎么样?通过这个,值被转换为二维数组。 - 当
df2
的值有多行时,我建议使用values_append
的方法,而不是append_row
的方法。因为append_row
用于一维数组。在这种情况下,当使用几行的值时,需要在循环中使用append_row
。当values_append
用于多行的值时,这些值可以通过一个API调用来放置。
修改后的脚本:
当您的脚本修改时,请修改如下。
spreadsheetId = '###' # Please set the Spreadsheet ID.
sheetName = 'Sheet1' # Please set the sheet name.
client = gspread.authorize(credentials)
sh = client.open_by_key(spreadsheetId)
df2 = pd.DataFrame({'col1': ['a1', 'a2', 'a3'], 'col2': ['b1', 'b2', 'b3']}) # This is a sample value.
values = df2.values.tolist()
sh.values_append(sheetName, {'valueInputOption': 'USER_ENTERED'}, {'values': values})
df2 = pd.DataFrame({'col1': ['a1', 'a2', 'a3'], 'col2': ['b1', 'b2', 'b3']})
是一个示例值。使用它时,值将附加到 sheet.
参考文献:
如果我误解了您的问题并且这不是您想要的方向,我深表歉意。