taller's answer was effective in solving my problem but I needed to make a few minor adjustments. Here is the final working version of the code for anyone interested.
function main(workbook: ExcelScript.Workbook) {
let tbPO = workbook.getTable("Portland");
let sheet = workbook.getWorksheet("Portland Customers");
let sheet2 = workbook.getWorksheet("Portland Archive");
if (tbPO) {
const tabFilter = tbPO.getAutoFilter();
tabFilter.clearCriteria();
const dataRange = tbPO.getRangeBetweenHeaderAndTotal()
tabFilter.apply(dataRange,
0, {
filterOn: ExcelScript.FilterOn.values,
values: ["Cancelled", "Order Bombed/Job Jacket Sent", "Voided"]
}); const visRng = dataRange.getSpecialCells(ExcelScript.SpecialCellType.visible);
if (visRng) {
const desDataRange: ExcelScript.Range = sheet2.getUsedRange(true);
const destCell: ExcelScript.Range = sheet2.getCell(desDataRange.getRowCount()+1, 0);
destCell.copyFrom(visRng);
// remove filtered rows from PO
const visAreas = visRng.getAreas().reverse();
let visRngRefs: string[] = visAreas.map(x => x.getAddress());
// remove rows
visRngRefs.forEach(x => {
sheet.getRange(x).getEntireRow().delete(ExcelScript.DeleteShiftDirection.up);
})
}
tbPO.getAutoFilter().clearCriteria(); }}