【问题标题】:Applying "Automatic" number formatting应用“自动”数字格式
【发布时间】:2016-06-26 20:05:21
【问题描述】:

是否可以通过 GAS 以编程方式应用“自动”数字格式?我的问题是,当我写数字列时,表格似乎试图应用适当的格式,但有时会出错。也就是说,特定的小整数(有时为 1)将被格式化为日期。该范围是用一个myRange.setValues() 方法编写的,我看不到任何错误模式,因此看不到任何防止意外格式错误的方法。

但是,当我选择表格中的范围并单击数字格式菜单上的“自动”时,一切都会恢复正常。由于数据的写入会以某种方式重置格式,因此提前单击它并没有帮助。

尽管介绍冗长,但我的问题很简单:如何以编程方式应用“自动”数字格式。我认为这是非常基本的,特别是因为谷歌和这里的搜索没有帮助。

我当前的后备解决方案是使用myRange.setNumberFormat("0") 作为整个范围的格式。这并不理想,因为有些数字非常大并且更容易以科学计数法阅读。该范围内还有一些文本字符串,但无论应用何种格式,这些格式都是正确的。当只需在用户界面中单击几下时,我还希望避免遍历数据并测试值以确定最佳格式。

【问题讨论】:

  • 这是一个非常好的问题,而且肯定没有记录在案。我能找到的最接近的是stackoverflow.com/questions/13758913/…,它只覆盖纯文本。
  • 非常感谢您的评论。我搜索并搜索了将近一个星期,以为我一定遗漏了一些明显的东西。我留下的唯一怀疑是“自动”格式是任何数字格式的缺席,但我分配nullundefined 的努力完全没有成功。 myRange.setNumberFormat((typeof undefined)); // or just 'undefined' 将带有0 的单元格转换为:'un301899fin189930' - 也就是说,它将undefined 解析为字符串,然后勇敢地 尝试将单元格格式化为日期。(? ) 传递 null 会引发服务器错误。
  • 如果其他人想知道myRange.setNumberFormat(""); 不起作用。它只是隐藏了所有数字(和日期)。字符串仍然正常显示。就像您将"" 放入用户界面的自定义数字格式框中一样。

标签: google-apps-script google-sheets


【解决方案1】:

我很难找到任何记录的内容,并且几乎尝试了之前建议的所有内容(null,'General','0.###############' 的“魔术”格式等)。

在我的特殊情况下,我之前将范围设置为严格的纯文本,然后将其替换为复选框数据验证。每当检查框时,都会将其转换为文本“ True”,而不是保留复选框。 “General”和“magic”格式在功能上运行良好,但实际上并未将格式显式设置回“Automatic”。

我终于决定了,何不试试这个:

range.setNumberFormat('Automatic');

它奏效了。这确实应该记录在案,但无论如何,至少有一点常识会引导我找到答案。

【讨论】:

    【解决方案2】:

    我们可以使用.setNumberFormat('General');

    下面是例子:

    var spreadsheet = SpreadsheetApp.getActive();
    spreadsheet.getRange("B:B").setNumberFormat("General");

    【讨论】:

      【解决方案3】:

      我使用copyFormatToRange 复制/应用自动格式:

      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getActiveSheet();
      var source_cell = sheet.getRange("A1");//A1: cell having automatic format 
      source_cell.copyFormatToRange(sheet,1,1,2,2);//copy format of cell A1 to cell A2
      

      您可以编写一个 API 来打开另一个电子表格,读取任何具有自动格式的单元格。

      var ss = SpreadsheetApp.openById(SpreadsheetId);//Id of another spreadsheet
      

      然后在您想要的单元格中使用copyFormatToRange

      【讨论】:

        【解决方案4】:

        如果您没有该范围内的日期,则以下解决方案似乎是最佳可用选项(不诉诸基于 API 的解决方案):

        myRange.setNumberFormat('0.###############');
        

        零点 15x'#' 似乎是一种“神奇”数字格式,它允许非常大的数字显示为科学记数法,而较小的整数和小数则以数字应用前的“标准”格式显示格式化。对于包含在用户界面中使用“自动”选择格式化的非日期的单元格,这也是返回的格式。

        添加或删除甚至一个 # 将“打破咒语”并导致非常大的数字以非科学计数法显示。我还测试了小数点前的更改,但保留了 15x#:

        同样功能:myRange.setNumberFormat('#,##0.###############');

        所以前缀有一定的灵活性。

        非功能性:myRange.setNumberFormat('#.###############');

        0 显然是必需的。

        最后,

        非功能性:savegameRange.setNumberFormat('0.##############[red]');

        这会将数字变为红色,但会破坏“神奇”格式。所以没有后缀出现。


        同样,如果您在该范围内有日期,这将不起作用,因为不出所料,它们会显示为基础数字。并且可能更有问题(但完全可以理解),将它们返回到日期形式的唯一方法是手动应用日期格式,假设您知道哪些单元格“是”日期。

        “自动”数字格式的完整复制需要遍历范围以查找日期并应用所需的日期格式,否则应用“魔术”格式。 (我的原始数据集是数字和字符串的混合体,所以上面给出的简单方法有效。)

        【讨论】:

        • 请注意,这不会将其设置为自动以供读者寻找 Tl;Dr.我在发表之前的评论之前发现了这一点。希望有人能解开谜团,或证明这是不可能的。
        • 谢谢。写作时很难设身处地为他人着想。更新以更清楚地说明该方法的局限性。您在之前的评论中引用的链接也很有趣,让我研究了更多关于数字格式的 Java 文档。对于特定情况可能有更多答案,但我没有看到任何提及在 Java 中触发自动格式化的方法,希望该方法也可以在这里工作。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多