Получение сообщения об ошибке при разборе данных в функции пользовательского скрипта google sheet - PullRequest
0 голосов
/ 03 июня 2019

Я создал простую пользовательскую функцию для проверки в функциях скрипта листов Google.Определение функции:

/**
* convert duration such as 1:30 to 1.5
 *
 * @customfunction
 */
function SIMPLETEST(input) {
  // simply return the input for now to test.
  return input;

}

, и в моей электронной таблице есть ячейка A2 со значением 3:30:00.когда я применяю эту функцию к B2, например, установите b2 в: =DURATION_DECIMAL(A2), он возвращает 12/30/1899, который я считаю базовой датой.

Почему это происходит?

Ответы [ 2 ]

1 голос
/ 03 июня 2019

Это потому, что у вас должен быть тип данных для этой ячейки, установленный на «автоматический» или «длительность», и Google Sheets предположит, что «3:30:00» - это тип даты / времени для автоматического и для продолжительности он преобразует его в дату / время для передачи вашей функции. Он позволяет вам сохранить его в вашем формате (#: ##: ##), но когда вы передаете его в свою пользовательскую формулу, Sheets сначала преобразует его в объект Date Javascript, который затем возвращает ваша функция, и листы автоматически отображаются как обычная дата (12/30/1899). См. Предупреждение Google о преобразованиях дат с пользовательскими функциями здесь .

Самое простое решение - просто явно установить формат ввода «обычный текст», используя раскрывающийся список выбора формата, а затем в коде пользовательской функции вы можете проанализировать его по своему усмотрению.

Set input format as Plain text

Например, я использовал этот StackOverflow ответ, чтобы написать свою пользовательскую функцию:

function DURATION_DECIMALS(input){
  // https://stackoverflow.com/a/22820471/11447682
  var arr = input.split(':');
  var dec = parseInt((arr[1]/6)*10, 10);
  return parseFloat(parseInt(arr[0], 10) + '.' + (dec<10?'0':'') + dec);
}

И здесь он работает с форматом, установленным в обычный текст: enter image description here

0 голосов
/ 03 июня 2019

Это работает для меня:

function durdechrs(dt) {
  return Number((dt.valueOf()-new Date(dt.getFullYear(),dt.getMonth(),dt.getDate()).valueOf())/3600000).toFixed(2);
}
...