登记时间与交接时间

阅读次数 74

需要一个程序 在表格中有一个登记时间和交接时间。在登记时间后七天(包含七天)若交接时间没有写入则这一排数据将会提醒。提醒的样式不限。

2 Answers

抽空给你写了一个,根据需要自己修改哪一列是登记时间和交接时间;

Cells(i, 'A').Text;//修改'A'为你自己的登记时间的列名字

Cells(i, 'B').Text;//修改'B'为你自己的登记时间的列名字

for (let i = firstRow + 1; i <= lastRow; i++) { //如果有大标题,那么firstRow +1(从第二行开始),如果有大标题和小标题,从第三行开始,改成+2

支持以下时间格式 年+月+日 月+日
支持以下分隔符号:
-/、年月日

// 定义今天和每月最后一天的时间
const now = new Date();// 获取当前日期和时间
const currentYear = now.getFullYear();// 获取当前年份
const currentMonth = now.getMonth() + 1;// 获取当前月份,注意需要[+1]
const currentDay = now.getDate();// 今天

// 定义API
var API = Application;

// 定义使用区域
var UsedRange = API.ActiveSheet.UsedRange;

var firstCol = UsedRange.Column;
var lastCol = UsedRange.ColumnEnd;
var firstRow = UsedRange.Row;
var lastRow = UsedRange.RowEnd;

// 打印激活区域的范围
console.log(
  '[' + 'firstCol: ' + firstCol + ']',
  '[' + 'lastCol: ' + lastCol + ']',
  '[' + 'firstRow: ' + firstRow + ']',
  '[' + 'lastRow: ' + lastRow + ']'
)

//判断日期是年+月+日或年+月
/**
* @param {any} str
*/
function checkDate(str) {
  let formatA = /^\d{4}[-\/、\u4e00-\u9fa5]\d{1,2}[-\/、\u4e00-\u9fa5]\d{1,2}$$/; //判断时间格式年+月+日,支持-\/、年月日分隔符
  let formatB = /^\d{1,2}[-\/、\u4e00-\u9fa5]\d{1,2}$$/; //判断时间格式月+日,支持-\/、月日分隔符
  if (formatA.test(str)) {
    return true;
  } else if (formatB.test(str)) {
    return false;
  } else {
    console.log('错误的时间格式');
    return 0;
  }
}

//计算现在时间和登记日期的差值
/**
* @param {number} targetYear
* @param {number} targetMonth
* @param {number} targetDay
*/
function isSevenDaysOrMore(targetYear, targetMonth, targetDay) {
  const oneDayInMilliseconds = 24 * 60 * 60 * 1000; // 一天的毫秒数
  const currentDateTimestamp = new Date(currentYear, currentMonth, currentDay).getTime();//现在时间 年+月+日
  const targetDateTimestamp = new Date(targetYear, targetMonth, targetDay).getTime();//登记时间 年+月+日
  const differenceInDays = Math.round((currentDateTimestamp - targetDateTimestamp) / oneDayInMilliseconds);//计算时间差
  const timeDiff = (differenceInDays >= 7 ? true : false);//输出布尔值判断

  return timeDiff;//返回结果
}


//strA 假设A列是登记时间
//strB 假设B列是交接时间
//'#FF0000' 红色
//'#FFFF00' 黄色
for (let i = firstRow + 1; i <= lastRow; i++) {
  let cellA = Cells(i, 'A').Text;//获取A列文本内容
  let dateA = new Date(cellA);//A列文本转换为登记时间
  let yearA = (checkDate(cellA) ? dateA.getFullYear() : currentYear);//提取年份
  let monthA = dateA.getMonth() + 1;//提取月份
  let dayA = dateA.getDate();//提取日期

  let cellB = Cells(i, 'B').Text;//获取B列文本内容
  //let dateB = new Date(cellB);//B列文本转换为交接时间
  //let yearA = date.getFullYear();
  //let monthA = date.getMonth();
  //let dayA = date.getDate();

  //如果登记时间的格式为年+月+日
  if (yearA && monthA && dayA) {
    //直接从登记时间获取年+月+日并计算时间差
    let timeDiff = isSevenDaysOrMore(yearA, monthA, dayA);
    //如果大于等于7天并且没有交接时间
    if (timeDiff && !cellB) {
      console.log(yearA + '-' + monthA + '-' + dayA, ' ','大于等于7天且未填写交接日期');
      Cells(i, 'A').Font.Color = '#FF0000';//设置单元格字体红色
      Cells(i, 'B').Font.Color = '#FF0000';//设置单元格字体红色
      Cells(i, 'C').Font.Color = '#FF0000';//设置单元格字体红色
      Cells(i, 'D').Font.Color = '#FF0000';//设置单元格字体红色
      Cells(i, 'E').Font.Color = '#FF0000';//设置单元格字体红色
      Cells(i, 'F').Font.Color = '#FF0000';//设置单元格字体红色
    }

  }

}