格式化从电子表格中读取的数字

时间:2011-12-23 12:45:18

标签: javascript google-apps-script google-sheets number-formatting

我正在编写一个脚本,用于创建Google Apps电子表格内容的固定宽度文本输出。我使用range.getValues()方法检索当前范围的所有值,然后我遍历所有内容几次并生成一个文本块,当粘贴到固定宽度字体的电子邮件时,它看起来像一个格式很好的表

我遇到的唯一问题是我无法复制数字格式。我可以使用range.getNumberFormats()获取数字格式字符串,但我找不到在代码中应用该格式字符串的方法。我尝试使用TEXT(值,格式)电子表格功能,但显然Google Apps脚本还不支持从JavaScript代码本身调用电子表格函数(请参阅this issue以获取证明)。

5 个答案:

答案 0 :(得分:12)

December 2015开始,可以放弃kludgy的解决方法。 Google提供了两种方法来从单元格中检索文字字符串显示值。他们还没有提供文档,所以这里有一个摘要:

<强> Range.getDisplayValue()
返回范围中左上角单元格的显示值,作为String,包含Sheets UI上显示的文本值。空单元格将返回一个空字符串。

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

答案 1 :(得分:10)

我找到了一种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位数看起来很糟糕。应用于我的变量的这个方法解决了这个问题。我刚刚在标签的文本部分添加了一个$。

希望这有帮助!

答案 2 :(得分:6)

预先提供的格式列表为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",使用内置的toExponential() javascript,并将输出调整为更像电子表格:

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

您可以对存储的电子表格格式进行字符串比较,以选择正确的转换器。

我的意思是极难吗?尝试获得一个格式化程序,它提供完全相同的分子和分母选择表格# ?/?# ??/??!在电子表格中,这是一个格式问题 - 在脚本中,它还有更多...

答案 3 :(得分:4)

尝试以下谷歌应用脚​​本

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 :(得分:0)

实际上,您无法直接调用电子表格函数。但您可以正常使用setNumberFormats设置格式。请查看文档here