My function needs gas to fulfill a transaction, but I don't want people accidentally sending Ether to it.
The gas amount and ether sent don't mix.
Generally, all available gas forwarded with messages to other contracts (functions) but this can be controlled by specifying gas in Solidity. address.send() in particular sends only 2,300 gas (at time of writing), known as the "stipend". The low budget allows a very simplistic fallback function to execute.
No one can accidentally send Ether to function if it isn't marked "payable", however they can high gas for execution. Unspent gas is returned after successful execution.
Hope it helps.