在 Python 中获取 google 电子表格 api v4 中的工作表和最新工作表列表

Posted

技术标签:

【中文标题】在 Python 中获取 google 电子表格 api v4 中的工作表和最新工作表列表【英文标题】:Get list of sheets and latest sheet in google spreadsheet api v4 in Python 【发布时间】:2016-11-09 18:52:29 【问题描述】:

我正在尝试在google official documentation 之后在 python 3 中读取和写入不同工作表的值。虽然我可以在下面提到的代码块中使用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', [])

我正在尝试使用sample code from here 写入值:

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()

我面临的问题是我无法从官方文档中保留最新的工作表名称或 ID,并且由于最新的 api 修订版正在生成随机 gid(我们可能不知道工作表 gid 会是什么)。有没有办法使用 google sheet api v4 引用工作表列表或电子表格最新修订的工作表名称或 ID?

【问题讨论】:

【参考方案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)

【讨论】:

嗨!你能告诉我一些相当于在 javascript 中获取工作表元数据的东西吗? 来源?寻找 node.js 等价物【参考方案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】:

对于那些寻找 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


This 是从await sheets.spreadsheets.get( spreadsheetId ) 返回的内容

然后,使用this type,映射data.sheets 的结果并返回所有标题。

它看起来是按照它们在实际谷歌表上的顺序返回标题。

如果您正在尝试生成身份验证令牌,那么look here

【讨论】:

【参考方案4】:

对于蟒蛇。

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)

【讨论】:

accepted answer 适用于 python,但这也是一个不错的选择。【参考方案5】:

这是一个 C# 方法,它返回指定工作表编号和电子表格 ID 的工作表 ID 值。

这是使用 Google Sheets API 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

【讨论】:

【参考方案6】:
  sheet_metadata = service.spreadsheets().get(spreadsheetId=sheet_id).execute()
    sheets = sheet_metadata.get('sheets', '')
    for title in sheets:
        print('%s' % (title.get("properties", ).get("title", "Sheet1")))
        SAMPLE_RANGE_NAME = title.get("properties", ).get("title", "Sheet1") ;
        result = sheet.values().get(spreadsheetId=sheet_id,
                                range=SAMPLE_RANGE_NAME).execute();
        print(result);
        values = result.get('values', []);
        if not values:
         print('No data found.')
        else:
         print('Name, Major:')
        for row in values:
            # Print columns A and E, which correspond to indices 0 and 4.
            print('%s, %s' % (row[0], row[1]))

【讨论】:

以上是关于在 Python 中获取 google 电子表格 api v4 中的工作表和最新工作表列表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 访问(读取、写入)Google Sheets 电子表格?

如何在同一电子表格中获取已发布的Google工作表的不同网址

从Google电子表格中解析格式化文本

如何使用 Python 中的 API 重命名 Google Sheets 电子表格中的(工作)表?

是否可以为 appengine 数据存储实体获取 Google 电子表格的数据源 URL?

自定义函数获取该值后将值存储在单元格中/Google 电子表格