How it works
The two guards drop edits we do not care about: anything outside column E, and any value other than the exact string "Done". That keeps the trigger cheap on every keystroke.
It reads the full row with getRange(row, 1, 1, getLastColumn()), appends it to the Done sheet, then deletes the source row. appendRow + deleteRow run in order, so the move is atomic from the editor’s point of view.
This must be an installable onEdit trigger (added from the Triggers panel), not the simple one — moving data between sheets needs the broader authorization the installable trigger carries.