Why the function name is a string, not a reference
The `addItem` call takes two arguments: the label the user sees, and the function name as a plain string. That string is what Apps Script resolves at click-time by looking up a global function in your project. It does not accept a function reference like `addItem('Run Report', runReport)` — pass the bare function and Apps Script silently drops the handler.
This is the failure mode I see most often: someone refactors their code, renames `runReport` to `generateMonthlyReport`, updates the call sites in their own code, but forgets the string in `addItem`. The menu still appears. Clicking it does nothing. No error, no toast, no indication something is wrong. The string and the function name must match exactly, including case.
The practical implication: keep your handler functions at the top level of any `.gs` file in the project, never nested inside another function or wrapped in an IIFE. Apps Script's global scope spans the whole project, so you can put handlers in a separate file (e.g. `handlers.gs`) as long as they aren't nested.