【问题标题】:Get metadata for a column with google Sheets API使用 google Sheets API 获取列的元数据
【发布时间】:2020-03-20 19:12:25
【问题描述】:

我有一个 Google 电子表格,我正在使用 google-python-api-client 包连接并与之交互。在this description on metadata search 以及请求正文中的链接之后,我编写了一个函数来获取范围的元数据:

def get_metadata_by_range(range_: Union[dict, str]) -> dict:
    if isinstance(range_, str):
        print("String range: ", range_)
        request_body = {"dataFilters": \
                            {"a1Range": range_}}
    elif isinstance(range_, dict):
        print("Dict range: ", range_)
        request_body = {"dataFilters": \
                            [{"gridRange": range_}]}
    else:
        return None
    request = service.spreadsheets().developerMetadata().\
            search(spreadsheetId=SPREADSHEET_ID, body=request_body)
    return request.execute()

使用范围调用它,无论是 A1 表示法还是 gridRange 都会导致发生错误。例如,使用 get_metadata_by_range("Metadata!A:A") 这一行调用它会导致以下回溯。

String range:  Metadata!A:A
Traceback (most recent call last):
  File "oqc_server/fab/gapc.py", line 82, in <module>
    get_metadata_by_range("Metadata!A:A")
  File "oqc_server/fab/gapc.py", line 69, in get_metadata_by_range
    return request.execute()
  File "/media/kajsa/Storage/Projects/oqc_server/venv/lib/python3.7/site-packages/googleapiclient/_helpers.py", line 130, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "/media/kajsa/Storage/Projects/oqc_server/venv/lib/python3.7/site-packages/googleapiclient/http.py", line 856, in execute
    raise HttpError(resp, content, uri=self.uri)
googleapiclient.errors.HttpError: <HttpError 500 when requesting https://sheets.googleapis.com/v4/spreadsheets/1RhheCsI3kHrm8yK2Yio2kAOU4VOzYdz-eK0vjiMY7co/developerMetadata:search?alt=json returned "Internal error encountered."

关于导致此问题的原因以及如何解决它的任何想法?

【问题讨论】:

    标签: google-api python-3.7 google-sheets-api google-api-python-client


    【解决方案1】:
    • 您希望使用 Sheets API 的 Method: spreadsheets.developerMetadata.search 方法从范围内搜索和检索开发者元数据。
    • 您希望使用 google-api-python-client 和 python 来实现此目的。
    • 您已经能够使用 Sheets API 获取和放置电子表格的值。

    如果我的理解是正确的,那么这个答案呢?请认为这只是几个可能的答案之一。

    修改点:

    • 当你想用范围搜索开发者元数据时,请将gridrange设置为dataFilters[].developerMetadataLookup.metadataLocation.dimensionRange
      • 当范围设置为dataFilters[].a1RangedataFilters[].gridRange 时,我可以确认发生了同样的错误。

    示例脚本:

    从范围中检索开发者元数据的示例脚本如下。使用前请先设置spreadsheet_idsheet_id的变量。

    service = build('sheets', 'v4', credentials=creds)
    spreadsheet_id = '###'  # Please set the Spreadsheet ID.
    sheet_id = ###  # Please set the sheet ID.
    
    search_developer_metadata_request_body = {
        "dataFilters": [
            {
                "developerMetadataLookup": {
                    "metadataLocation": {
                        "dimensionRange": {
                            "sheetId": sheet_id,
                            "dimension": "COLUMNS",
                            "startIndex": 0,
                            "endIndex": 1
                        }
                    }
                }
            }
        ]
    }
    
    request = service.spreadsheets().developerMetadata().search(
        spreadsheetId=spreadsheet_id, body=search_developer_metadata_request_body)
    response = request.execute()
    print(response)
    
    • 上述脚本从sheet_id 的“A”列检索开发者元数据。

    注意:

    • 请根据您的实际脚本修改上述脚本。
    • 在当前阶段,可以将开发人员元数据添加到电子表格、电子表格中的每个表格以及行和列。请注意这一点。 Ref

    参考资料:

    如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

    【讨论】:

    • 我最终做了一个这样的解决方法,但是这需要将gridRange 转换为dimensionRange 或更糟,将a1Range 转换为dimenstionRange。我认为这是一个很好的解决方法,但希望他们能解决根本问题,以便您将来可以使用常规范围。
    • @Kajsa 感谢您的回复。很抱歉我的回答不是你所期望的方向。
    【解决方案2】:

    developerMetadata 存在与作为过滤器传递的 a1Range 对象相关的错误。

    编辑

    我再次检查了该错误并已实施修复。

    【讨论】:

    • 您是否也尝试将元数据添加到其他范围?使用它我可以获得整个文档的所有元数据,而不仅仅是我想要的范围。
    • 另外,只记得此页面声明您只能使用一种过滤器类型。 developers.google.com/sheets/api/reference/rest/v4/DataFilter 这可能正在制作第一项,这是一个全包查找,即实际使用的一项。这可以解释为什么我从整个文档中获取所有数据。
    • @Kajsa 是的,对不起,你是对的。我刚刚测试了它,它似乎是一个错误。
    • 如果我尝试使用gridRange 选项,也会遇到同样的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多