如何在AppScript中为指定列模拟Proper函数功能?
修正Google Apps Script实现指定列Proper格式的代码
错误原因
你遇到的「Expected string but got a undefined value.」错误,是因为原代码没处理空单元格、数字/布尔值这类非字符串数据,直接对undefined执行了字符串操作(比如toUpperCase())导致的。
修正后的指定列处理代码
function applyProperToColumns() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const targetColumns = [1, 3]; // 自定义要处理的列号(A=1,B=2,以此类推) const dataRange = sheet.getDataRange(); const values = dataRange.getValues(); // 遍历每一行,只处理指定列 values.forEach(row => { targetColumns.forEach(colNum => { const cellValue = row[colNum - 1]; // 列号转数组索引(数组从0开始) // 只处理非空字符串,跳过空值、数字、布尔值 if (typeof cellValue === 'string' && cellValue.trim() !== '') { // 实现Proper格式:每个单词首字母大写,其余小写 row[colNum - 1] = cellValue.toLowerCase().replace(/\b\w/g, char => char.toUpperCase()); } }); }); // 将处理后的数据写回工作表 dataRange.setValues(values); }
核心修正点
- 类型校验:先判断单元格值是否为非空字符串,避免对
undefined、数字等执行字符串操作 - 指定列支持:通过
targetColumns数组自定义要处理的列,不用遍历所有列 - 完善Proper逻辑:用正则
/\b\w/g匹配每个单词的首字母,确保所有单词都正确大写(原代码可能只处理了第一个单词) - 保留原始数据:空单元格、数字、布尔值保持原样,不会被修改
输入输出示例
输入数据
| A列 | B列 | C列 |
|---|---|---|
| john doe | 25 | new york |
| alice smith | 30 | los angeles |
| 28 | CHICAGO |
处理后输出
| A列 | B列 | C列 |
|---|---|---|
| John Doe | 25 | New York |
| Alice Smith | 30 | Los Angeles |
| 28 | Chicago |
使用步骤
- 打开目标Google表格,点击「扩展程序」→「Apps脚本」
- 清空原有代码,粘贴上面的修正版代码
- 修改
targetColumns数组,填入你需要处理的列号(比如要处理B和D列就写[2,4]) - 点击运行按钮,按提示授权脚本权限,执行完成后返回表格查看结果
可选:处理所有列的版本
如果还是需要处理整张表的所有列,用下面的代码:
function applyProperToAllColumns() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const dataRange = sheet.getDataRange(); const values = dataRange.getValues(); values.forEach(row => { row.forEach((cell, index) => { if (typeof cell === 'string' && cell.trim() !== '') { row[index] = cell.toLowerCase().replace(/\b\w/g, char => char.toUpperCase()); } }); }); dataRange.setValues(values); }
内容的提问来源于stack exchange,提问作者user10371424
相关产品推荐
相关产品推荐

