首页 > 解决方案 > 如何在 Google Data Studio 中使用带有 ID(键值)的过滤器控件

问题描述

我正在为 Google Datastudio 开发一个自定义连接器,它按照Google Data Studio Community Connectors文档和关于构建自定义 Google Data Studio的非常好的文章连接到特定的 API 服务。

数据架构是:

function getFields(request) {
  var fields = cc.getFields();
  var types = cc.FieldType;
  var aggregations = cc.AggregationType;

  fields.newDimension().setId('id').setName('ID').setType(types.NUMBER);
  fields.newDimension().setId('date').setName('Date').setType(types.YEAR_MONTH_DAY);
  fields.newDimension().setId('user_id').setName('User ID').setType(types.NUMBER);
  fields.newDimension().setId('user').setName('User').setType(types.TEXT);

  //fields.newMetric().setId('time').setName('Time').setType(types.DURATION).setAggregation(aggregations.SUM);
  fields.newMetric().setId('time').setName('Time').setType(types.NUMBER).setAggregation(aggregations.SUM);
  fields.newMetric().setId('revenue').setName('Revenue').setType(types.CURRENCY_EUR).setAggregation(aggregations.SUM);

  fields.setDefaultDimension('user');
  fields.setDefaultMetric('time');

  return fields;
}

由于从 API 检索的数据可能非常大,我想直接在 API 级别应用 Google Data Studio 提供的过滤器。问题是,工作室中的过滤器控件通常会显示一个用户友好的可读名称,例如用户名,而不是用户 ID。但是,API 级别需要用户 id 进行过滤。我收到的请求:

function getData(request) {
  // retrieve the data
}

在没有 ID 的情况下获取此过滤器。而且我并不热衷于在面向用户的过滤器控件中显示用户 ID。

{
  scriptParams={lastRefresh=1588507514238}, 
  fields=[{name=time}, {forFilterOnly=true, name=user}], 
  dateRange={endDate=2020-05-02, startDate=2020-04-05}, 
  dimensionsFilters=[[{fieldName=user, type=INCLUDE, values=[John Doe], operator=IN_LIST}]]
}

我看到工作室中的过滤器控件不支持键值。知道如何以任何其他方式实现这一目标吗?我唯一的想法是将已知的 user-user_id 组合存储在缓存中,并在发送 API 请求之前将用户名转换为用户 ID。但希望有更简单的方法吗?

正确的过滤器应该是这样的:

{
  scriptParams={lastRefresh=1588507514238}, 
  fields=[{name=time}, {forFilterOnly=true, name=user_id}], 
  dateRange={endDate=2020-05-02, startDate=2020-04-05}, 
  dimensionsFilters=[[{fieldName=user_id, type=INCLUDE, values=[1234], operator=IN_LIST}]]
}

标签: filteringwhere-clausegoogle-data-studio

解决方案


实际上,Google Data Studio 并没有像这里解释的那样提供这种支持。这完全有道理。为什么?如果报表的设计者添加了一个过滤器控件(例如用户名),那么该过滤器控件需要知道所有可能的用户。否则,它无法向用户显示所有选项/选择。因此,它必须至少一次向连接器询问所有未过滤的数据。Data Studio 将自动处理缓存

尽管如此,还是建议在连接器中缓存 HTTP 结果,以防 UI 决定再次请求数据。这是您需要CacheService的时候,这里有一个很好的演示实现。在这种情况下,第一次 HTTP 调用将需要一段时间,但所有后续调用都会快得多。想象您的初始结果有 1.000 行,您仍然可能需要在连接器内对其进行过滤以获得最终结果,比如说 6 行,这可能会很慢。由 UI 完成的过滤甚至更慢。

如果您仍然需要在用户名和用户 id 或类似关系之间进行转换,那么您可能需要在检索数据时缓存这些关系,并通过解析将 UI 过滤器(用于用户名)转换为 id(例如用户 id)这种与缓存数据的关系。在这种情况下,您将忽略最初缓存的 1.000 行结果(只是一个示例),使用 id(例如用户 id)调整您的 HTTP GET 查询,从而仅检索 6 行。这是一个 API 调用,但在连接器和 UI 中都没有过滤。连接器实现的过滤在此处以及过滤器 API 参考中进行了说明。

您需要自行决定是否需要在 API 级别、连接器内部或由 UI 自动进行过滤。在我的情况下,API 级别更快,但它调用 API 调用,而某些 API 在后续(频率)或每日(配额)调用的数量上非常有限。


推荐阅读