分步配置
使用集合让一切井井有条
根据您的偏好保存内容并对其进行分类。
借助分步配置,连接器可以根据用户提供的回答动态填充连接器配置。例如,在用户选择“州”下拉列表后填充“城市”下拉列表。
要求
本指南假设您已熟悉社区连接器配置。如需回顾相关知识,请参阅通过 getConfig 定义配置。
概览
分步配置由 Looker Studio 调用 getConfig()
多个方法组成
而您的连接器每次都会返回更多配置问题。每个
对 getConfig()
的调用将包含用户对上一个 getConfig()
的回答
响应。只要您使用
setIsSteppedConfig(true)
。
指南
- 设置
setIsSteppedConfig(true)
,直到配置完成
- 只要满足以下条件,Looker Studio 就会反复调用
getConfig()
:
已设置 setIsSteppedConfig(true)
。配置完成后,
getConfig()
响应应设置 setIsSteppedConfig(false)
。
- 为可用于确定后续问题的配置问题设置
isDynamic(true)
- 如果用户修改了标记为
isDynamic
的字段,则后续
配置条目会在界面中清除,并且用户需要
配置所有后续步骤这有助于确保用户不会向您发送
配置无效。
- 用户提供的回答将通过
request.configParams
传递。
request.configParams
前 getConfig()
的价格为 undefined
向连接器发出请求后续请求将包括
用户提供的回答作为由配置 ID 或
如果用户未提供任何答案,则为 undefined
;
示例:
{
state: 'CA',
city: 'mountain_view'
}
- 配置是累加的
新的配置问题应添加到现有配置问题之后。
- 配置无法更改
如果用户之前询问过某个配置问题,则它应针对所有后续调用显示。例如,如果系统询问了配置问题 A
第一次调用 getConfig()
时,所有将来都应添加 A
响应。
- 配置是幂等的
使用同一 configParams
调用 getConfig()
应返回相同的结果
配置。
- 动态参数不可替换
Looker Studio 不允许
覆盖。
配置示例
动态下拉列表
第一个问题提示用户选择一个州,然后它根据用户所选的州动态提供一个“城市”下拉列表。
var cc = DataStudioApp.createCommunityConnector();
function optionsForState(state) {
switch (state) {
case "IL": {
return [["Chicago", "chicago"], ["Springfield", "springfield"]];
}
case "CA": {
return [["Mountain View", "mountain_view"], ["Los Angeles", "los_angeles"]];
}
default: {
cc.newUserError()
.setText('You must either select "IL" or "CA"')
.throwException();
}
}
}
function getConfig(request) {
var configParams = request.configParams;
var isFirstRequest = configParams === undefined;
var config = cc.getConfig();
if (isFirstRequest) {
config.setIsSteppedConfig(true);
}
config.newSelectSingle()
.setId("state")
.setName("State")
// Set isDynamic to true so any changes to State will clear the city
// selections.
.setIsDynamic(true)
.addOption(config.newOptionBuilder().setLabel("Illinois").setValue("IL"))
.addOption(config.newOptionBuilder().setLabel("California").setValue("CA"));
if (!isFirstRequest) {
var city = config.newSelectSingle()
.setId("city")
.setName("City");
var cityOptions = optionsForState(configParams.state);
cityOptions.forEach(function(labelAndValue) {
var cityLabel = labelAndValue[0];
var cityValue = labelAndValue[1];
city.addOption(config.newOptionBuilder().setLabel(cityLabel).setValue(cityValue));
});
}
return config.build();
}
分支路径
如果用户选择的“国家/地区”是“USA”,则系统会再提问一个问题。
var cc = DataStudioApp.createCommunityConnector();
function getConfig(request) {
var configParams = request.configParams;
var isFirstRequest = configParams === undefined;
var config = cc.getConfig();
if (isFirstRequest) {
config.setIsSteppedConfig(true);
}
config
.newSelectSingle()
.setId('country')
.setName('Country')
// Set isDynamic to true so any changes to Country will clear the state
// selections.
.setIsDynamic(true)
.addOption(config.newOptionBuilder().setLabel('United States').setValue('USA'))
.addOption(config.newOptionBuilder().setLabel('Canada').setValue('CA'));
if (!isFirstRequest) {
// validate a valid value was selected for configParams.country
if (configParams.country === undefined) {
cc.newUserError().setText('You must choose a country.').throwException();
}
switch (configParams.country) {
case 'USA': {
config
.newSelectSingle()
.setId('state')
.setName('State')
.addOption(config.newOptionBuilder().setLabel('New York').setValue('NY'))
.addOption(config.newOptionBuilder().setLabel('Calfornia').setValue('CA'));
break;
}
case 'CA': {
// No additional configuration is needed for Canada.
break;
}
default: {
cc.newUserError()
.setText('You must either select "CA" or "USA"')
.throwException();
}
}
}
return config.build();
}
如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可获得了许可,并且代码示例已根据 Apache 2.0 许可获得了许可。有关详情,请参阅 Google 开发者网站政策。Java 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2025-07-25。
[null,null,["最后更新时间 (UTC):2025-07-25。"],[[["\u003cp\u003eStepped configuration in Looker Studio connectors allows dynamic population of configuration fields based on user input, such as showing city options after a state is selected.\u003c/p\u003e\n"],["\u003cp\u003eThe process involves Looker Studio repeatedly calling the \u003ccode\u003egetConfig()\u003c/code\u003e function, with the connector providing new configuration questions based on previous answers until the configuration is complete.\u003c/p\u003e\n"],["\u003cp\u003eConfiguration questions influencing later steps should be marked as dynamic using \u003ccode\u003eisDynamic(true)\u003c/code\u003e, ensuring the user reconfigures subsequent steps upon modification.\u003c/p\u003e\n"],["\u003cp\u003eConnectors receive user-provided answers through \u003ccode\u003erequest.configParams\u003c/code\u003e, allowing for conditional logic and tailoring of configuration options.\u003c/p\u003e\n"],["\u003cp\u003eConfigurations should be additive, idempotent (returning the same configuration for identical inputs), and immutable once introduced, with dynamic parameters being non-overridable.\u003c/p\u003e\n"]]],[],null,["# Stepped Configuration\n\nStepped configuration allows a connector to dynamically populate the connector\nconfiguration based on user-provided answers. For example, populating a \"City\"\ndropdown after a \"State\" dropdown is selected.\n\nRequirements\n------------\n\nThis guide assumes you are already familiar with Community Connector\nconfigurations. See [define configuration via getConfig](/looker-studio/connector/build#define_configuration_via_getconfig) for a refresher.\n\nOverview\n--------\n\nStepped configuration consists of Looker Studio calling `getConfig()` multiple\ntimes, and your connector returning more configuration questions each time. Each\ncall to `getConfig()` will include the user's answers to the last `getConfig()`\nresponse. This process is continued as long as you return a response with\n`setIsSteppedConfig(true)`.\n\nGuidelines\n----------\n\nSet `setIsSteppedConfig(true)` until the configuration is complete\n: Looker Studio will repeatedly call `getConfig()` as long as\n `setIsSteppedConfig(true)` is set.Once configuration is complete, the final\n `getConfig()` response should set `setIsSteppedConfig(false)`.\n\nSet `isDynamic(true)` for configuration questions that determine later questions\n: If a field marked `isDynamic` is modified by the user, subsequent\n configuration entries will be cleared in the UI, and the user will need to\n configure all subsequent steps. This helps ensure users don't send you an\n invalid configuration.\n\nUser-provided answers will be passed via `request.configParams`.\n\n: `request.configParams` will be `undefined` for the first `getConfig()`\n request to your connector. Subsequent requests will include the\n user-provided answers as an object keyed by the configuration ids or\n `undefined` if the user doesn't provide any answers.\n\n Example: \n\n {\n state: 'CA',\n city: 'mountain_view'\n }\n\nConfigurations are additive\n\n: New configuration questions should be added after existing ones.\n\nConfigurations cannot be mutated\n\n: If a configuration question was asked previously, it should be present for\n all subsequent calls. For example, if configuration question **A** was asked\n in the first call to `getConfig()`, **A** should be included in all future\n responses.\n\nConfigurations are idempotent\n\n: Calls to `getConfig()` with the same `configParams` should return the same\n configuration.\n\nDynamic parameters cannot be overridable\n\n: Looker Studio will not allow dynamic configuration parameters to be\n [overridden](/looker-studio/connector/data-source-parameters).\n\nExample configurations\n----------------------\n\n### Dynamic dropdowns\n\nThis first question prompts a user to select a state, then dynamically provides\na city dropdown based on the selected state. \n\n var cc = DataStudioApp.createCommunityConnector();\n\n function optionsForState(state) {\n switch (state) {\n case \"IL\": {\n return [[\"Chicago\", \"chicago\"], [\"Springfield\", \"springfield\"]];\n }\n case \"CA\": {\n return [[\"Mountain View\", \"mountain_view\"], [\"Los Angeles\", \"los_angeles\"]];\n }\n default: {\n cc.newUserError()\n .setText('You must either select \"IL\" or \"CA\"')\n .throwException();\n }\n }\n }\n\n function getConfig(request) {\n var configParams = request.configParams;\n var isFirstRequest = configParams === undefined;\n var config = cc.getConfig();\n if (isFirstRequest) {\n config.setIsSteppedConfig(true);\n }\n\n config.newSelectSingle()\n .setId(\"state\")\n .setName(\"State\")\n // Set isDynamic to true so any changes to State will clear the city\n // selections.\n .setIsDynamic(true)\n .addOption(config.newOptionBuilder().setLabel(\"Illinois\").setValue(\"IL\"))\n .addOption(config.newOptionBuilder().setLabel(\"California\").setValue(\"CA\"));\n\n if (!isFirstRequest) {\n var city = config.newSelectSingle()\n .setId(\"city\")\n .setName(\"City\");\n var cityOptions = optionsForState(configParams.state);\n cityOptions.forEach(function(labelAndValue) {\n var cityLabel = labelAndValue[0];\n var cityValue = labelAndValue[1];\n city.addOption(config.newOptionBuilder().setLabel(cityLabel).setValue(cityValue));\n });\n }\n return config.build();\n }\n\n### Branching Paths\n\nThis will ask an additional question if the selected \"Country\" is \"USA\". \n\n var cc = DataStudioApp.createCommunityConnector();\n\n function getConfig(request) {\n var configParams = request.configParams;\n var isFirstRequest = configParams === undefined;\n var config = cc.getConfig();\n if (isFirstRequest) {\n config.setIsSteppedConfig(true);\n }\n\n config\n .newSelectSingle()\n .setId('country')\n .setName('Country')\n // Set isDynamic to true so any changes to Country will clear the state\n // selections.\n .setIsDynamic(true)\n .addOption(config.newOptionBuilder().setLabel('United States').setValue('USA'))\n .addOption(config.newOptionBuilder().setLabel('Canada').setValue('CA'));\n\n if (!isFirstRequest) {\n // validate a valid value was selected for configParams.country\n if (configParams.country === undefined) {\n cc.newUserError().setText('You must choose a country.').throwException();\n }\n switch (configParams.country) {\n case 'USA': {\n config\n .newSelectSingle()\n .setId('state')\n .setName('State')\n .addOption(config.newOptionBuilder().setLabel('New York').setValue('NY'))\n .addOption(config.newOptionBuilder().setLabel('Calfornia').setValue('CA'));\n break;\n }\n case 'CA': {\n // No additional configuration is needed for Canada.\n break;\n }\n default: {\n cc.newUserError()\n .setText('You must either select \"CA\" or \"USA\"')\n .throwException();\n }\n }\n }\n return config.build();\n }"]]