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

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

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

Ответ 1

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

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

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() );
}

Log:

[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]]

Ответ 2

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

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

Ответ 3

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

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

Screenshot

Существуют вспомогательные функции Google Apps Script, которые упрощают работу, 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');
}

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

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

Ответ 4

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

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");
}

Ответ 5

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