We can and we do automate it. Given enough sample data and context of the data source and how the cleaned dataset will be used, you can write a script that can automate the data cleaning for a future sample which has the same context. You might get some errors if you future samples are very different from what you used to build the script or if you just missed some edge cases. This is still automation - build once, run multiple times with no additional effort.
What we can't do is create a generalised function called clean(data) that can be applied to any dataset. The reason is that your original format, data source, goals, domain knowledge, personal judgement vary so much that it makes it pointless to even try.