首页 > 解决方案 > 如何在谷歌日历插件上获取输入值?

问题描述

我正在为 Google 日历编写我的第一个插件,但我无法从输入字段或日期选择器中获取值。

我创建了一张带有几个日期选择器(事件开始日期和结束日期)、一个文本输入(用于事件标题)和一个按钮的卡片。我想要做的是单击一个按钮后,我想获取文本输入的输入值并(现在)记录它。

这就是我所拥有的:

var card = CardService.newCardBuilder();
var textInputTitle = CardService.newTextInput()
    .setFieldName("text_input_title")
    .setTitle("Title for editor");

function onHomepage(e) {
  return createCard(e.hostApp, true);
}

function createCard(text) {

// Create action button for submitting entered data
  var action = CardService.newAction()
      .setFunctionName('onCreateEvent')
      .setParameters({text: text});
  var button = CardService.newTextButton()
      .setText('Create event')
      .setOnClickAction(action)
      .setTextButtonStyle(CardService.TextButtonStyle.FILLED);
  var buttonSet = CardService.newButtonSet()
      .addButton(button);

  var startDateTimePicker = CardService.newDateTimePicker()
    .setTitle("Event start date")
    .setFieldName("date_time_field_start")
    .setValueInMsSinceEpoch(new Date().getTime())
    .setTimeZoneOffsetInMins(+2 * 60)
    .setOnChangeAction(CardService.newAction()
    .setFunctionName("handleDateTimeChange"));

  var endDateTimePicker = CardService.newDateTimePicker()
    .setTitle("Event end date")
    .setFieldName("date_time_field_end")
    .setValueInMsSinceEpoch(new Date().getTime())
    .setTimeZoneOffsetInMins(+2 * 60)
    .setOnChangeAction(CardService.newAction()
    .setFunctionName("handleDateTimeChange"));


  var section = CardService.newCardSection().setHeader("I am section header")
      .addWidget(startDateTimePicker)
      .addWidget(endDateTimePicker)
      .addWidget(textInputTitle)
      .addWidget(buttonSet);

  card.addSection(section);
  return card.build();
  } 

function onCreateEvent(e){
  Logger.log("Text input%s ",JSON.stringify(e) );
}

我试图记录 textInputs 值,但我得到的只是空值。我还检查了Google 应用脚本,gmail 插件获取解决类似问题的 TextInput 值,但我不知道e.formInput是从哪里来的。

更新添加我的清单文件

{
  "timeZone": "America/New_York",
  "dependencies": {
    "enabledAdvancedServices": [{
      "userSymbol": "Calendar",
      "serviceId": "calendar",
      "version": "v3"
    }]
  },
  "exceptionLogging": "STACKDRIVER",
  "oauthScopes": ["https://www.googleapis.com/auth/calendar.addons.execute",
                  "https://www.googleapis.com/auth/calendar", 
                  "https://www.googleapis.com/auth/script.locale"
                 ],
  "runtimeVersion": "V8",
  "addOns": {
    "common": {
      "name": "event creator",
      "logoUrl": "https://www.gstatic.com/images/icons/material/system/1x/calendar_today_black_48dp.png",
      "useLocaleFromApp": true,
      "homepageTrigger": {
        "runFunction": "onHomepage",
        "enabled": true
      }
    },
    "calendar": {
      "eventOpenTrigger": {
        "runFunction": "onCalendarEventOpen"
      }
    }
  }
}

标签: google-apps-scriptgoogle-calendar-apigoogle-apps-script-addon

解决方案


问题

访问事件对象的formInput/formInputs属性。

事件处理

要了解formInputs道具的位置,您需要了解附加组件如何处理事件

  1. 每个可以交互的小部件类都可以分配一个Action实例;
  2. Action有一个setFunctionName()在触发动作时执行的回调(由 设置);
  3. 当一个动作被触发时,一个事件对象被构造并作为它的第一个参数传递给分配给的函数Action
  4. 此事件对象包含元数据、传递给回调的自定义参数(由 添加setParameters())以及所需的formInputformInputs字段。

应用于问题

如果我正确理解了您的代码的意图,您将可以在onCreateEvent(e)按下按钮后调用时访问提交的数据。请注意,DateTimePickers 将它们的值作为嵌套对象返回。

参考

  1. 附加操作指南
  2. 事件对象引用

笔记

  1. 您可以链接回调并尽可能多地传递事件对象(但请确保在 30 秒内返回响应,否则您将超时),请参阅我对类似问题的旧答案之一。
  2. 在调用回调之前不会填充事件对象,因此您无法从编辑器或本地运行或调试它(除非您只是模拟事件对象 - 它有据可查)

推荐阅读