如何为 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");
  
谷歌表上的结果

预期结果

【问题讨论】:

有错误吗? 没有。它设置相同的格式,如#,##.0 numFormat的类型是什么? 【参考方案1】: 您希望在 Google 电子表格的单元格中实现像 1654.123 -&gt; 1654, 23.456 -&gt; 23, 0.43 -&gt; 0,43, 0.02 -&gt; 0,02, 0.037 -&gt; 0,037 这样的数字格式。 您想使用这些值作为数字。 您希望使用 Google Apps 脚本实现此目的。

修改点:

在您的脚本中,numFormat 是范围对象。在这种情况下,当使用for (i = 0; i &lt; numFormat.length; i++) 时, for 循环没有正确运行(for 循环中的脚本没有运行。),因为numFormat.lengthundefined。 如果要将小数运算符从. 更改为,,在这种情况下,如何更改电子表格的区域设置? 在 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]) : ""]);
在您的脚本中,sourceValuesratio 是二维数组。

新增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");

【讨论】:

谢谢。它有效,但对我来说不正确。我需要减少像&gt;= 1这样的大数字的小数部分,为数字&lt;1&gt;=0,1保留1个小数部分符号,为数字&lt;0,1&gt;=0,01保留2个小数部分符号,保留3个符号数字 &lt;0,01&gt;=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]-&gt;33800; [468]-&gt;468; []-&gt; ""; [1170.0000000000002]-&gt;1170; [2437.5]-&gt;2437; [2762.5]-&gt;2762; [322.4]-&gt;322; [1430.0000000000002]-&gt;1430; [910]-&gt;910; [1300]-&gt;1300; [52]-&gt;52; [0.023]-&gt;0,023; [6500]-&gt;6500.

以上是关于如何为 Google 表格中单列中的每个值设置数字格式取决于值?的主要内容,如果未能解决你的问题,请参考以下文章

如何为网页中的每个注册显示自动递增的 id 值?

如何为表格中的一行设置样式?

如何为 Google Places API 自动完成文本框设置默认值

MongoDB:如何为集合中的每个文档设置一个等于另一个字段值的新字段[重复]

如何为word文档中的表格设置同样高度的行高?

PySpark:如何为数组列中的每个元素添加值?