Google Apps Script日期转换脚本运行缓慢,求优化方案
Google Apps Script 日期提取中文月份性能优化
你的代码速度慢的核心原因是循环中反复调用getRange()和setValue()——每一次调用都需要和Google Sheets服务器交互,这种高频IO操作会极大拖慢执行效率。
优化方案:批量读写+内存处理
核心思路是一次性读取所有需要处理的日期数据,在内存中完成月份转换,最后一次性写入结果,把原本N次的IO操作压缩到3次以内。
优化后的代码
function Change_to_Month() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const lastRow = sheet.getLastRow(); if (lastRow === 0) return; // 空表直接返回 // 1. 批量读取A列所有日期数据 const dateValues = sheet.getRange(1, 1, lastRow, 1).getValues(); // 2. 内存中批量转换为中文月份 const monthValues = dateValues.map(row => { const oldDate = row[0]; // 直接生成中文月份,无需额外映射 return [oldDate.toLocaleDateString('zh-CN', { month: 'long' })]; }); // 3. 批量写入B列 sheet.getRange(1, 2, lastRow, 1).setValues(monthValues); }
关键优化点说明
- 批量读取:
getRange(1,1,lastRow,1).getValues()一次性获取A列所有数据,返回二维数组,避免循环中逐行读取。 - 内存处理:用
map()遍历数组,在本地完成日期转月份的逻辑,全程不与服务器交互。 - 批量写入:
setValues()一次性把处理好的二维数组写入B列,仅一次IO操作。
补充:用Utilities.formatDate的批量实现
如果偏好使用Utilities.formatDate,同样要遵循批量处理逻辑:
function Change_to_Month_With_Utilities() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const lastRow = sheet.getLastRow(); if (lastRow === 0) return; const dateValues = sheet.getRange(1, 1, lastRow, 1).getValues(); const timeZone = Session.getScriptTimeZone(); // "MMMM"对应中文月份全称,"MMM"对应简称 const monthValues = dateValues.map(row => { const oldDate = row[0]; return [Utilities.formatDate(oldDate, timeZone, "MMMM", "zh-CN")]; }); sheet.getRange(1, 2, lastRow, 1).setValues(monthValues); }
示例数据验证
| 原日期(A列) | 转换后月份(B列) |
|---|---|
| 4/26/23 4:53 | 四月 |
| 3/23/23 2:35 | 三月 |
| 2/17/23 13:17 | 二月 |
| 1/31/23 21:35 | 一月 |
内容的提问来源于stack exchange,提问作者Moncholero
相关产品推荐
相关产品推荐

