Способ ограничения выбора календаря в форме Google - PullRequest
0 голосов
/ 08 мая 2018

У меня есть форма, состоящая из вопросов, требующих выбора даты. Есть ли способ ограничить выбор календаря только определенными датами? Например, если сегодня 8 мая, то пользователь может выбрать только дату, которая больше или равна 14 дням или не превышает 180 дней - это будет с 22 мая по 3 ноября.

Я не смог найти никаких ссылок в документации по скрипту приложений Google на эту тему, поэтому я надеюсь, что кто-то может дать рекомендации. Заранее спасибо!

1 Ответ

0 голосов
/ 08 мая 2018

Чтобы применить проверку / отклонение / ограничения к ответам Дата / Время / Дата / время в форме Google, необходимо реализовать собственную HTML-форму, поскольку (по состоянию на 07 мая 2018 года) параметры проверки формы Google отсутствуют.DateItem, DateTimeItem, TimeItem или DurationItem с.Где вы размещаете свою собственную HTML-форму, не имеет значения - вы можете использовать свой собственный веб-сервер, или вы можете использовать Apps Script & HtmlService, в качестве боковой панели или webapp .

Если вы хотите использовать Google Forms для управления ответами, то ваше решение должно в конечном итоге соединиться с серверной частью скрипта Apps, поскольку только у скрипта Apps есть доступ API к формам (нет REST API, как для Sheets или Drive).Если вам не нужно использовать Google Forms для управления ответами, вы можете делать с ними все, что захотите (например, сохранять их в выбранной вами базе данных).


Получение данных дляApps Script .gs files

Самостоятельная форма

Для самостоятельной формы потребуется опубликованное веб-приложение Apps Script для взаимодействия.Действие отправки вашей формы должно отправить данные через HTTP-запрос POST на URL-адрес веб-приложения, и ваш проект Apps Script будет использовать триггерную функцию doPost(e) для принятия передачи данных.

HtmlService (Боковая панель или форма веб-приложения)

Размещение формы с помощью HtmlService означает, что ваше клиент-серверное взаимодействие должно использовать методы google.script.___, которые обеспечивают асинхронное поведение.Действие отправки формы должно либо вызывать триггерную функцию doPost(e), как указано выше, либо использовать google.script.run.someMethodInAgsFile(yourFormDataObject) с соответствующими обработчиками успеха и ошибок на стороне клиента для отображения ответа обратно из скрипта приложений.


Использование входных данных

Какой бы метод хостинга вы ни использовали, данные вашей пользовательской формы в конечном итоге дойдут до скрипта Apps, и вам потребуется создать формы Google FormResponse, которыеВы можете программно отправить желаемую форму Google.Обратите внимание, что отправка программных форм не активирует события запуска «при отправке формы», поскольку они не являются действиями пользователя.Если у вас есть какое-то программное событие, которое должно произойти в результате отправки формы, просто вызовите это же событие из вашего кода, который сделал отправку.

Вы можете просмотреть формат объекта входного события e в приложениях.Документация сценария: https://developers.google.com/apps-script/guides/web#request_parameters

Особенности преобразования объекта входного события в данные формы зависят от вашей реализации, например, у вас могут быть именованные свойства, универсальный массив и т. Д. Пример doPost, показывающий, какпостроить и представить FormResponse:

function doPost(e) {
  console.log(e); // Log the object in Stackdriver, to allow easy viewing of its structure.
  if (!e) throw new Error("doPost Function called without event object.");
  if (!e.postData.length) throw new Error("No form data present.");

  var formData = /* construct your form data object, using some method to associate
                  between a question and the answer, like its index, the title, etc. */;
  var form = FormApp.openById("your form id");
  if (!form.isAcceptingResponses()) throw new Error("Form is closed to new input.");

  var toSubmit = form.createResponse();
  // Check every item in the form to provide the relevant answers.
  form.getItems().forEach(function (item, itemIndex, allItems) {
    // To create the item's response, you must cast it to its type
    // (since each item type has a different format for the answer).
    var it = item.getType(),
        itemResponse = null;
    if (it === FormApp.ItemType.DATE) {
      item = item.asDateItem(); // Cast this item to its type
      var answer = /* Use your formData object, for example use the index property,
          e.g. formData[itemIndex] if you made formData an array of the input data. */;
      itemResponse = item.createResponse(answer);
      /* do ItemType-specific stuff with the ItemResponse */
    } else if (it === /* some other item type you use */) {
      ...
    } else {
      throw new Error("Unhandled item type");
    }
    if(itemResponse) {
      /* do generic stuff with the item response */
      toSubmit.withItemResponse(itemResponse);
    }
  });
  // Submit the FormResponse now that it has been given answers for its items.
  toSubmit.submit();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...