typescript - Script Office care elimină rândul pe baza unei părți din text


Întocmesc un script Office care ar trebui să șteargă un rând pe baza unei părți din textul dintr-o celulă din prima coloană. Cuvântul declanșator ar trebui să fie „Applied”, dar de multe ori mai urmează text după primul cuvânt, de exemplu „Applied formula” sau „Applied number”.

Scenariul:

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)
    }
  }

}

Nu reușesc să-l fac să funcționeze, ar trebui să fie altceva în loc de „*” după Applied în ultima parte a scriptului?

Mulțumesc anticipat

Răspuns #1

Cred că trebuie să-ți transformi valorile în șiruri și apoi să folosești funcția search.

Exemplu, am aceste valori în celulele A1:A5 ...

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

Va trebui să adaptezi asta, dar am creat un script care arată astfel ...

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'));
  });
}

... și rezultatul afișat în consolă este acesta ...

Pentru a evita diferențele de majuscule, am setat șirul de caractere la litere mici înainte de căutare, dar depinde de tine dacă vrei să respecți majusculele.

De asemenea, poți folosi această abordare ...

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

... pentru a ignora majusculele și minusculele.

În cele din urmă, folosește toString() și apoi funcția search() și aceasta va returna poziția subșirului în șirul tău principal.

Orice valoare mai mare decât -1 înseamnă că șirul există.

Dacă vrei să testezi pentru a vedea dacă șirul începe cu Applied, atunci va trebui să verifici toate cazurile în care rezultatul căutării este egal cu 0.

Răspunsul #2

O opțiune pe care o poți folosi este să convertești valorile într-un șir de caractere. Deci ai actualiza o linie ca aceasta:

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

La un rând ca acesta

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

Acest lucru poate fi mai rapid decât apelarea toString() pe fiecare element din array.

După ce ai făcut asta, ar trebui doar să-ți actualizezi linia condițională If de la aceasta:

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

La ceva de genul acesta:

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