it-swarm.com.ru

Форматирование чисел, прочитанных из таблицы

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

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

12
jburgess

По состоянию на декабрь 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]]
12
Mogsdad

Я нашел метод 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 цифрами после запятой. Этот метод, примененный к моей переменной, решил проблему. Я просто добавил $ в текстовой части метки.

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

10
Orion Palmer

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

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

Screenshot

Существуют вспомогательные функции скрипта Google Apps, которые облегчают эту задачу: 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 делает для # ?/? и # ??/??! В электронной таблице это вопрос форматирования - в сценарии это намного больше ...

6
Mogsdad

Попробуйте следующий скрипт приложений 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");
}
4
mpsbhat

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

0
Henrique G. Abreu