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. These are separate operations, not an atomic move: a failure between them can leave a duplicate. Concurrent edits can also move row positions; this minimal example needs coordination and recovery before unattended use.
A bound simple onEdit trigger can modify its own spreadsheet. Installable triggers are needed for services that require additional authorization; moving between tabs of this same spreadsheet does not by itself require one.