我想创建一个脚本,我将在一个菜单中获得范围"A1:C"把它大写。问题是会抛出一个错误"TypeError: values。toUpperCase不是一个函数">试图使用toUpperCase()
.
得到以下代码:
function allUpper() {
var values = SpreadsheetApp.getActiveSheet().getRange("A1:C").getValues();
var valuesUpper = values.toUpperCase();
ss.getRange("A1:C").setValue(valuesUpper);
}
我对JS和sheets api很陌生。我觉得很傻,因为它看起来很简单。
编辑1:现在我知道。touppercase()对数组不起作用。但是所提出的映射数组和遍历数组内元素的解决方案仍然会抛出与toUpperCase();
相同的错误。编辑2:我上传了@NEWAZA要求的我的数据样本示例
Try:
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()
循环遍历每一行,并且在每一行中,我们循环遍历每个单元格/列并设置为大写。
另一种常见的方法是使用for
循环,并将一个循环嵌套在另一个循环内。
阅读更多:
- Array.map ()
在修改值范围时需要注意的一件重要的事情是,你需要确保你设置的范围与这些值的'大小'相同。
最初你从A1:C
中获取值并试图将它们设置为A1
,由于'size'的差异,这将不起作用。
编辑:在列/单元格映射中寻址空白单元格。
(col) ? col.toUpperCase() : col
如果item有值,将其修改为.toUpperCase()
或保留。
Range.getValues
返回二维数组。您必须为每一行和每一列执行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 );
}
当您可以执行以下操作时,就不需要低效的嵌套for循环:
values.map( function( row ) {
return row.map( function( cell ) {
cell = cell.toUpperCase();
} );
}