jbu*_*ess 12 javascript google-sheets number-formatting google-apps-script
我正在编写一个脚本,用于创建Google Apps电子表格内容的固定宽度文本输出.我使用该range.getValues()方法检索当前范围的所有值,然后我循环遍历所有内容并生成一个文本块,当粘贴到固定宽度字体的电子邮件中时,它看起来像一个格式良好的表.
我遇到的唯一问题是我无法复制数字格式.我可以使用数字格式化字符串range.getNumberFormats(),但我找不到在代码中应用该格式化字符串的方法.我尝试使用TEXT(值,格式)电子表格功能,但显然Google Apps脚本还不支持从JavaScript代码本身调用电子表格函数(请参阅此问题以获取证明).
Mog*_*dad 13
截至2015年12月,可以放弃kludgy的解决方案.Google提供了两种方法来从单元格中检索文字字符串显示值.他们还没有提供文档,所以这里是一个总结:
Range.getDisplayValue()
以字符串形式返回范围中左上角单元格的显示值,其中包含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() );
}
Run Code Online (Sandbox Code Playgroud)
[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]]
Run Code Online (Sandbox Code Playgroud)
Ori*_*mer 10
我找到了一种JavaScript方法,用于设置小数点后面的位数,称为toFixed().
这是文档:http: //www.w3schools.com/jsref/jsref_tofixed.asp
num.toFixed(x) //where x = the number of digits after the decimal point.
Run Code Online (Sandbox Code Playgroud)
我的Google Apps脚本需要返回一封邮件,其中包含从我的电子表格中提取的美元值.小数点后10位数看起来很糟糕.应用于我的变量的这个方法解决了这个问题.我刚刚在标签的文本部分添加了$.
希望这可以帮助!
预先提供的格式列表在这里.对于某些格式,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);
Run Code Online (Sandbox Code Playgroud)
对于美元,例如"\"$\"#,##0.00":
var dollars = Utilities.formatString("$%.2f", num);
Run Code Online (Sandbox Code Playgroud)
对于百分比格式的数字,例如"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);
Run Code Online (Sandbox Code Playgroud)
对于指数,比如"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');
}
Run Code Online (Sandbox Code Playgroud)
您可以对存储的电子表格格式进行字符串比较,以选择正确的转换器.
我极其困难的意思是什么?尝试获得一个格式化程序,它提供完全相同的分子和分母选择表单# ?/?和# ??/??!在电子表格中,这是一个格式问题 - 在脚本中,它更多......