【问题标题】:Creating a select (dropdown) input with a dynamic list of options in a gmail addon在 gmail 插件中使用动态选项列表创建选择(下拉)输入
【发布时间】:2021-07-17 16:21:24
【问题描述】:

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 插件中创建带有动态选项的选择输入?

【问题讨论】:

    标签: google-apps-script gmail-addons


    【解决方案1】:

    插件下拉菜单

    我有一段时间没有构建任何插件,但我知道我想在未来的某个时候做,所以我为自己做了几个例子。这是其中之一。

    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 的哈希表:

    【讨论】:

    • 显然,您必须重建那张独特的卡片才能让它读取新的默认值。但看起来它在电子邮件之间会这样做,如果你所做的实际上是插件的一部分,那么你可以让它在更改默认值后重建卡。我应该指出,适用于本示例的唯一项目是 finalChoice 和 selections。其余的是我没有分享的项目的其他部分。
    猜你喜欢
    • 2013-12-14
    • 2014-06-09
    • 2016-10-28
    • 2012-04-30
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多