如何为 Google 表格中单列中的每个值设置数字格式取决于值?
Posted
技术标签:
【中文标题】如何为 Google 表格中单列中的每个值设置数字格式取决于值?【英文标题】:How to set number format for each value from single column in Google Sheets depends from value? 【发布时间】:2020-03-30 07:32:01 【问题描述】:我在单列中有一个数组。我需要减少大数的小数部分,例如> = 1,为数字 = 0,1保留1个小数部分符号,为数字 = 0,01保留2个小数部分符号,为数字 =0,001 保留 3 个小数部分符号。所有值都不能四舍五入,仅供用户查看。 例如:
[33800]->33800;
[468]->468;
[]-> "";
[1170.0000000000002]->1170;
[2437.5]->2437;
[2762.5]->2762;
[322.4]->322;
[1430.0000000000002]->1430;
[910]->910;
[1300]->1300;
[52]->52;
[0.023]->0,023;
[6500]->6500.
我尝试这样做,但我的方法是错误的
function recalculate()
const sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const sourceValues = sh.getRange(1, 1, sh.getLastRow()).getValues();
const ratio = sh.getRange(1, 2, sh.getLastRow()).getValues();
const targetRange = sh.getRange(1, 3, sh.getLastRow());
let result = [];
for (let i = 0; i < sourceValues.length; i++)
result.push([sourceValues[i] * (1 - ratio[i])])
console.log(result)
let numFormat = targetRange.setValues(result);
for (i = 0; i < numFormat.length; i++)
switch (numFormat[i] > 0)
case numFormat < 0.1:
numFormat[i].setNumberFormat('#,##0.00')
;
case numFormat < 1:
numFormat[i].setNumberFormat('#,#0.0')
;
default: numFormat[i].setNumberFormat('#0');
你能解释一下我错的原因和地方吗?
修改后的脚本
function recalculate()
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sh = ss.getActiveSheet();
const sourceValues = sh.getRange(1, 1, sh.getLastRow()).getValues();
const ratio = sh.getRange(1, 2, sh.getLastRow()).getValues();
const targetRange = sh.getRange(1, 3, sh.getLastRow());
let result = [];
console.log(JSON.stringify(sourceValues)) //log: [[13000],[468],[""],[3900],[3250],[3250],[520],[2600],[910],[1300],[52],[0.023],[6500]]
let value;
for (let i = 0; i < sourceValues.length; i++)
value = sourceValues[i][0]
if (value === "" || value === 0)
result.push([""])
else
result.push([value * (1 - ratio[i])])
console.log(JSON.stringify(result)) //log: [[33800],[468],[""],[1170.0000000000002],[2437.5],[2762.5],[322.4],[1430.0000000000002],[910],[1300],[52],[0.023],[6500]]
let numFormat = targetRange.setValues(result);
const rangeList = result.reduce((ar, [e], i) =>
if (e > 1) ar.push(`C$i + 1`);
return ar;
, []);
sh.getRangeList(rangeList).setNumberFormat("#");
ss.setSpreadsheetLocale("fr_CA");
谷歌表上的结果
预期结果
【问题讨论】:
有错误吗? 没有。它设置相同的格式,如#,##.0numFormat
的类型是什么?
【参考方案1】:
您希望在 Google 电子表格的单元格中实现像 1654.123 -> 1654, 23.456 -> 23, 0.43 -> 0,43, 0.02 -> 0,02, 0.037 -> 0,037
这样的数字格式。
您想使用这些值作为数字。
您希望使用 Google Apps 脚本实现此目的。
修改点:
在您的脚本中,numFormat
是范围对象。在这种情况下,当使用for (i = 0; i < numFormat.length; i++)
时,
for 循环没有正确运行(for 循环中的脚本没有运行。),因为numFormat.length
是undefined
。
如果要将小数运算符从.
更改为,
,在这种情况下,如何更改电子表格的区域设置?
在 pnuts 的回答中,建议将加拿大(法语)作为语言环境。 Ref
修改后的脚本:
当你的脚本被修改后,变成如下。
发件人:
const sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
收件人:
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sh = ss.getActiveSheet();
和
发件人:
for (i = 0; i < numFormat.length; i++)
switch (numFormat[i] > 0)
case numFormat < 0.1:
numFormat[i].setNumberFormat('#,##0.00')
;
case numFormat < 1:
numFormat[i].setNumberFormat('#,#0.0')
;
default: numFormat[i].setNumberFormat('#0');
收件人:
const rangeList = result.reduce((ar, [e], i) =>
if (e > 1) ar.push(`C$i + 1`);
return ar;
, []);
sh.getRangeList(rangeList).setNumberFormat("#");
ss.setSpreadsheetLocale("fr_CA");
从您的脚本中,它假设“C”列的数字格式已修改。
参考资料:
getRangeList() setSpreadsheetLocale()新增1:
虽然我不确定这是否是您当前的问题,但在您的脚本中,当“A”列中的单元格为空时,“C”列可能不是空的。如果你想解决这个问题,如何修改如下?
发件人:
result.push([sourceValues[i] * (1 - ratio[i])])
收件人:
result.push([sourceValues[i][0] ? sourceValues[i][0] * (1 - ratio[i][0]) : ""]);
在您的脚本中,sourceValues
和 ratio
是二维数组。
新增2:
很遗憾,我无法复制您的情况。例如,当您的脚本和值像下面的脚本一样使用时,将检索到以下结果。
33800
468
1170
2438
2763
322
1430
910
1300
52
0,023
6500
示例脚本:
const result = [[33800],[468],[""],[1170.0000000000002],[2437.5],[2762.5],[322.4],[1430.0000000000002],[910],[1300],[52],[0.023],[6500]];
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sh = ss.getActiveSheet();
const targetRange = sh.getRange(1, 3, sh.getLastRow());
let numFormat = targetRange.setValues(result);
const rangeList = result.reduce((ar, [e], i) =>
if (e > 1) ar.push(`C$i + 1`);
return ar;
, []);
sh.getRangeList(rangeList).setNumberFormat("#");
ss.setSpreadsheetLocale("fr_CA");
【讨论】:
谢谢。它有效,但对我来说不正确。我需要减少像>= 1
这样的大数字的小数部分,为数字<1
和>=0,1
保留1个小数部分符号,为数字<0,1
和>=0,01
保留2个小数部分符号,保留3个符号数字 <0,01
和 >=0,001
的小数部分。所有值都不能四舍五入,仅供用户查看。
@Timogavk 感谢您的回复。我带来的不便表示歉意。我不得不为我糟糕的英语水平道歉。不幸的是,我无法理解您的附加问题。那么你能提供你期望的样本输入和输出值吗?借此,我想确认您的附加问题。顺便说一句,我修改后的脚本适用于您问题中的示例值。我的理解不正确吗?
对不起,我的英语也不太好。因此,例如:我得到result
(log[[33800],[468],[],[1170.0000000000002],[2437.5],[2762.5],[322.4],[1430.0000000000002],[910],[1300],[52],[0.023],[6500]]
) 并将其设置为targetRange
的值。每个单元格都需要setNumberFormat
取决于值(空的保持为空)。
@Timogavk 感谢您的回复。不幸的是,我仍然无法从您的问题中了解您的预期结果。这是由于我的理解力差。我对此深表歉意。那么你能提供你期望的样本输入和输出值吗?借此,我想确认您的附加问题。顺便说一句,我修改后的脚本适用于您问题中的示例值。我的理解不正确吗?
[33800]->33800; [468]->468; []-> ""; [1170.0000000000002]->1170; [2437.5]->2437; [2762.5]->2762; [322.4]->322; [1430.0000000000002]->1430; [910]->910; [1300]->1300; [52]->52; [0.023]->0,023; [6500]->6500.
以上是关于如何为 Google 表格中单列中的每个值设置数字格式取决于值?的主要内容,如果未能解决你的问题,请参考以下文章
如何为 Google Places API 自动完成文本框设置默认值