【问题标题】:Google Sheet hyperlink from one cell to another in Python在 Python 中从一个单元格到另一个单元格的 Google Sheet 超链接
【发布时间】:2020-06-15 13:52:00
【问题描述】:

给定一个 Google 表格中的特定单元格,其中包含指向另一个 Google 表格中另一个单元格的超链接 - 如何正确获取此链接以及如何获取链接单元格的值?

到目前为止,我得到了这个:

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',我不知道如何使用此方法从其他工作表访问数据(当然是不应该是我上面做的方式,因为 gc.spreadsheets().values().get() 方法在谈论单元格范围而不是 id 时接受像'B2'这样的东西)+另一个问题是这个解决方案只有当我的第一张工作表的每一行都有到第二张工作表的超链接时才会起作用(我想最后将一个值连接到另一个) - 所以如果一个原始值不包含它,那么我会丢失整个订单并且我有一个大问题。

理想的情况是在循环中获取特定单元格的超链接,然后将其连接到另一个工作表中超链接单元格的值。

【问题讨论】:

  • 虽然我不确定我是否能正确理解您的情况,例如,在这种情况下,使用#gid=###&range=A1=HYPERLINK("#gid=###&range=A1","A1") 而不是#rangeid 怎么样? Ref 这样就可以使用sheet ID 和A1Notation。但我不确定这是否是你所期望的方向。
  • 您好,@Tanaike 的建议对您的任务有用吗?
  • 嗨!不是真的 :( 处理这个电子表格的人将使用 Google 表格在线添加超链接而不是编码,所以我不能像这样自定义它们(@Tanaike 链接了关于如何在 Python 脚本中创建超链接的答案)。我需要从已经手动添加的单元格中提取超链接,然后从链接的单元格中提取值。我正在使用 Google API v4 处理工作表...

标签: python google-sheets hyperlink range google-sheets-api


【解决方案1】:

我已经花了一整天的时间来解决这个问题,以便任何在这个问题上苦苦挣扎的人 -> 我会写下我的所有观察结果和最终解决方案。

  1. 我的第一个也是最大的错误是我通过将超链接添加到原始单元格然后单击要链接到的单元格来创建超链接。这种方式导致了一个仅包含 rangeid 的链接,我不知道如何处理,因为我需要 A1 符号 -> 所以你需要 复制到单元格的路径 你'对链接感兴趣并将其添加到超链接(这样您将获得一个带有 BOTH rangeid + A1 表示法的链接)
  2. 然后迭代 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)

【讨论】:

    【解决方案2】:

    要从单元格中获取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 中导入正则表达式模块才能使用正则表达式。另外,请注意,您可能需要将代码调整为 您拥有的范围,因为这仅适用于一个单元格。

    参考

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多