filtering - 如何在 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}]]
}
解决方案
实际上,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 在后续(频率)或每日(配额)调用的数量上非常有限。
推荐阅读
- jquery - 搜索过滤
- fortran - 这是 GFortran 10 中的错误吗?
- java - 如何通过另一个线程更新我的 jLabel?
- nsight - NVidia NSight 看不到着色器资源名称 (DX12)
- javascript - 如何从下面的模板中删除 Blooger 帖子片段代码
- python-3.x - 安全地交换公共 dsa 密钥以在 python 中手动使用
- python - 如何在数据帧(python/pandas)中将日期时间(YYYY-MM-DD HH-MM-SS)缩短为年月(YYYY-MM)
- c# - 有没有办法创建分配给退出表单窗口的缩放图像
- javascript - 为什么双击在 Iphone 上不起作用
- python - 为什么 time.sleep() 一次发生而不是一次发生?