Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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 здесь.