【问题标题】:Script to automatically capitalize contents of a cell in Google Sheets?自动大写Google表格中单元格内容的脚本?
【发布时间】:2016-08-08 02:25:14
【问题描述】:

我有一个输入股票代码的电子表格。我希望它们始终全大写,无论它们是如何输入的。这似乎需要一些脚本,因为除非存在第二个列副本,否则无法使用函数执行此操作,这是不可接受的。

我有一个可行的解决方案,但有一个关键问题。代码如下:

function OnEdit(e) {
   var ss = e.source.getActiveSheet(),
       sheets = ['Trades', ''],
       ind = sheets.indexOf(ss.getName());
   if (ind === 0 && e.range.rowStart > 1 && e.range.columnStart >= 1 ) {
       e.range.setValue(e.value.toUpperCase());
   }
}

效果很好,我可以根据需要添加尽可能多的选项卡和列来格式化。不幸的是,它还将单元格内的 FORMULAS 大写,这破坏了使用 importhtml() 函数的公式,因为它将请求的 URL 大写。

那么,任何人都知道一种方法可以完全按照上面的代码做,但不接触单元格内的实际公式,只接触它们输出的文本?

编辑:感谢@ocordova 的评论,我认为我有一些东西可以很好地完成这项工作。不幸的是,它的行为很奇怪......它部分适用于某些列,而在其他列上则完全无效。这是我当前的代码(为清楚起见,与之前略有改动):

function onEdit(e){ 
   var activeSheet = e.source.getActiveSheet(),
       sheets = ['NEW Trades', ''],
       sheetIndex = sheets.indexOf(activeSheet.getName());
  if (sheetIndex === 0 && e.range.rowStart > 1 && e.range.columnStart >0  && e.range.getFormula() == '') {
    e.range.setValue(e.value.toUpperCase());
  }
}

任何人都知道为什么某些列中的某些单元格会按预期大写,而相同列中的其他单元格不会大写,而其他列在任何地方都不会大写?

编辑 2:我的问题似乎与数据验证有关或与之冲突。我试图大写的列由另一张纸上的值列表提供。如果该值以前以小写形式出现,然后我将数据验证应用于该列,则脚本不会将该值大写。但是,如果我从数据验证列表中选择适当的大写选项,然后以小写形式重新键入相同的值,则脚本会启动并大写。非常奇怪和混乱。我对冲突的看法可能是错误的,但在我看来就是这样。

编辑 3:它与数据验证无关,因为它在根本没有验证的简单列上的行为方式相同。如果我之前输入的值已经是小写的,那么再次以小写输入将不会激活脚本。但是,如果我用大写字母输入值,然后用小写字母重新输入,脚本会将其大写。也许一些与脚本何时触发有关的奇怪情况......?

【问题讨论】:

  • 关于编辑,我不清楚场景。您是否在编辑脚本之前或之后输入了未更改的电子表格值?
  • 您的回答中的场景是正确的,我将在今天稍后进行探讨。

标签: javascript google-apps-script google-sheets uppercase


【解决方案1】:

如果单元格包含公式时不想大写,可以使用getFormula()方法检查单元格是否包含公式。

返回区域左上角单元格的公式(A1 表示法),如果单元格为空或不包含公式,则返回空字符串

代码应如下所示:

if (ind === 0 && e.range.rowStart > 1 && e.range.columnStart >= 1  && e.range.getFormula() == '') {
  e.range.setValue(e.value.toUpperCase());
}

编辑:

如果我的理解正确,您输入的值完全相同,例如:如果单元格中的值是 México,并且您删除所有或部分字符并立即输入 México,在这种情况下,旧值和新值相同,OnEdit() 不会被触发。另一个例子是如果你改变了值的格式,那是另一种类型的事件。

如果您想知道事件是如何考虑的,您可以使用installable on change trigger

function triggerOnChange(e) {
  MailApp.sendEmail('john.doe@gmail.com', 'Testing triggerOnChange', JSON.stringify(e));
}

然后在脚本编辑器菜单中:Resources -> Current Project Triggers -> Add a new trigger -> ['triggerOnChange', 'From spreadsheet', 'On change']

关于如何更改公式结果的大小写,我认为@Rubén 的想法是正确的,但它只有在公式的第一个字符中包含UPPER() 时才有效,而且因为您使用的是公式@ 987654329@ 使用UPPER() 会破坏它,可能还有其他一些函数,比如数组公式,除非你使用INDEX()

=INDEX(UPPER(IMPORTHTML(url, query, index)))

另一种选择可能是正则表达式,但考虑到所有组合,我认为这有点冒险。

【讨论】:

  • 这个答案错过了OP想要改变公式结果的大小写。
  • 确实,在一个完美的世界里,我确实想将公式结果大写,但是在对我使用这些公式的方式稍作改变之后......这个解决方案就可以了!我不知道getFormula() 所以非常感谢你指点我!我会在一两天内接受这个答案,前提是没有其他人想出一种方法来实际利用公式的结果,如果可能的话稍微好一点。
  • 在尝试了这个之后,它只是部分工作,我不知道为什么。有些列只对少数几个单元格作出反应,而其他列根本不作出反应。将使用我当前的代码编辑我的问题。
  • 有趣的补充,谢谢!我会探索并告诉你会发生什么。
  • @ocordova:就连我answer里的代码也有很多改进的机会,我想你没看懂。请考虑尝试一下。
【解决方案2】:

那么,任何人都知道一种方法可以完全按照上面的代码做,但不接触单元格内的实际公式,只接触它们输出的文本?

考虑在 OP 方法上做些小改动:不要在任何情况下将所有单元格内容大写,而是根据以下条件大写:

  1. 如果单元格值(包括包含常量或公式的单元格的值)不是字符串,则不执行任何操作。
  2. 如果单元格值是字符串
    • 且单元格内容为常量,则直接从脚本更改大小写。
    • 且单元格内容为公式,则将原公式嵌套在内置函数UPPER中。

例子:

函数 onEdit(e) { 变量范围 = e.range; var value = range.getValue(); var sheet = range.getSheet(); var sheetName = sheet.getName(); if (sheetName === 'Sheet1' && 范围.getRow() > 1 && range.getColumn() > 1 && typeof 值 === '字符串') { 如果(!range.getFormula()){ range.setValue(value.toUpperCase()); } 别的 { if(range.getFormula().substring(0,6).toUpperCase() == '=UPPER') { 返回; } 别的 { range.setFormula('=UPPER(' + range.getFormula().substring(1) + ')'); } } } }

注意事项:

  • 为简单起见,未包括 ind 数组。
  • typeof e.value 始终返回 'string',因此使用 range.getValue();

【讨论】:

  • 哈哈很聪明!以编程方式插入upper()...我不会想到这一点。我会玩这个,看看效果如何!
  • 嗯,这绝对完美。处理我所有的用例,做得很好!我将把它评为最佳答案,因为它实际上确实将我的需求钉在了门外,而无需任何调整。感谢您的帮助和教我一些新技巧!
  • 好吧,毕竟我在你的代码上遇到了障碍,我不明白。当upper() 函数插入到包含生成十进制数的公式的列中时,该列会显示为百分比(因此 0.025 变为 2.50%),公式格式会中断并突然变为货币(2.50 美元)!我不知道为什么会这样做,并且将列格式化为百分比并没有任何作用。知道为什么会发生这种情况吗?
  • 由于已经有几个答案,请将您的后续问题作为新问题发布。参考What is the the best way to ask follow up questions?
  • 好的,我已经对此进行了进一步的探索,并得出结论认为这完全是一个单独的问题。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-20
  • 2023-02-21
  • 1970-01-01
  • 1970-01-01
  • 2017-06-12
  • 1970-01-01
相关资源
最近更新 更多