python - 从现有的 Google 电子表格中获取响应、追加行和更新
问题描述
我可以连接到 Google 电子表格并添加新行(列表中的实际值),如下所示,它可以工作:
import gspread
from oauth2client.service_account import ServiceAccountCredentials
from pprint import pprint
from googleapiclient import discovery
scope = ['https://spreadsheets.google.com/feeds',
'https://www.googleapis.com/auth/drive',
'https://www.googleapis.com/auth/spreadsheets.currentonly',
'https://www.googleapis.com/auth/spreadsheets']
credentials = ServiceAccountCredentials.from_json_keyfile_name('credentials.json', scope)
gc = gspread.authorize(credentials)
service = discovery.build('sheets', 'v4', credentials=credentials)
#Name of Spreadsheet
Sheet_Title = "New Spreadsheet Final"
# The ID of the spreadsheet
spreadsheet_id = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' # TODO: Update placeholder value.
#Get sheet ID
#Open the wanted Tab
sheet = gc.open(Sheet_Title).worksheet("Tab One")
#Get the wanted range of the sheet
range_name = 'A1:W1000' # TODO: Update placeholder value.
#Add new rows in the Sheet. Values are hardcoded below
values = [
['09/01/2021', 'IT', '8%'],
['08/02/2021', 'NL', '1%']
# Additional rows ...
]
body = {
'values': values
}
#Append the rows in the Google Spreadsheet
result = service.spreadsheets().values().append(
spreadsheetId=spreadsheet_id, range=range_name,
valueInputOption='USER_ENTERED', body=body).execute()
我现在要做的是添加新行,但为每个单元格(或通常特定的列)添加数据验证。所以,我下去检查了响应。然后我附加了一个新的行值,其中包括格式和数据验证:
#Values to be added in the original query
value_to_be_added = [
{
"formattedValue": "05/05/2019",
"userEnteredFormat": {
"numberFormat": {
"type": "DATE",
"pattern": "dd/mm/yyyy"
}
},
"dataValidation": {
"condition": {
"type": "DATE_IS_VALID"
},
"strict": "True"
}
},
{
"formattedValue": "DE",
"userEnteredFormat": {
"numberFormat": {
"type": "NUMBER",
"pattern": "#,##0.00"
},
"verticalAlignment": "BOTTOM"
},
"dataValidation": {
"condition": {
"type": "ONE_OF_LIST",
"values": [
{
"userEnteredValue": "UK"
},
{
"userEnteredValue": "ES"
},
{
"userEnteredValue": "IT"
},
{
"userEnteredValue": "DE"
},
{
"userEnteredValue": "AT"
},
{
"userEnteredValue": "NL"
}
]
},
"showCustomUi": "True"
}
},
{
"formattedValue": "4%",
"userEnteredFormat": {
"numberFormat": {
"type": "PERCENT",
"pattern": "0%"
}
}
}
]
换句话说,我已经尝试操作原始响应 JSON,我唯一需要的是更新完整文件,但我找不到正确的更新函数:
#Get request to get the full Google Spreadsheet in a JSON
request = service.spreadsheets().get(spreadsheetId=spreadsheet_id, ranges=range_name, includeGridData=True)
response = request.execute()
#dictionary that will be appended in the values of the response
mydict = {}
#Assign dictionary with the new value. We have one value in this case.
mydict[row_count+1] = value_to_be_added
#print(mydict[row_count+1])
#Add new row in the response.
response['sheets'][0]['data'][0]['rowData'][x]['values'].append(mydict[row_count+1])
#updated response that has to be sent/updated in the API.
new_response = response
有没有办法用更新的响应完全更新/替换原始响应?
原始电子表格:
我的 update.request 之后的最终电子表格(我希望它是怎样的):
您可以在其中看到一个应用数据验证的新行(它可以是 X 行)。
解决方案
- 您想将一行追加到电子表格最后一行的下一行。
- 您想附加一行,如日期值
dd/mm/yyyy
、数据验证、0%
格式数和数字。 - 您想将 的值
05/05/2019, UK, 8%, 9
作为显示值。
- 您想附加一行,如日期值
- 您想使用 gspread 和 python 来实现这一点。
- 您已经能够使用 Sheets API 获取和放置电子表格的值。
如果我的理解是正确的,那么这个示例脚本怎么样?在这个示例脚本中,我使用了batch_update
gspread 的方法。gspread 的方法batch_upate
是 Sheets API 的电子表格.batchUpdate 方法。该行由 appendCells 请求附加。
示例脚本:
示例脚本如下。在运行脚本之前,请设置电子表格 ID 和工作表名称。在此脚本中,Tab One
用作工作表名称。
gc = gspread.authorize(credentials)
spreadsheet_id = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
sheetName = "Tab One"
spreadsheet = gc.open_by_key(spreadsheet_id)
sheetId = spreadsheet.worksheet(sheetName)._properties['sheetId']
body = {'requests':
[
{
'appendCells':
{
'rows':
[
{
'values':
[
{
'userEnteredFormat':
{
'numberFormat':
{
'type': 'DATE',
'pattern': 'dd/mm/yyyy'
}
},
'dataValidation':
{
'condition':
{
'type': 'DATE_IS_VALID'
},
'strict': True
},
'userEnteredValue':
{
'numberValue': 43590 # This is the serial number of "05/05/2019".
}
},
{
'userEnteredFormat':
{
'numberFormat':
{
'type': 'NUMBER',
'pattern': '#,##0.00'
},
'verticalAlignment': 'BOTTOM'
},
'dataValidation':
{
'condition':
{
'type': 'ONE_OF_LIST',
'values':
[
{
'userEnteredValue': 'UK'
},
{
'userEnteredValue': 'ES'
},
{
'userEnteredValue': 'IT'
},
{
'userEnteredValue': 'DE'
},
{
'userEnteredValue': 'AT'
},
{
'userEnteredValue': 'NL'
}
]
},
'showCustomUi': True
},
'userEnteredValue':
{
'stringValue': 'UK'
}
},
{
'userEnteredFormat':
{
'numberFormat':
{
'type': 'PERCENT',
'pattern': '0%'
}
},
'userEnteredValue':
{
'numberValue': 0.08
}
},
{
'userEnteredValue':
{
'numberValue': 9
}
}
]
}
],
'sheetId': sheetId,
'fields': '*'
}
}
]
}
res = spreadsheet.batch_update(body)
print(res)
笔记:
- 当
05/05/2019
作为格式的日期输入时dd/mm/yyyy
,请输入编号为43590
序号。
参考:
添加:
当你想在for循环中使用请求体时,下面的脚本怎么样?batchUpdate 方法可以与数组一起使用。
gc = gspread.authorize(credentials)
spreadsheet_id = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
sheetName = "Tab One"
spreadsheet = gc.open_by_key(spreadsheet_id)
sheetId = spreadsheet.worksheet(sheetName)._properties['sheetId']
requests = []
for x in range(len(new_values)): # Please set "new_values".
body = {
'appendCells':
{
'rows':
[
{
'values':
[
{
'userEnteredFormat':
{
'numberFormat':
{
'type': 'DATE',
'pattern': 'dd/mm/yyyy'
}
},
'dataValidation':
{
'condition':
{
'type': 'DATE_IS_VALID'
},
'strict': True
},
'userEnteredValue':
{
'numberValue': new_values[x][0]
}
},
{
'userEnteredFormat':
{
'numberFormat':
{
'type': 'NUMBER',
'pattern': '#,##0.00'
},
'verticalAlignment': 'BOTTOM'
},
'dataValidation':
{
'condition':
{
'type': 'ONE_OF_LIST',
'values':
[
{
'userEnteredValue': 'UK'
},
{
'userEnteredValue': 'ES'
},
{
'userEnteredValue': 'IT'
},
{
'userEnteredValue': 'DE'
},
{
'userEnteredValue': 'AT'
},
{
'userEnteredValue': 'NL'
}
]
},
'showCustomUi': True
},
'userEnteredValue':
{
'stringValue': new_values[x][1]
}
},
{
'userEnteredFormat':
{
'numberFormat':
{
'type': 'PERCENT',
'pattern': '0%'
}
},
'userEnteredValue':
{
'numberValue': new_values[x][2]
}
},
{
'userEnteredValue':
{
'numberValue': new_values[x][2]
}
}
]
}
],
'sheetId': sheetId,
'fields': '*'
}
}
requests.append(body)
res = spreadsheet.batch_update({'requests':requests})
print(res)
推荐阅读
- google-cloud-ml - GCMLE 模型运行时版本
- c# - 无效的受众令牌验证
- excel - 已有数组公式,需加日期限制
- java - 在 JAVA 中将 PKCS7 证书转换为 PKCS12
- python - Tensorflow 训练过程以错误结束:OutOfRangeError(参见上面的回溯):FIFOQueue '_3_prefetch_queue'
- java - 用于提取字符串的java正则表达式
- ocr - tesseract mislead black <-> white
- javascript - 类型错误:无法读取属性
在 React 中传递数据时为 null - octobercms - 博客分页不起作用
- java - 带有可能的空指针的骆驼日志消息