在 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: