我正在编写一个脚本,用于创建Google Apps电子表格内容的固定宽度文本输出。我使用range.getValues()
方法检索当前范围的所有值,然后我遍历所有内容几次并生成一个文本块,当粘贴到固定宽度字体的电子邮件时,它看起来像一个格式很好的表
我遇到的唯一问题是我无法复制数字格式。我可以使用range.getNumberFormats()
获取数字格式字符串,但我找不到在代码中应用该格式字符串的方法。我尝试使用TEXT(值,格式)电子表格功能,但显然Google Apps脚本还不支持从JavaScript代码本身调用电子表格函数(请参阅this issue以获取证明)。
答案 0 :(得分:12)
从December 2015开始,可以放弃kludgy的解决方法。 Google提供了两种方法来从单元格中检索文字字符串显示值。他们还没有提供文档,所以这里有一个摘要:
<强> Range.getDisplayValue()强>
返回范围中左上角单元格的显示值,作为String,包含Sheets UI上显示的文本值。空单元格将返回一个空字符串。
<强> Range.getDisplayValues()强>
返回此范围的显示值的矩形网格。返回一个二维的字符串数组,按行索引,然后按列索引。空单元格将由数组中的空字符串表示。请记住,当范围索引从1,1开始时,JavaScript数组将从[0] [0]索引。
假设我们在电子表格中有一个我们感兴趣的范围,例如:
这四个单元格包括两种最棘手的格式;日期/时间和科学记数法。但是使用新方法,没有任何意义。
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的单元格内容 - 不是固定的,而是使用电子表格中的格式。
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。