Как работать с датами из форм в электронные таблицы с помощью Google Script

У меня есть скрипт Google, который вводит дату в поле формы Google, и я хочу сохранить день, месяц и год отдельно. В частности, я хочу изменить номер месяца на текст, т.е. 03 означает March. Вот почему я использую substring.

  • Формат даты в Google Forms: dd/mm/yyyy.
  • Формат даты в таблицах Google: d/mm/yyyy, если day<10, и dd/mm/yyyy, если day>=10.

Важная часть здесь:

const cDay = e.namedValues['Date'][0].substring(0,2);
var cMonth = e.namedValues['Date'][0].substring(3,5);
const cYear = e.namedValues['Date'][0].substring(6,10);

Если пользователь отправляет в день меньше 10, значит, код взломан.

Как мы можем решить эту проблему, не меняя формат файла Google Spreadsheets?

Я не мог найти способ использовать инструкции if или switch.

Больше объяснений

Я пробовал с этим кодом:

var cDay;
var cMonth;
var cYear;
if (e.namedValues['Date'][0].substring(1,2) == '/') { // Days are 1,..,9
  cDay = e.namedValues['Date'][0].substring(0,1);
  cMonth = changeMonth(e.namedValues['Date'][0].substring(2,4));
  cYear = e.namedValues['Date'][0].substring(5,9);
} else { // Days are 10,..,31
  cDay = e.namedValues['Date'][0].substring(0,2);
  cMonth = changeMonth(e.namedValues['Date'][0].substring(3,5));
  cYear = e.namedValues['Date'][0].substring(6,10);
}

Функция changeMonth:

function changeMonth(month) {
  switch (month) {
    case '01':
    case '1':
      cMonth = 'January';
      break;
    case '02':
    case '2':
      cMonth = 'February';
      break;
    case '03':
    case '3':
      cMonth = 'March';
      break;
    case '04':
    case '4':
      cMonth = 'April';
      break;
    case '05':
    case '5':
      cMonth = 'May';
      break;
    case '06':
    case '6':
      cMonth = 'June';
      break;
    case '07':
    case '7':
      cMonth = 'July';
      break;
    case '08':
    case '8':
      cMonth = 'August';
      break;
    case '09':
    case '9':
      cMonth = 'September';
      break;
    case '10':
      cMonth = 'October';
      break;
    case '11':
      cMonth = 'November';
      break;
    case '12':
      cMonth = 'December';
      break;
  }
}

Кажется, ошибка возникает, когда я использую replaceText:

body.replaceText('<<Day>>', cDay);
body.replaceText('<<Month>>', cMonth); // I get "Invalid argument: replacement"
body.replaceText('<<Year>>', cYear);

Я обнаружил, что решение состоит в том, чтобы добавить String(...) к параметрам replaceText, так что у меня есть: body.replaceText(String('<<Month>>'), String(cMonth));.

Однако, когда я вижу результаты, я получаю правильный день и год, но месяц undefined. Что мы можем сделать?

Пример

Если пользователь отправляет 03/05/2000 в формы, вывод должен быть: You have submitted the form on the 3º day of the month of May of the year 2000. Вместо этого у меня You have submitted the form on the 3º day of the month of undefined of the year 2000.


person manooooh    schedule 01.04.2021    source источник
comment
Если вы знаете правильную функцию, которая принимает день, месяц и год в поле даты в Google Формах, сообщите мне. Так было бы намного проще.   -  person manooooh    schedule 01.04.2021
comment
Вы можете разделить на косую черту и parseInt () каждый элемент массива.   -  person Cooper    schedule 01.04.2021


Ответы (2)


Вместо того, чтобы самостоятельно анализировать даты, вы можете использовать объект JavaScript Date для получения дня, месяца и года.

Примечание: это решение применимо, если формат даты - дд / мм / гггг

Попробуйте это:

function formSubmit(e) {
  var dateStr = e.namedValues["Date"][0];
  var dateArr = dateStr.split("/");
  var newDate = dateArr[1]+"/"+dateArr[0]+"/"+dateArr[2];
  var date = new Date(newDate);
  var day = date.getDate();
  var month = date.getMonth();
  var year = date.getFullYear();
  
  const monthNames = ["January", "February", "March", "April", "May", "June",
  "July", "August", "September", "October", "November", "December"
  ];

  Logger.log("You have submitted the form on the "+day+"º day of the month of "+monthNames[month]+" of the year "+year)
}

Вывод:

введите описание изображения здесь

Ссылка:

person Nikko J.    schedule 01.04.2021
comment
Спасибо! Это сработало. Однако я понял, что в Форме формат mm/dd/yyyy, но я получаю его как dd/mm/yyyy. Я хочу это как dd/mm/yyyy. Как это решить? - person manooooh; 01.04.2021
comment
Это дает неправильный вывод? После проверки ответа Брока Харрисона здесь формат даты связан с Языковая настройка вашего профиля. Таким образом, изменение языка изменит формат даты. - person Nikko J.; 01.04.2021
comment
Да, он дает неверный результат, потому что дни - это месяцы и наоборот. Таким образом, в массиве месяцев может быть до 31 слота, что вызывает исключение. Есть ли способ не изменить настройку языка в моем профиле, а решить проблему? - person manooooh; 01.04.2021
comment
Самое простое решение - разделить строку даты и поменять местами дату и месяц. См. Мой обновленный ответ. - person Nikko J.; 02.04.2021
comment
Спасибо!! Он работает на образце формы. Я попробую в реальной форме, но подозреваю, что результат будет таким же. - person manooooh; 02.04.2021
comment
У меня новая проблема, на самом деле у меня много полей с именами Date (1), Date (2), Date (3), Date (4), Date (5) и Date (6), где каждое из них Поле даты. Как я могу создавать массивы вместо одной переменной с именем var date=new Date(newDate);? Мне также нужно разделить день, месяц и год и поместить в шаблон Google Docs. Я пробовал следующее: chat.stackoverflow.com/transcript/message/51918642#51918642 Вместо получения день, месяц, год Даты 1, день, месяц, год Даты 2 и т. д. Я получаю NaN для каждого поля. Как это решить? - person manooooh; 03.04.2021
comment
@manooooh - я хотел бы поддержать вас, но проблема отличается от вашего сообщения выше. Пожалуйста, создайте еще один пост, посвященный вашей новой проблеме. - person Nikko J.; 05.04.2021

person    schedule
comment
Спасибо за ответ!! - person manooooh; 02.04.2021