excel 如何循环通过单元格在表列和检查是否正则模式有匹配?

yqkkidmi  于 2023-01-03  发布在  其他
关注(0)|答案(2)|浏览(138)

我正在尝试编写Office脚本以循环表列范围并检查Regex Pattern是否匹配。如果匹配,请标记为红色:

function main(workbook: ExcelScript.Workbook) {

    let worksheet = workbook.getWorksheet("Workstreams");
    let usedColumn = worksheet.getTables()[0].getColumn("Last Update Time");
    let regexPattern = "^(0[1-9]|1[0-2])\/(0[1-9]|1\d|2\d|3[01])\/(23) ([1-9]|0[1-9]|1[0-2]):[0-5][0-9] ([AaPp][Mm])$"

}

如何
1.循环通过列?
1.用红色标记单元格
谢谢你的帮助Michal
编辑日期:2023年2月2日:尝试从单元格获取值的代码:

function main(workbook: ExcelScript.Workbook) {
  let worksheet = workbook.getWorksheet("Workstreams");
  let usedColumn = worksheet.getTables()[0].getColumn("Last Update Time");
  let dataRange = usedColumn.getRangeBetweenHeaderAndTotal();
  //const values = dataRange.getValues();
  let regex = /^(0[1-9]|1[0-2])\/(0[1-9]|1\d|2\d|3[01])\/(23) ([1-9]|0[1-9]|1[0-2]):[0-5][0-9] ([AaPp][Mm])$/;

  for (let i = 0; i < dataRange.getValues().length; i++) {
    let cRow: number = i;
    let rowCell: ExcelScript.Range = dataRange.getCell(cRow, 0);
    let rowValue: string = rowCell.getValue() as string;
    console.log(rowValue);
  } 

}

输出如下:44641.25 44713.21875 44587.1361111111测试
对于列中的这些值:2022年3月21日上午6:00 2022年6月1日上午5:15 2022年1月26日上午3:16测试
所以问题是JS正在以某种方式将字符串转换为数字...最好的,Michal

c86crjj0

c86crjj01#

我认为你的问题是在javascript和Office Scripts API的交叉点上。你可以使用string的.match函数来测试一个值是否与正则表达式匹配,例如:

let x = "hello".match(/^he.*/);

在x内,您可以获得一些详细信息(例如:输入的哪一部分匹配),但是如果您只关心得到了A匹配,则可以测试返回值是否为null

if ("hello".match(/^he$/) === null) { 
   ... no match found ... 
} else {
   ... match found ... 
}

你可以从你的表的列中获取值,方法是先获取数据的范围,然后获取值,如下所示:

const dataRange = usedColumn.getRangeBetweenHeaderAndTotal();
const values = dataRange.getValues();

值将是number类型的二维数组|弦|这是getRange函数返回2D区域的一个怪癖。由于列是垂直的,所以其中的数据看起来像[[row1Data],[row2Data],... ]
现在你可以对这些值运行forEach并测试正则表达式,如果正则表达式失败,你可以应用你的格式:

values.forEach((rowValues, index) =>  {
   if ((rowValues[0] as string).match(yourRegex) === null) {
      // apply the formatting
      dataRange.getCell(index, 0).getFormat().getFill().setColor('#FF0000');
   }
}
bf1o4zei

bf1o4zei2#

你可以试试下面的代码:

function main(workbook: ExcelScript.Workbook) {
  let worksheet = workbook.getWorksheet("Workstreams");
  let usedColumn = worksheet.getTables()[0].getColumn("Last Update Time");
  let rowCount = usedColumn.getRangeBetweenHeaderAndTotal().getRowCount();
  let colVals = usedColumn.getRangeBetweenHeaderAndTotal().getValues() as string[][];
  let regex = /^(0[1-9]|1[0-2])\/(0[1-9]|1\d|2\d|3[01])\/(23) ([1-9]|0[1-9]|1[0-2]):[0-5][0-9] ([AaPp][Mm])$/;

  for (let i = 0; i < rowCount; i++) {
      if (regex.test(colVals[i][0])) {
        usedColumn.getRangeBetweenHeaderAndTotal().getCell(i, 0).getFormat().getFill().setColor("red");
      }
  } 
}

这段代码迭代表列中的值,还从模式中创建了一个正则表达式对象,使用RE对象测试正在迭代的列中的值,如果匹配,则将该值的单元格颜色设置为红色。

相关问题