基于部分文本删除行的 Office 脚本

Office Script that removes Row based on part of Text

我正在制作一个 Office 脚本,它应该根据第一列单元格中的部分文本删除一行。触发词应该是“Applied”,但它通常是第一个词之后的更多文本,即“Applied formula”或“Applied number”。

脚本:

function main(workbook: ExcelScript.Workbook) {

  //getting the used range in the worksheet
  let usedRange = workbook.getActiveWorksheet().getUsedRange();

  //getting the row count of the used range
  let lastRow = usedRange.getRowCount();

  usedRange = workbook.getActiveWorksheet().getRangeByIndexes(0, 0, (usedRange.getRowIndex() + lastRow), 19)

  //getting the values of the range
  let values = usedRange.getValues();

  //getting the row count of the range
  let rowCount = usedRange.getRowCount();

  //for every row starting at the last row, checking if the cell in column 'A' contains part of text "Applied". If it is, then delete the entire row. 
  for (let i = rowCount - 1; i >= 0; i--) {
    if (values[i][0] == "Applied*") {
      usedRange.getCell(i, 0).getEntireRow().delete(ExcelScript.DeleteShiftDirection.up)
    }
  }

}

我无法让它工作,在脚本的最后部分 Applied 之后是否应该有其他东西而不是“*”?

提前致谢

我认为您需要将您的值转换为字符串,然后使用 search 函数。

例如,我在单元格中有这些值 A1:A5 ...

this string doesn't have it
this is test a string
this one has Test
another one without
nup, not this one

您需要对此进行调整,但我创建了一个如下所示的脚本...

function main(workbook: ExcelScript.Workbook)
{
  let activeSheet = workbook.getActiveWorksheet();
  let range = activeSheet.getRange("A1:A5");
  let rangeValues = range.getValues();
  
  rangeValues.forEach(cellValue => {
    console.log(cellValue[0].toString().toLowerCase().search('test'));
  });
}

...控制台的输出是...

为了避免大小写,我在搜索前将字符串设置为小写,但是否要尊重大小写取决于您。

您也可以使用这种方法...

cellValue[0].toString().search(/test/i)

...忽略大小写。

最重要的是,使用 toString(),然后使用 search() 函数,它将 return 子字符串在主字符串中的位置。

大于 -1 表示字符串存在。

如果您想测试字符串是否以 Applied 开头,那么您需要检查所有出现搜索结果等于 0.

您可以做的一个选择是将值转换为字符串数组。所以你会像这样更新一行:

//getting the values of the range
let values = usedRange.getValues();

这样一行

//getting the values of the range
let values = usedRange.getValues() as string[][];

这可能比对数组中的每个元素调用 toString() 更快。

在你这样做之后,你只需要从这里更新你的条件 If 行:

if (values[i][0] == "Applied*") {

像这样:

if (values[i][0].toLowerCase().includes("applied")) {