基于部分文本删除行的 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")) {
我正在制作一个 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")) {