UNITS TRACKER

Syncing…
CS In Queue Production Shipping Shipped
📜 Execution log 0

How this simulator maps to your Apps Script

Every interaction below calls a JS function that mirrors, line for line, a function in the code you gave me. Nothing here is decorative — it's the same routing logic running client-side against sample rows pulled from your workbook.

onEdit(e)
processEdit(e)
Changing the Order Status select on any row is the simulated "edit to column L." The row is located, its old status is compared to the new one, and the same branching your script does runs: Customer Service-only rules first, then the workbook-wide Shipping/Shipped rules. Trigger: any Order Status dropdown
addTimestamp()
Setting status to In Queue on the Customer Service sheet stamps column Q with the current time — nothing moves, exactly like your script's early return. Trigger: Order Status → "In Queue" (Customer Service only)
moveRowToMultiple()
findSheetLoose()
Setting status to Production on Customer Service reads column H (Unit Model), splits it on commas, and copies the row into every matching destination sheet — a comma-separated model like "FA2, FA1/GS2" fans the same row out to both tabs, stamping column R on each copy. Names are matched loosely (trimmed, case-insensitive), just like findSheetLoose. Unmatched names produce a warning toast instead of a silent failure. Trigger: Order Status → "Production" (Customer Service only)
moveRow()
Shipping and Shipped are workbook-wide rules — they fire no matter which sheet the row currently lives on, moving it to the Shipping or Shipped tab and stamping column S or T. Trigger: Order Status → "Shipping" / "Shipped" (any sheet)
returnOrderToCustomerService()
Customer Service is also workbook-wide: setting status to Customer Service on any tab moves that row back to the Customer Service sheet. If the order was fanned out to multiple unit tabs (same Order No., or same PO + Customer), every related row is pulled back together. Trigger: Order Status → "Customer Service" (any sheet)
updateAuditSheet()
After every edit, the Sales Team tab is fully rebuilt: it walks the 10 tracked sheets in order and pulls Order No., PO No., Customer, Unit Model, and Order Status (columns E–H and L) from every populated row. It's read-only here for the same reason it's a generated view in your sheet — it exists to be rebuilt, not edited. Trigger: automatically, after any move — or "Rebuild Sales Team Sheet Now"
Logger.log()
ss.toast()
Every move, warning, and failure is written to the execution log (bottom right) — that's your Logger.log calls — and surfaced as a toast in the corner, matching ss.toast(message, title, timeout).

Settings

Admin-only. Manage users, roles, and the option lists used by app dropdowns.

Admin — full access including Settings, queue reorder, and Reset to Seed Data.
Editor — edit orders, status routing, add/delete rows; no Settings, queue reorder, or seed reset.
Viewer — read-only: view sheets, search, and export KPIs.

Username Role Password

Add user

Admins can always add and edit PTO on the Calendar page. Grant access to other users below so they can add/edit/delete PTO entries on Shipping, Production, Filters, and Customer Service calendars.

Add or remove values used by dropdowns across the board. Order Status values stay fixed (they drive routing logic).

Hold Reason — Customer Service
Hold Reason — Production sheets
Production Operators
Unit Models
Filter Names — On Order (Filters tab)
On Hold — User names