It might be a good idea to add something like "or not self.action" to the "return end" statement at the top just in case it tries to apply to a button without that attribute for some reason.
Lua Code:
local oSetAttribute = getmetatable(ActionButton1).__index.SetAttribute
hooksecurefunc(getmetatable(ActionButton1).__index, 'SetAttribute', function(self, attribute)
if attribute ~= 'showgrid' or GetCVar('alwaysShowActionBars') ~= '0' or not self.action then return end
oSetAttribute(self, 'showgrid', GetCursorInfo() and 1 or 0)
if not HasAction(self.action) then self:Hide() end
end)