当通过转置获得列标题时,如何迭代Google电子表格?

时间:2012-12-26 21:28:34

标签: gdata

我在一个电子表格文档中有两个Google电子表格。第一个有一个名单。每行对应一个唯一的名称。

第二个文档显示第一个的转置。这意味着在文档1中逐行列出的名称现在显示为列标题。我使用以下等式实现了这一点:

=TRANSPOSE(FirstSheetName!A2:$A)

在我的python代码中,我尝试从第二张表中读取行列表,如下所示:

spr_client = gdata.spreadsheet.service.SpreadsheetsService()

worksheets_feed = ... # obtain feed of worksheets
sheet_id = get_sheet_id('SecondSheetName') # method for retrieving the sheet id
sheet_feed = spr_client.GetListFeed(SPREADSHEET_KEY, sheet_id)

然而,当我尝试遍历列表时,我看到了意想不到的结果。在自定义词典中,我没有看到转置标题,这些标题在通过Google驱动器用户界面查看工作表时可见。相反,我看到许多带有随机键的条目看起来像哈希。一些例子是:'_ cssly','_ auk5k','_ a832w'。

sheet_feed.entry[0].custom.keys() # results don't correlate directly with column headings

我的问题是,这些奇怪的键引用了什么?我怎样才能获得他们指向的数据?

1 个答案:

答案 0 :(得分:1)

我有一个非常相似的问题,并且通过使用GetCellsFeed的提示非常有帮助。

以下是我的代码的显示方式:

import gdata.spreadsheet.service
import datetime
#http://www.payne.org/index.php/Reading_Google_Spreadsheets_in_Python

username = 'username@gmail.com'
passwd = "password"
spreadsheet_id = "xxxxxxx" #take it out of the url between key= and &

# Connect to Google
gd_client = gdata.spreadsheet.service.SpreadsheetsService()
gd_client.email = username
gd_client.password = passwd
gd_client.ProgrammaticLogin()

#Use this snippet to find the worksheet id given the name of the worksheet
feed = gd_client.GetWorksheetsFeed(spreadsheet_id)
for f in feed.entry:
    if f.title.text == "Worksheet Name":
        worksheet_id = f.id.text.rsplit('/',1)[1]
        print f.title.text, worksheet_id
        break

The interesting bit of code!
cells = gd_client.GetCellsFeed(spreadsheet_id,worksheet_id).entry

d = dict()
keys = []
for cell in cells:
    if cell.cell.row == '1':
        keys.append(cell.cell.text)
        d[cell.cell.text] = []
    else:
        k = keys[int(cell.cell.col)-1]
        v = cell.cell.text
        if k == "Date":
            d[k].append(datetime.datetime.strptime(v, '%m/%d/%Y'))
        else:
            d[k].append(int(v))

这将创建一个字典,其中包含按照第一行的键和(在本例中)整数和日期的列表。你也可以使用float(v)表示浮点数,如果你想要字符串,也可以使用v。