You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Office脚本:将当前日期转换为指定格式以实现工作表日期比较

Office脚本:将当前日期转换为指定格式以实现工作表日期比较

我来帮你搞定这个日期格式转换和比较的问题!你当前的代码里直接调用getMonth()返回的是0-11的数字,年份也是完整四位数,这和你需要的DD-MMM-YY格式完全不匹配,所以自然没法正确匹配工作表里的日期。下面给你两种可行的解决方案:

方案一:转换为指定格式的字符串进行比较

这种方法适合工作表中存储的日期是文本格式的情况,我们手动拼接出DD-MMM-YY格式的字符串:

function main(workbook: ExcelScript.Workbook) {
  let selectedSheet = workbook.getWorksheet("Summary"); // 修正了你之前引号不配对的问题
  let dataRange = selectedSheet.getRange("AC:AC").getUsedRange();
  let maxRows = dataRange.getRowCount(); // 去掉多余的+7,getUsedRange已经是实际有数据的行范围
  let maxCols = dataRange.getColumnCount();

  // 定义月份缩写数组,对应0-11的月份数字
  const monthAbbrs = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
  const today = new Date();
  
  // 构建DD-MMM-YY格式的字符串
  const day = today.getDate();
  const month = monthAbbrs[today.getMonth()];
  const year = today.getFullYear().toString().slice(-2); // 取年份后两位
  const formattedToday = `${day}-${month}-${year}`;

  console.log("当前日期格式化后:", formattedToday);

  for (let row = 0; row < maxRows; row++) {
    for (let col = 0; col < maxCols; col++) {
      let cellValue = dataRange.getCell(row, col).getValue();
      // 处理单元格值:如果是日期对象就转成目标格式,否则直接用原文本
      let cellText = typeof cellValue === "object" 
        ? cellValue.toLocaleDateString("en-US", {day: "numeric", month: "short", year: "2-digit"}) 
        : cellValue;
      
      if (cellText === formattedToday) {
        console.log(`第${row+1}行匹配成功!`);
      }
    }
  }
}

方案二:直接比较日期对象(更可靠)

如果工作表中的日期是Excel日期类型(不是文本),直接比较日期对象会更准确,避免字符串格式不一致的问题:

function main(workbook: ExcelScript.Workbook) {
  let selectedSheet = workbook.getWorksheet("Summary");
  let dataRange = selectedSheet.getRange("AC:AC").getUsedRange();
  let maxRows = dataRange.getRowCount();
  let maxCols = dataRange.getColumnCount();

  // 获取今天的日期(去掉时分秒,只保留年月日部分)
  const today = new Date();
  const todayOnlyDate = new Date(today.getFullYear(), today.getMonth(), today.getDate());

  for (let row = 0; row < maxRows; row++) {
    for (let col = 0; col < maxCols; col++) {
      let cellValue = dataRange.getCell(row, col).getValue();
      
      // 检查单元格值是否为日期对象
      if (cellValue instanceof Date) {
        // 去掉单元格日期的时分秒,只保留年月日
        const cellDateOnly = new Date(cellValue.getFullYear(), cellValue.getMonth(), cellValue.getDate());
        if (cellDateOnly.getTime() === todayOnlyDate.getTime()) {
          console.log(`第${row+1}行匹配成功!`);
        }
      }
    }
  }
}

几个关键注意点:

  • 你原来的代码里workbook.getWorksheet("Summary)存在引号不配对的错误,我已经修正了;
  • 不要随便给maxRows+7getUsedRange()已经返回了实际有数据的行范围,直接用getRowCount()即可;
  • 如果不确定单元格里的日期是文本还是日期类型,可以先判断类型再处理,避免出现报错。

内容来源于stack exchange

火山引擎 最新活动