Google Script:如何将getDisplayValues对象数组所有值转小写并跨表复制?
批量将工作表数据转为小写并复制到目标表的解决方案
嘿,我完全懂你的困扰——displayValue.toLowerCase()只能处理单个单元格值,没法直接作用于整个对象/数组对吧?这是因为从工作表获取的getDisplayValues()返回的是二维数组(每一行是一个子数组,每个子数组里是该行的单元格值),所以我们需要遍历数组里的每一项来批量转换。下面给你几种不同环境下的实现方式:
方法一:Google Apps Script 用 map() 遍历处理(简洁高效)
这种方法用数组的map()方法嵌套遍历,代码更简洁:
function convertToLowerCaseAndCopy() { // 1. 配置源和目标工作表名称 const sourceSheetName = "你的源工作表名"; const targetSheetName = "你的目标工作表名"; // 2. 获取源数据(显示值二维数组) const ss = SpreadsheetApp.getActiveSpreadsheet(); const sourceSheet = ss.getSheetByName(sourceSheetName); const sourceData = sourceSheet.getDataRange().getDisplayValues(); // 3. 批量转换为小写:遍历每一行,再遍历该行每个单元格 const lowerCaseData = sourceData.map(row => row.map(cell => typeof cell === 'string' ? cell.toLowerCase() : cell) ); // 4. 将处理后的数据写入目标工作表 const targetSheet = ss.getSheetByName(targetSheetName); targetSheet.getRange(1, 1, lowerCaseData.length, lowerCaseData[0].length) .setValues(lowerCaseData); }
备注:加了typeof cell === 'string'的判断,是为了避免数字、日期等非字符串类型的值报错,确保兼容性。
方法二:Google Apps Script 用传统 for 循环处理(适合新手理解)
如果你更习惯传统循环的逻辑,也可以这么写:
function convertToLowerCaseWithLoop() { const sourceSheetName = "你的源工作表名"; const targetSheetName = "你的目标工作表名"; const ss = SpreadsheetApp.getActiveSpreadsheet(); const sourceSheet = ss.getSheetByName(sourceSheetName); const sourceData = sourceSheet.getDataRange().getDisplayValues(); const lowerCaseData = []; const rowCount = sourceData.length; const colCount = sourceData[0].length; // 外层循环遍历每一行 for (let i = 0; i < rowCount; i++) { const currentRow = []; // 内层循环遍历该行的每个单元格 for (let j = 0; j < colCount; j++) { const cellValue = sourceData[i][j]; currentRow.push(typeof cellValue === 'string' ? cellValue.toLowerCase() : cellValue); } lowerCaseData.push(currentRow); } // 写入目标表 const targetSheet = ss.getSheetByName(targetSheetName); targetSheet.getRange(1, 1, lowerCaseData.length, lowerCaseData[0].length) .setValues(lowerCaseData); }
方法三:Excel VBA 环境下的实现
如果你用的是Excel VBA,逻辑类似,通过遍历数组来处理:
Sub ConvertToLowerCaseAndCopy() ' 配置工作表名称 Dim sourceSheet As Worksheet, targetSheet As Worksheet Set sourceSheet = ThisWorkbook.Sheets("源工作表名") Set targetSheet = ThisWorkbook.Sheets("目标工作表名") ' 获取源数据到数组(比直接遍历单元格快很多) Dim sourceData As Variant sourceData = sourceSheet.UsedRange.Value ' 遍历数组转换小写 Dim i As Long, j As Long For i = LBound(sourceData, 1) To UBound(sourceData, 1) For j = LBound(sourceData, 2) To UBound(sourceData, 2) ' 只处理字符串类型 If TypeName(sourceData(i, j)) = "String" Then sourceData(i, j) = LCase(sourceData(i, j)) End If Next j Next i ' 写入目标工作表 targetSheet.Range("A1").Resize(UBound(sourceData, 1), UBound(sourceData, 2)).Value = sourceData End Sub
核心思路都是:先获取整个数据范围的数组,然后遍历数组中的每个元素,对字符串类型的值执行小写转换,最后将处理后的数组写入目标工作表,这样比逐个处理单元格效率高很多哦!
内容的提问来源于stack exchange,提问作者YtuSan
相关产品推荐
相关产品推荐

