Получить список листов и последний лист в электронной таблице 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.

Если вы пытаетесь сгенерировать токен авторизации, посмотрите здесь