Получить список листов и последний лист в электронной таблице google api v4 в Python
Я пытаюсь читать и писать значения разных листов в python 3, следуя официальной документации Google. Хотя я могу читать значения из определенных листов с использованием свойства range в rangeName = 'Class Data!A2:E'
в блоке кода, упомянутом ниже:
discoveryUrl = ('https://sheets.googleapis.com/$discovery/rest?'
'version=v4')
service = discovery.build('sheets', 'v4', http=http,
discoveryServiceUrl=discoveryUrl)
spreadsheetId = '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms'
rangeName = 'Class Data!A2:E'
result = service.spreadsheets().values().get(
spreadsheetId=spreadsheetId, range=rangeName).execute()
values = result.get('values', [])
И я пытаюсь написать значения, используя пример кода:
requests.append({
'updateCells': {
'start': {'sheetId': 0, 'rowIndex': 0, 'columnIndex': 0},
'rows': [
{
'values': [
{
'userEnteredValue': {'numberValue': 1},
'userEnteredFormat': {'backgroundColor': {'red': 1}}
}, {
'userEnteredValue': {'numberValue': 2},
'userEnteredFormat': {'backgroundColor': {'blue': 1}}
}, {
'userEnteredValue': {'numberValue': 3},
'userEnteredFormat': {'backgroundColor': {'green': 1}}
}
]
}
],
'fields': 'userEnteredValue,userEnteredFormat.backgroundColor'
}
})
batchUpdateRequest = {'requests': requests}
service.spreadsheets().batchUpdate(spreadsheetId=spreadsheet_id,
body=batchUpdateRequest).execute()
Проблема, с которой я сталкиваюсь, заключается в том, что я не могу сохранить последнее имя листа или идентификатор из официальной документации, и поскольку последняя ревизия api делает случайный gid (мы, возможно, не знаем, какой будет лист gid). Есть ли способ связать список листов или таблиц с последними пересмотренными названиями листов или идентификаторами, используя страницу google api v4?
Ответы
Ответ 1
Вы можете получить список листов, используя метод "get" на электронных таблицах:
sheet_metadata = service.spreadsheets().get(spreadsheetId=spreadsheet_id).execute()
sheets = sheet_metadata.get('sheets', '')
title = sheets[0].get("properties", {}).get("title", "Sheet1")
sheet_id = sheets[0].get("properties", {}).get("sheetId", 0)
Ответ 2
Никто еще не спросил об этом на SO для библиотеки PHP, но я просто хотел добавить этот ответ здесь, поскольку это первый результат Google для связанных вопросов.
<?php
$sheets = array();
// ... load library and set up client ...
$service = new Google_Service_Sheets($client);
$response = $service->spreadsheets->get($spreadsheetId);
foreach($response->getSheets() as $s) {
$sheets[] = $s['properties']['title'];
}
return $sheets;
?>
Ответ 3
Для питона.
service = build('sheets', 'v4', credentials=creds)
sheet_metadata = service.spreadsheets().get(spreadsheetId=SHEET_ID).execute()
properties = sheet_metadata.get('sheets')
for item in properties:
if item.get("properties").get('title') == 'SHEET_TITILE':
sheet_id = (item.get("properties").get('sheetId'))
print (sheet_id)
Ответ 4
Это метод С#, который возвращает значение идентификатора листа указанного номера листа и идентификатора таблицы.
Это было сделано с помощью API Google Таблиц v4.
private static Int32 GetSheetIdFromSheetNum(string sSpreadsheetId, Int32 iSheetNum, SheetsService gsService, ref string sTitle)
{ //Get the Sheet Id for the specified sheet number and Spreadsheet id.
Int32 iSheetId = -1;
Int32 iLoop = -1;
//Google.Apis.Sheets.v4.Data.Sheet gsSheet;
Google.Apis.Sheets.v4.Data.Spreadsheet gsSpreadsheet;
try
{
sTitle = string.Empty;
gsSpreadsheet = gsService.Spreadsheets.Get(sSpreadsheetId).Execute();
foreach (Sheet gsSheet in gsSpreadsheet.Sheets)
{
iLoop += 1;
if (iLoop != iSheetNum)
{
continue;
}
iSheetId = (gsSheet.Properties.SheetId).GetValueOrDefault(-1);
sTitle = gsSheet.Properties.Title;
break;
}
}
catch (Exception ex)
{
// Do error processing here.
}
return iSheetId;
} //GetSheetIdFromSheetNum
Ответ 5
Для тех, кто ищет решение для nodejs:
const { google } = require("googleapis")
// Assuming auth has already been generated
const getSheets = async (auth, spreadsheetId) => {
const sheets = google.sheets({version: "v4", auth});
const result = (await sheets.spreadsheets.get({
spreadsheetId
})).data.sheets.map((sheet) => {
return sheet.properties.title
})
return result
}
Это то, что возвращается из await sheets.spreadsheets.get({ spreadsheetId })
Затем, используя этот тип, я сопоставляю результат data.sheets
и возвращаю все заголовки.
Похоже, что он возвращает заголовки в том порядке, в каком они есть на самом листе Google.
Если вы пытаетесь сгенерировать токен авторизации, посмотрите здесь