Garland made it 2-1 at 4:49 of the second period on a 2-on-1 by faking a pass before shooting short-side past Kahkonen's blocker from inside the left face-off dot. It was Garland's first goal since Feb. 24 (20 games).
"Anytime you can get balanced scoring or scoring from other ways -- because our power play wasn't very good tonight (0-for-7) -- those are things that you find a way, that you haven't done in a while," Boudreau said. "It was good to see."
Nick Bonino tied it 2-2 at 18:37 by deflecting a Brent Burns point shot in the high slot past a screened Demko for his third goal in the past four games. But the Sharks fell behind again early in the third.
"[Frustration] is high," forward Logan Couture said. "It's not fun. We've got to find a way out of it. We can't just be okay with being in games. We got to find a way to win some hockey games. You've got to learn to win in this league."
Demko made nine saves in the third period to become the first Canucks goalie since Roberto Luongo in 2011-12 to win 30 games in a season.
"It wasn't a Picasso," Boudreau said. "We didn't play our best game, but we sort of grinded it out. Found a way and got great goaltending."
NOTES: Each team dressed 11 forwards and seven defensemen. San Jose defenseman Radim Simek played 7:38 in his first appearance in 16 games, splitting time between forward and defense. Canucks defenseman Brad Hunt played 7:09, skating as a forward at even strength but playing the point on the second power-play unit. … Canucks forward Tanner Pearson missed the game with an undisclosed injury sustained in a 5-1 win at the Arizona Coyotes on Thursday, but Boudreau said he is expected to skate on Sunday and is day to day. … Canucks defenseman Quinn Hughes had two shots in 25:26 after missing two games with an illness. … San Jose forward Timo Meier had an assist and has 12 points (six goals, six assists) in the past 10 games.