Как получить входные данные в надстройке Google Календари? - PullRequest
0 голосов
/ 12 февраля 2020

Я пишу свое первое дополнение для Календаря 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"
      }
    }
  }
}

Ответы [ 2 ]

0 голосов
/ 12 февраля 2020

Изменение Logger.log("Text input%s ",JSON.stringify(e.formInput.text_input_title)); для console.log("Text input%s ",JSON.stringify(e.formInput.text_input_title));:

Регистратор ничего не отображал, поэтому решение проблемы изменилось на журнал консоли. Чтобы просмотреть журнал консоли после того, как вы создали событие, вам нужно go в редакторе сценариев и go до представление -> ведение журнала Stackdriver -> Панель инструментов скрипта приложений и там вы увидите последнее выполненное выполнение и результат журнала консоли (журнал может появиться через несколько секунд):

enter image description here

Как вы можете видеть, результат выглядит как JSON:

{ 
   "clientPlatform":"web",
   "userLocale":"en",
   "parameters":{ 
      "text":"calendar"
   },
   "userTimezone":{ 
      "offSet":"3600000",
      "id":"Europe/Madrid"
   },
   "formInputs":{ 
      "date_time_field_end":[ 
         { 
            "hasDate":true,
            "hasTime":true,
            "msSinceEpoch":1581478200000
         }
      ],
      "date_time_field_start":[ 
         { 
            "msSinceEpoch":1581516320343,
            "hasDate":true,
            "hasTime":true
         }
      ],
      "text_input_title":[ 
         "This is a test title"
      ]
   },
   "formInput":{ 
      "date_time_field_end":{ 
         "hasTime":true,
         "msSinceEpoch":1581478200000,
         "hasDate":true
      },
      "date_time_field_start":{ 
         "hasDate":true,
         "hasTime":true,
         "msSinceEpoch":1581516320343
      },
      "text_input_title":"This is a test title"
   },
   "hostApp":"calendar",
   "userCountry":"",
   "commonEventObject":{ 
      "parameters":{ 
         "text":"calendar"
      },
      "platform":"WEB",
      "formInputs":{ 
         "date_time_field_end":{ 
            "dateTimeInput":{ 
               "hasTime":true,
               "msSinceEpoch":1581478200000,
               "hasDate":true
            }
         },
         "date_time_field_start":{ 
            "dateTimeInput":{ 
               "hasDate":true,
               "hasTime":true,
               "msSinceEpoch":1581516320343
            }
         },
         "text_input_title":{ 
            "stringInputs":{ 
               "value":[ 
                  "This is a test title"
               ]
            }
         }
      },
      "hostApp":"CALENDAR",
      "timeZone":{ 
         "id":"Europe/Madrid",
         "offset":3600000
      },
      "userLocale":"en"
   },
   "calendar":{ 

   }
}

Так что теперь, если мы запишем журнал - > console.log("Text input",JSON.stringify(e.formInput.text_input_title)); мы видим:

enter image description here

0 голосов
/ 12 февраля 2020

Проблема

Доступ к свойству formInput / formInputs объекта события.

Обработка события

Чтобы понять, где находится formInputs реквизит, вам нужно получить gr asp о том, как Add-on обрабатывает события :

  1. Каждый класс виджетов, с которым можно взаимодействовать может быть назначен экземпляр Action;
  2. Action имеет функцию обратного вызова (установленную setFunctionName()), которая выполняется при запуске действия;
  3. При запуске действия объект события создается и передается функции, присвоенной Action в качестве первого аргумента.
  4. Этот объект события будет содержать метаданные, пользовательские параметры, передаваемые в обратный вызов (добавляется setParameters()) и необходимые поля formInput и formInputs.

Применительно к вопросу

Если я правильно понял назначение вашего кода, у вас будет доступ к представленным данным при вызове onCreateEvent(e) после нажатия кнопки. Обратите внимание, что DateTimePicker s возвращают свои значения как вложенные объекты.

Ссылки

  1. Дополнительные действия guide
  2. Объект события ссылка

Примечания

  1. Вы можете связывать обратные вызовы и передавать объект события столько, сколько вам нужно хотите (обязательно верните ответ менее чем за 30 секунд, иначе у вас будет тайм-аут), посмотрите один из моих старых ответов на аналогичный вопрос.
  2. Объект события не будет заполнен до обратный вызов вызывается, поэтому вы не можете запустить или отладить его из редактора или локально (если вы просто не насмехаетесь над объектом события - он хорошо документирован)
...