在 gmail 插件中使用动态选项列表创建 select(下拉)输入
Creating a select (dropdown) input with a dynamic list of options in a gmail addon
Google App Script SelectionInput docs 显示带有静态选项列表的选择输入。尝试创建如下所示的动态选项列表:
var items = [...];
var selectWidget = CardService.newSelectionInput()
.setType(CardService.SelectionInputType.DROPDOWN)
.setTitle("Select an item")
.setFieldName("item");
items.forEach(function (item) {
selectWidget.addItem(item, item, false);
});
导致运行时错误:
Object does not have property
- /Card/sections[0]/widgets[1]/selection_control/items. [line: 115, function: XYZ, file: Code]
我应该如何在我的 gmail 插件中创建带有动态选项的选择输入?
插件下拉列表
我已经有一段时间没有构建任何插件了,但我知道我想在未来的某个时候构建,所以我为自己做了几个例子。这是其中的一部分。
function buildMessageCard(dfltObj){
var card=CardService.newCardBuilder();
card.setHeader(CardService.newCardHeader().setTitle('DropDown Tester'));
var section=CardService.newCardSection().setHeader('Making Choices');
var makeAChoice=CardService.newSelectionInput().setType(CardService.SelectionInputType.DROPDOWN)
.setTitle('Make a Choice')
.setFieldName('userChoice')
.setOnChangeAction(CardService.newAction().setFunctionName('saveChoice'))
for(var i=1;i<dfltObj.selections;i++){
makeAChoice.addItem('Choice ' + i, i, (i==dfltObj.finalChoice)?true:false);
}
section.addWidget(makeAChoice);
var choiceText=CardService.newTextInput()
.setTitle('Final Choice')
.setFieldName('finalChoice')
.setValue(dfltObj.finalChoice);
section.addWidget(choiceText);
card.addSection(section);
return card.build();
}
function saveChoice(e){
var cObj={finalChoice:e.formInput.userChoice};
setDefaults(cObj);
return buildMessageCard(getDefaults());
}
var Default_URL='dflturl';
function setDefaults(dfltObj){
var ss=SpreadsheetApp.openByUrl(Default_URL);
var sh=ss.getSheetByName('Defaults');
var rg=sh.getDataRange();
var vA=rg.getValues();
for(var i=0;i<vA.length;i++){
if(typeof(dfltObj[vA[i][0]])!='undefined'){
vA[i][1]=dfltObj[vA[i][0]];
}
}
rg.setValues(vA);
}
function getDefaults(){
var ss=SpreadsheetApp.openByUrl(Default_URL);
var sh=ss.getSheetByName('Defaults');
var rg=sh.getDataRange();
var vA=rg.getValues();
var dfltObj={};
for(var i=0;i<vA.length;i++){
dfltObj[vA[i][0]]=vA[i][1];
}
return dfltObj;
}
因此,您可以使用一些代码动态更改选择的数量,再多加思考,您可能会弄清楚如何更改选项。
这是我的 dfltObj 的哈希 table:
Google App Script SelectionInput docs 显示带有静态选项列表的选择输入。尝试创建如下所示的动态选项列表:
var items = [...];
var selectWidget = CardService.newSelectionInput()
.setType(CardService.SelectionInputType.DROPDOWN)
.setTitle("Select an item")
.setFieldName("item");
items.forEach(function (item) {
selectWidget.addItem(item, item, false);
});
导致运行时错误:
Object does not have property
- /Card/sections[0]/widgets[1]/selection_control/items. [line: 115, function: XYZ, file: Code]
我应该如何在我的 gmail 插件中创建带有动态选项的选择输入?
插件下拉列表
我已经有一段时间没有构建任何插件了,但我知道我想在未来的某个时候构建,所以我为自己做了几个例子。这是其中的一部分。
function buildMessageCard(dfltObj){
var card=CardService.newCardBuilder();
card.setHeader(CardService.newCardHeader().setTitle('DropDown Tester'));
var section=CardService.newCardSection().setHeader('Making Choices');
var makeAChoice=CardService.newSelectionInput().setType(CardService.SelectionInputType.DROPDOWN)
.setTitle('Make a Choice')
.setFieldName('userChoice')
.setOnChangeAction(CardService.newAction().setFunctionName('saveChoice'))
for(var i=1;i<dfltObj.selections;i++){
makeAChoice.addItem('Choice ' + i, i, (i==dfltObj.finalChoice)?true:false);
}
section.addWidget(makeAChoice);
var choiceText=CardService.newTextInput()
.setTitle('Final Choice')
.setFieldName('finalChoice')
.setValue(dfltObj.finalChoice);
section.addWidget(choiceText);
card.addSection(section);
return card.build();
}
function saveChoice(e){
var cObj={finalChoice:e.formInput.userChoice};
setDefaults(cObj);
return buildMessageCard(getDefaults());
}
var Default_URL='dflturl';
function setDefaults(dfltObj){
var ss=SpreadsheetApp.openByUrl(Default_URL);
var sh=ss.getSheetByName('Defaults');
var rg=sh.getDataRange();
var vA=rg.getValues();
for(var i=0;i<vA.length;i++){
if(typeof(dfltObj[vA[i][0]])!='undefined'){
vA[i][1]=dfltObj[vA[i][0]];
}
}
rg.setValues(vA);
}
function getDefaults(){
var ss=SpreadsheetApp.openByUrl(Default_URL);
var sh=ss.getSheetByName('Defaults');
var rg=sh.getDataRange();
var vA=rg.getValues();
var dfltObj={};
for(var i=0;i<vA.length;i++){
dfltObj[vA[i][0]]=vA[i][1];
}
return dfltObj;
}
因此,您可以使用一些代码动态更改选择的数量,再多加思考,您可能会弄清楚如何更改选项。
这是我的 dfltObj 的哈希 table: