回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我想确定一种方法来获取Google电子表格工作簿中每个工作表的URL内的工作表ID。例如,<a href="https://docs.google.com/spreadsheets/d/1yd8qTYjRns4_OT8PbsZzH0zajvzguKS79dq6j--hnTs/edit#gid=1244369280" rel="nofollow noreferrer">this workbook</a>的“sheet2”的工作表id是“1244369280”,因为它的url是<a href="https://docs.google.com/spreadsheets/d/1yd8qTYjRns4_OT8PbsZzH0zajvzguKS79dq6j--hnTs/edit#gid=1244369280" rel="nofollow noreferrer">https://docs.google.com/spreadsheets/d/1yd8qTYjRns4_OT8PbsZzH0zajvzguKS79dq6j--hnTs/edit#gid=1244369280</a></p>
<p>我发现的一种方法是提取Google电子表格的XML,因为根据<a href="https://stackoverflow.com/questions/23609688/how-to-convert-from-gid-to-od-worksheet-id-in-new-google-spreadsheets/25436149#25436149">this question</a>,获得工作表ID的唯一方法是将工作表的XML流化,但是这个例子是用Javascript编写的,我需要用Python来完成</p>
<p>这是我想用Python执行的Javascript代码:</p>
<pre><code> Dim worksheetFeed As WorksheetFeed
Dim query As WorksheetQuery
Dim worksheet As WorksheetEntry
Dim output As New MemoryStream
Dim xml As String
Dim gid As String = String.Empty
Try
_service = New Spreadsheets.SpreadsheetsService("ServiceName")
_service.setUserCredentials(UserId, Password)
query = New WorksheetQuery(feedUrl)
worksheetFeed = _service.Query(query)
worksheet = worksheetFeed.Entries(0)
' Save worksheet feed to memory stream so we can
' get the xml returned from the feed url and look for
' the gid. Gid allows us to download the specific worksheet tab
Using output
worksheet.SaveToXml(output)
End Using
xml = Encoding.ASCII.GetString(output.ToArray())
</code></pre>
<p>从Google电子表格中获取XML的最佳方法似乎是使用Gdata,所以我下载了Gdata并用我的凭证尝试了<a href="https://github.com/google/gdata-python-client/blob/master/samples/spreadsheets/spreadsheetExample.py" rel="nofollow noreferrer">the Google Spreadsheet example</a>。在</p>
<p>见下文</p>
^{pr2}$
<p>但是,这将返回以下错误:</p>
<pre><code>Traceback (most recent call last):
File "/Users/Chris/Desktop/gdata_test.py", line 200, in <module>
main()
File "/Users/Chris/Desktop/gdata_test.py", line 196, in main
sample.Run()
File "/Users/Chris/Desktop/gdata_test.py", line 162, in Run
self._PromptForSpreadsheet()
File "/Users/Chris/Desktop/gdata_test.py", line 49, in _PromptForSpreadsheet
feed = self.gd_client.GetSpreadsheetsFeed()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/gdata/spreadsheet/service.py", line 99, in GetSpreadsheetsFeed
converter=gdata.spreadsheet.SpreadsheetsSpreadsheetsFeedFromString)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/gdata/service.py", line 1074, in Get
return converter(result_body)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/gdata/spreadsheet/__init__.py", line 395, in SpreadsheetsSpreadsheetsFeedFromString
xml_string)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/atom/__init__.py", line 93, in optional_warn_function
return f(*args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/atom/__init__.py", line 127, in CreateClassFromXMLString
tree = ElementTree.fromstring(xml_string)
File "<string>", line 125, in XML
cElementTree.ParseError: no element found: line 1, column 0
[Finished in 0.3s with exit code 1]
[shell_cmd: python -u "/Users/Chris/Desktop/gdata_test.py"]
[dir: /Users/Chris/Desktop]
[path: /usr/bin:/bin:/usr/sbin:/sbin]
</code></pre>
<p>我还应该提到,我一直在使用Gspread作为与Google电子表格交互的方法,但是当我运行下面的代码时,我得到了gid,但是我需要有工作表id</p>
<pre><code>gc = gspread.authorize(credentials)
sh = gc.open_by_url('google_spreadsheet_url')
sh.get_id_fields()
>> {'spreadsheet_id': '1BgCEn-3Nor7UxOEPwD-qv8qXe7CaveJBrn9_Lcpo4W4','worksheet_id': 'oqitk0d'}
</code></pre>