A real TA workbook reported “the meta block has no Project value” on a file whose Project cell was filled in. Four separate causes, all in how the workbook was read.
The Right Sheet, and the Header Block Wherever It Sits
The upload took the first sheet in the workbook, blindly. One real file carried fourteen sheets and position one held a TA sheet for a different, earlier order — which parsed perfectly and named a project that was not the one being uploaded. Sheets are now scored on whether they name a project, carry a planned start date and hold task rows; the best one wins, every task sheet found is offered, and an explicit choice still overrides. A workbook with no task sheet at all is refused by name instead of falling back to sheet one.
The header block was read only below the column headings, only from rows carrying a particular flag, and only from the end-date column. Real files do none of those three reliably, so the whole grid is scanned now, in any column. Labels are matched exactly, then as a phrase inside a longer cell, then by close spelling — and a column heading can never be mistaken for a header label, which is what previously turned the heading row into data and the first task into a heading.
The first heading row is not always the complete one: in that file only the second row named Employee ID and Employee Name, so every task imported unassigned. Columns the first row omits are now filled in from a later one, and columns it does name are never overridden.
When a value really is missing, the message now names what the pass did read and lists the cells it could not match, with their references — so a sheet the parser does not recognise stops looking like a blank cell.