Выявил следующий баг - на листе 2 цены имеют денежный формат, но все мы люди и если специально сделать ошибку и ввести число в строковом формате (с пробелом, выделено красным). При вставке на Лист1 данная цена Волшебным образом превращается в Число. Не понимаю в какой момент и почему. А это ошибка, и мне хотелось бы знать, что кто-то число ввел неправильно, точнее ввёл не число.
[offtop]Константин выручай))[/offtop]
Товарищи, помогите разобраться. Имею простой скрипт - перенос данных с одного листа на другой, назначение скрипта не суть. Переносим с Лист2 на Лист1
Выявил следующий баг - на листе 2 цены имеют денежный формат, но все мы люди и если специально сделать ошибку и ввести число в строковом формате (с пробелом, выделено красным). При вставке на Лист1 данная цена Волшебным образом превращается в Число. Не понимаю в какой момент и почему. А это ошибка, и мне хотелось бы знать, что кто-то число ввел неправильно, точнее ввёл не число.
Да, интересная проблема. Есть ощущение, что Range.setValue() использует какой-то витиеватый услужливый алгоритм, пытающийся найти в последовательности помещаемых в ячейку символов нечто большее, чем просто строка, а именно - число или дату. Т.е. имеет место быть некий примерно такой же алгоритм, который в Excel, скажем, превращает ввод 1.1 не в число "одна целая одна десятая", а в дату "1 января текущего года".
Гугл мне ничего конкретного на тему раскрытия этого алгоритма не нашёл, поэтому если кому-то повезет больше, чем мне - пожалуйста, поделитесь!
Я набросал небольшой тест, который иллюстрирует "непредсказуемость" setValue() в тех случаях, когда ей подсовываешь нечто сродни тому, что по известному анекдоту (Гугл расскажет) в конце эксперимента с японской бензопилой ей подсунули суровые сибирские мужики (железный лом): [vba]
Код
function myFunc1() { var ss = SpreadsheetApp.getActive(); var sheet = ss.getSheets()[0]; sheet.getRange('A1').setValue('1 234'); // число 1234 sheet.getRange('A2').setValue('1 2345'); // внешне 1 2345, внутри ячейки - дата 01.01.2345 sheet.getRange('A3').setValue('1 23456'); // число 123456 sheet.getRange('A4').setValue('1 23 4567'); // число 1234567 sheet.getRange('A5').setValue('1 23 45678'); // число 12345678 sheet.getRange('A6').setValue('1 2345678 9'); // строка 1 2345678 9 sheet.getRange('A7').setValue('1 23 45 6789'); // число 123456789 sheet.getRange('A8').setValue('1 23 45 678 9'); // строка 1 23 45 678 9 }
[/vba]
Для анализа ошибок пользовательского ввода при переброске данных с одного рабочего листа на другой с помощью Range.getValue() и Range.setValue() лучше всего делать попытки явного преобразования в число тех данных, которые по замыслу должны быть числами. Делать это нужно между getValue() и setValue() с помощью таких функций, как Number() и typeof - с тем, чтобы в setValue() данные в ошибочные ячейки подавались уже в виде значения ошибки (#NUM!) или в виде сформированной строки с информацией об ошибке: [vba]
Да, интересная проблема. Есть ощущение, что Range.setValue() использует какой-то витиеватый услужливый алгоритм, пытающийся найти в последовательности помещаемых в ячейку символов нечто большее, чем просто строка, а именно - число или дату. Т.е. имеет место быть некий примерно такой же алгоритм, который в Excel, скажем, превращает ввод 1.1 не в число "одна целая одна десятая", а в дату "1 января текущего года".
Гугл мне ничего конкретного на тему раскрытия этого алгоритма не нашёл, поэтому если кому-то повезет больше, чем мне - пожалуйста, поделитесь!
Я набросал небольшой тест, который иллюстрирует "непредсказуемость" setValue() в тех случаях, когда ей подсовываешь нечто сродни тому, что по известному анекдоту (Гугл расскажет) в конце эксперимента с японской бензопилой ей подсунули суровые сибирские мужики (железный лом): [vba]
Код
function myFunc1() { var ss = SpreadsheetApp.getActive(); var sheet = ss.getSheets()[0]; sheet.getRange('A1').setValue('1 234'); // число 1234 sheet.getRange('A2').setValue('1 2345'); // внешне 1 2345, внутри ячейки - дата 01.01.2345 sheet.getRange('A3').setValue('1 23456'); // число 123456 sheet.getRange('A4').setValue('1 23 4567'); // число 1234567 sheet.getRange('A5').setValue('1 23 45678'); // число 12345678 sheet.getRange('A6').setValue('1 2345678 9'); // строка 1 2345678 9 sheet.getRange('A7').setValue('1 23 45 6789'); // число 123456789 sheet.getRange('A8').setValue('1 23 45 678 9'); // строка 1 23 45 678 9 }
[/vba]
Для анализа ошибок пользовательского ввода при переброске данных с одного рабочего листа на другой с помощью Range.getValue() и Range.setValue() лучше всего делать попытки явного преобразования в число тех данных, которые по замыслу должны быть числами. Делать это нужно между getValue() и setValue() с помощью таких функций, как Number() и typeof - с тем, чтобы в setValue() данные в ошибочные ячейки подавались уже в виде значения ошибки (#NUM!) или в виде сформированной строки с информацией об ошибке: [vba]