Форматирование чисел, прочитанных из таблицы - PullRequest
12 голосов
/ 23 декабря 2011

Я пишу скрипт, который создает текстовый вывод с фиксированной шириной для содержимого электронной таблицы Служб Google. Я извлекаю все значения текущего диапазона, используя метод range.getValues(), затем я делаю все циклы пару раз и генерирую блок текста, который выглядит как красиво отформатированная таблица при вставке в электронное письмо с фиксированной шириной шрифта.

Единственная проблема, с которой я столкнулся, это то, что я не могу воспроизвести форматирование чисел. Я могу получить строку форматирования чисел, используя range.getNumberFormats(), но не могу найти способ применения этой строки форматирования в коде. Я пытался использовать функцию электронных таблиц TEXT (значение, формат), но, очевидно, Google Apps Script еще не поддерживает вызов функций электронных таблиц из самого кода JavaScript (см. этот вопрос для доказательства).

Ответы [ 5 ]

12 голосов
/ 14 января 2016

По состоянию на декабрь 2015 , грязные обходные пути могут быть отброшены. Google предоставил два метода для получения значений отображения буквенных строк из ячеек. Они еще не предоставили документацию, поэтому вот резюме:

Range.getDisplayValue ()
Возвращает отображаемое значение верхней левой ячейки в диапазоне в виде строки, содержащей текстовое значение, отображаемое в интерфейсе Sheets. Пустые ячейки вернут пустую строку.

Range.getDisplayValues ​​()
Возвращает прямоугольную сетку отображаемых значений для этого диапазона. Возвращает двумерный массив строк, проиндексированный по строке, а затем по столбцу. Пустые ячейки будут представлены пустой строкой в ​​массиве. Помните, что хотя индекс диапазона начинается с 1, 1, массив JavaScript будет индексироваться с [0] [0].

Пример:

Скажем, у нас есть интересующий нас диапазон в таблице, например:

screenshot

Эти четыре ячейки включают два самых хитрых формата для обхода; дата / время и научная запись. Но с новыми методами в этом ничего нет.

function demoDisplayValue() {
  var range = SpreadsheetApp.getActiveSheet().getRange("A1:B2");

  Logger.log( range.getDisplayValue() );
  Logger.log( range.getDisplayValues() );
}

Вход:

[16-01-14 13:04:15:864 EST] 1/14/2016 0:00:00
[16-01-14 13:04:15:865 EST] [[1/14/2016 0:00:00, 5.13123E+35], [$3.53, 1,123 lb]]
10 голосов
/ 20 февраля 2012

Я нашел метод JavaScript для установки количества цифр после десятичной точки, который называется toFixed ().

Вот документация: http://www.w3schools.com/jsref/jsref_tofixed.asp

num.toFixed(x) //where x = the number of digits after the decimal point.

Мой скрипт Google Apps должен был вернуть сообщение со стоимостью в долларах, взятой из моей таблицы. Выглядело ужасно с 10 цифрами после запятой. Этот метод, примененный к моей переменной, решил проблему. Я только что добавил $ в текстовой части метки.

Надеюсь, это поможет!

6 голосов
/ 10 августа 2014

Список предустановленных форматов: здесь . Для некоторых форматов эквивалент javascript относительно прост. Для других это чрезвычайно сложно. И обработка пользовательских пользовательских форматов - удачи в этом.

Вот снимок экрана, показывающий содержимое ячейки, которая была реплицирована как html - не исправлена, как вы, но используете форматы из электронной таблицы.

Screenshot

Существуют вспомогательные функции скрипта Служб Google, которые облегчают задачу: Utilities.formatString() и Utilities.formatDate().

Для дат и времени, таких как "h:mm:ss am/pm", форматы электронных таблиц - это почти то, что нужно для утилиты - я обнаружил, что вам просто нужно изменить обозначение am / pm для некоторых форматов:

  var format = cell.getNumberFormat();
  var jsFormat = format.replace('am/pm','a');
  var jsDate = Utilities.formatDate(
          date,
          this.tzone,
          jsFormat);

Для долларов, например "\"$\"#,##0.00"

  var dollars = Utilities.formatString("$%.2f", num);

Для чисел в процентах, например "0.00%"

  var matches = format.match(/\.(0*?)%/);
  var fract = matches ? matches[1].length : 0;     // Fractional part
  var percent = Utilities.formatString("%.Xf%".replace('X',String(fract)), 100*num);

Для экспонент, таких как "0.000E+00", используйте встроенный javascript toExponential() и настройте вывод, чтобы он больше походил на электронную таблицу:

if (format.indexOf('E') !== -1) {
  var fract = format.match(/\.(0*?)E/)[1].length;  // Fractional part
  return num.toExponential(fract).replace('e','E');
}

Вы можете просто сравнить строки с сохраненными форматами электронных таблиц, чтобы выбрать правильный конвертер.

А что я имею в виду под чрезвычайно сложным? Попытайтесь получить форматтер, который придет с тем же самым выбором числителя и знаменателя, который Sheets делает для # ?/? и # ??/??! В электронной таблице это вопрос форматирования - в скрипте это намного больше ...

4 голосов
/ 12 июля 2013

Попробуйте следующий скрипт приложений Google

function NumberFormat()
{var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = ss.getSheets()[0];

 var cell = sheet.getRange("A1:B10");
 // Always show 2 decimal points
 cell.setNumberFormat("0,00,000.00");
}
0 голосов
/ 28 декабря 2011

Действительно, вы не можете напрямую вызывать функции электронных таблиц.Но вы можете установить формат, используя setNumberFormats как обычно.Взгляните на документы здесь .

...