Google Sheet 在 Python 中从一个单元格到另一个单元格的超链接
Google Sheet hyperlink from one cell to another in Python
从一个 Google Sheet 中给定一个包含超 link 的特定单元格到另一个 Google Sheet 中的另一个单元格 - 如何获得这个link 正确以及如何获取 linked 单元格的值?
到目前为止我得到了这个:
table_entities = gc.values().get(spreadsheetId=excel_id, range='XYZ').execute()['values']
table_entities_synthesis = gc.get(spreadsheetId=excel_id, ranges='XYZ', fields="sheets/data/rowData/values/hyperlink").execute()
synthesis_rangeid_list = []
for hyperlink in table_entities_synthesis.get('sheets')[0].get('data')[0].get('rowData'):
if hyperlink.get('values', ''):
hyperlink = hyperlink.get('values')[1].get('hyperlink')
synthesis_rangeid_list.append(hyperlink)
request = gc.spreadsheets().values().get(spreadsheetId=ABC, range=hyperlink,
valueRenderOption=value_render_option, dateTimeRenderOption=date_time_render_option)
response = request.execute()
但是这种方法给了我一个像这样的范围 ID 列表:'#rangeid=737563017' 我不知道如何从另一个 sheet 用这个(当然它不应该是我上面做的方式因为 gc.spreadsheets().values().get() 方法在谈论单元格时接受像 'B2' 这样的东西范围而不是 id) + 另一个问题是,只有当我的第一个 sheet 的每一行都有一个 hyperlink 到第二个 sheet 时,这个解决方案才会起作用(我想连接一个最后对另一个价值) - 所以如果一个原始文件不包含它那么我会丢失整个订单并且我有一个巨大的问题。
理想的情况是在循环中获取特定单元格的 hyperlink,然后将其连接到另一个 sheet 的 hyperlinked 单元格的值.
要从单元格中获取 hyperlink
,您应该试试这个:
SPREADSHEET_ID = 'ID_OF_THE_SS'
RANGE_NAME = 'SS_RANGE'
FIELDS = 'sheets/data/rowData/values/hyperlink'
request = service.spreadsheets().get(spreadsheetId = SPREADSHEET_ID, ranges = RANGE_NAME, includeGridData = 'true', fields = FIELDS)
response = request.execute()
至于检索超链接中引用的单元格的范围,您只需要使用以下正则表达式:
response = str(response)
results = re.search('[^0-9a-zA-Z_$:]($?[a-zA-Z]{1,2}$?[1-9][0-9]*)(?![0-9a-zA-Z_:])', response)
print(results.group(1))
备注
您必须使用 import re
在 Python 中导入正则表达式模块才能使用正则表达式。另外,请注意,您可能需要将代码调整到您拥有的范围 ,因为这仅适用于一个单元格。
参考
Regular Expression To Extract Valid Cell References From A Spreadsheet Formula;
我花了一整天的时间试图解决这个问题,所以对于任何正在为这个问题而苦苦挣扎的人 -> 我会写下我的所有观察结果和最终解决方案。
- 我的第一个也是最大的错误是我通过将它添加到原始单元格然后单击我想要 link 的单元格来创建 hyperlink。这种方式导致 link 仅包含 rangeid,我不知道如何处理因为我需要 A1 符号 -> 所以你需要 将路径复制到单元格 您对 linking 感兴趣并将其添加到 hyperlink(这样您将拥有一个带有 BOTH rangeid + A1 表示法的 link)
- 然后您遍历 service.spreadsheets().get() 请求的结果,并使用来自 @ale13 答案的正则表达式来获取 A1 表示法中的确切单元格位置。
hyperlink_entities = gc.get(spreadsheetId=excel_id, ranges='sample_range!A1:P', fields="sheets/data/rowData/values/hyperlink", includeGridData='true').execute()
cell_range = []
for hyperlink in hyperlink_entities.get('sheets')[0].get('data')[0].get('rowData'):
if hyperlink.get('values', ''):
cell_address = (re.search('[^0-9a-zA-Z_$:]($?[a-zA-Z]{1,2}$?[1-9][0-9]*)(?![0-9a-zA-Z_:])', hyperlink.get('values')[1].get('hyperlink'))).group(1)
print(cell_address)
cell_range.append(cell_address)
从一个 Google Sheet 中给定一个包含超 link 的特定单元格到另一个 Google Sheet 中的另一个单元格 - 如何获得这个link 正确以及如何获取 linked 单元格的值?
到目前为止我得到了这个:
table_entities = gc.values().get(spreadsheetId=excel_id, range='XYZ').execute()['values']
table_entities_synthesis = gc.get(spreadsheetId=excel_id, ranges='XYZ', fields="sheets/data/rowData/values/hyperlink").execute()
synthesis_rangeid_list = []
for hyperlink in table_entities_synthesis.get('sheets')[0].get('data')[0].get('rowData'):
if hyperlink.get('values', ''):
hyperlink = hyperlink.get('values')[1].get('hyperlink')
synthesis_rangeid_list.append(hyperlink)
request = gc.spreadsheets().values().get(spreadsheetId=ABC, range=hyperlink,
valueRenderOption=value_render_option, dateTimeRenderOption=date_time_render_option)
response = request.execute()
但是这种方法给了我一个像这样的范围 ID 列表:'#rangeid=737563017' 我不知道如何从另一个 sheet 用这个(当然它不应该是我上面做的方式因为 gc.spreadsheets().values().get() 方法在谈论单元格时接受像 'B2' 这样的东西范围而不是 id) + 另一个问题是,只有当我的第一个 sheet 的每一行都有一个 hyperlink 到第二个 sheet 时,这个解决方案才会起作用(我想连接一个最后对另一个价值) - 所以如果一个原始文件不包含它那么我会丢失整个订单并且我有一个巨大的问题。
理想的情况是在循环中获取特定单元格的 hyperlink,然后将其连接到另一个 sheet 的 hyperlinked 单元格的值.
要从单元格中获取 hyperlink
,您应该试试这个:
SPREADSHEET_ID = 'ID_OF_THE_SS'
RANGE_NAME = 'SS_RANGE'
FIELDS = 'sheets/data/rowData/values/hyperlink'
request = service.spreadsheets().get(spreadsheetId = SPREADSHEET_ID, ranges = RANGE_NAME, includeGridData = 'true', fields = FIELDS)
response = request.execute()
至于检索超链接中引用的单元格的范围,您只需要使用以下正则表达式:
response = str(response)
results = re.search('[^0-9a-zA-Z_$:]($?[a-zA-Z]{1,2}$?[1-9][0-9]*)(?![0-9a-zA-Z_:])', response)
print(results.group(1))
备注
您必须使用 import re
在 Python 中导入正则表达式模块才能使用正则表达式。另外,请注意,您可能需要将代码调整到您拥有的范围 ,因为这仅适用于一个单元格。
参考
Regular Expression To Extract Valid Cell References From A Spreadsheet Formula;
我花了一整天的时间试图解决这个问题,所以对于任何正在为这个问题而苦苦挣扎的人 -> 我会写下我的所有观察结果和最终解决方案。
- 我的第一个也是最大的错误是我通过将它添加到原始单元格然后单击我想要 link 的单元格来创建 hyperlink。这种方式导致 link 仅包含 rangeid,我不知道如何处理因为我需要 A1 符号 -> 所以你需要 将路径复制到单元格 您对 linking 感兴趣并将其添加到 hyperlink(这样您将拥有一个带有 BOTH rangeid + A1 表示法的 link)
- 然后您遍历 service.spreadsheets().get() 请求的结果,并使用来自 @ale13 答案的正则表达式来获取 A1 表示法中的确切单元格位置。
hyperlink_entities = gc.get(spreadsheetId=excel_id, ranges='sample_range!A1:P', fields="sheets/data/rowData/values/hyperlink", includeGridData='true').execute()
cell_range = []
for hyperlink in hyperlink_entities.get('sheets')[0].get('data')[0].get('rowData'):
if hyperlink.get('values', ''):
cell_address = (re.search('[^0-9a-zA-Z_$:]($?[a-zA-Z]{1,2}$?[1-9][0-9]*)(?![0-9a-zA-Z_:])', hyperlink.get('values')[1].get('hyperlink'))).group(1)
print(cell_address)
cell_range.append(cell_address)