You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 08:25:31