从对问题的回答
here
here
,这就是我目前在驱动器中创建电子表格的方式,并添加值和受保护范围以保护元数据值(通过python API客户端)。
基本上,自从
spreadsheets.create()
spreadsheets.batchUpdate
(参考创建的电子表格的ID)
# getting data from pandas dataframe for writing
df = df.fillna("")
HEADER = [str(c) for c in df.columns]
VALUES = [str(v) for v in df.values.tolist()[0]]
data = [HEADER, VALUES]
print(HEADER, VALUES)
# using Drive API to create the Spreadsheet in specified Drive location
drive = build('drive', 'v3', credentials=creds)
file_metadata = {
'name': 'sampleName',
'parents': ['### folderId ###'],
'mimeType': 'application/vnd.google-apps.spreadsheet',
}
res = drive.files().create(body=file_metadata).execute()
print(res)
SPREADSHEET_ID = res['id']
# building request object
requests = [
{
"appendCells":
{
"sheetId": 0,
"rows": [
{ # need to build the individual cell value objects for the request
"values": [{"userEnteredValue": {"stringValue": v}} for v in HEADER],
},
{
"values": [{"userEnteredValue": {"stringValue": v}} for v in VALUES],
}
],
"fields": "*"
},
},
{
"addProtectedRange": {
# protecting header fields
"protectedRange": {
"range": {
"sheetId": 0, # sheets are indexed from 0
"startRowIndex": 0,
"endRowIndex": 1, # pretty sure the endIndexes are exclusive
"startColumnIndex": 0,
"endColumnIndex": len(HEADER)
},
"description": "Do not edit this header data",
"warningOnly": False,
}
}
},
{
"addProtectedRange": {
# protecting metadata values
"protectedRange": {
"range": {
"sheetId": 0, # sheets are indexed from 0
"startRowIndex": 0,
"endRowIndex": 2, # pretty sure the endIndexes are exclusive
"startColumnIndex": 0,
"endColumnIndex": 2
},
"description": "This is a metadata field and should not be edited",
"warningOnly": False,
}
}
},
{
"addProtectedRange": {
# protecting metadata values
"protectedRange": {
"range": {
"sheetId": 0, # sheets are indexed from 0
"startRowIndex": 0,
"endRowIndex": 2, # pretty sure the endIndexes are exclusive
"startColumnIndex": 8,
"endColumnIndex": 10
},
"description": "This is a metadata field and should not be edited",
"warningOnly": False,
}
}
}
]
# do the batch updates on the Spreadsheet
request_body = {"requests": requests}
assert "requests" in request_body.keys()
assert isinstance(request_body["requests"], typing.List)
sheets = discovery.build('sheets', 'v4', credentials=credentials)
request = sheets.spreadsheets() \
.batchUpdate(spreadsheetId=SPREADSHEET_ID, body=request_body)
request.execute()
print(request)
https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/batchUpdate#examples
https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#appendcellsrequest
https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#addprotectedrangerequest