在工作表 APP 脚本中将范围设置为大写

Set a range to uppercase in sheets APP SCRIPT

我想创建一个脚本,我将在菜单中获取范围“A1:C”并将其大写。问题是抛出错误 "TypeError: values.toUpperCase is not a function" trying to use toUpperCase().

得到以下代码:

function allUpper() {
  var values = SpreadsheetApp.getActiveSheet().getRange("A1:C").getValues();
  var valuesUpper = values.toUpperCase();
  ss.getRange("A1:C").setValue(valuesUpper);
}

我对 JS 和工作表还很陌生 api。我觉得很傻,因为它看起来很简单。

编辑 1: 现在我知道 .toUpperCase() 不适用于数组。但是建议的映射数组和循环遍历内部元素的解决方案仍然会抛出与 toUpperCase();

相同的错误

编辑 2: 我上传了@NEWAZA 要求的我的数据样本 Sample

Range.getValues returns 二维数组。您必须对每一行和每一列执行 toUpperCase()

function allUpper() {
  var values = SpreadsheetApp.getActiveSheet().getRange( "A1:C" ).getValues();

  for ( var row = 0; row < values.length; row++ ) {
      for ( var col = 0; col < values[ row ].length; col++ ) {
          values[ row ][ col ] = values[ row ][ col ].toUpperCase();
      }
  }

  ss.getRange( "A1:C" ).setValues( values );
}

尝试:

function allUpper() {
  const range = SpreadsheetApp.getActiveSheet()
                              .getRange("A1:C")

  const values = range.getDisplayValues()
                      .map(row => row.map(col => (col) ? col.toUpperCase() : col))

  range.setValues(values);
}

values 中获得值后,我们使用 .map() 遍历每一行,在每一行中,我们遍历每个 cell/column 并设置为大写。

另一种常见的方法是使用 for 循环并将一个循环嵌套在另一个循环中。

阅读更多:

修改值范围时需要注意的一件重要事情是,您需要确保您设置的范围与这些值相同'size'。

最初您从 A1:C 获取值并试图将它们设置为 A1,由于 'size'.

的差异,这将无法工作

编辑: 解决了 column/cell 映射中的空白单元格。

(col) ? col.toUpperCase() : col

如果物品有价值,请将其修改为.toUpperCase(),否则保留。

当您可以执行以下操作时,就不需要低效的嵌套 for 循环了:

values.map( function( row ) {
    return row.map( function( cell ) { 
        cell = cell.toUpperCase(); 
    } );
}