You don't have to set them all "by hand". A heightmap can come from various sources, but the most common one is an image, and there is a way to pass image data to the shape.
To work with this shape, your image must be in the FORMAT_RF
format (32-bit float precision, single channel). If your image is 8-bit, this won't work well, because colors can only have 255 values are are quantified between 0 and 1, while heights can be somewhere between -500 to 500 for example.
I think there isn't a built-in tool yet to set it up in the editor (only plugins), but here is a script example:
var heightmap = Image.new()
# Load EXR file, one of the formats Godot can handle.
heightmap.load("file.exr")
# Godot's EXR loader still doesn't load properly single-channel images,
# so you should make sure to convert it
heightmap.convert(Image.FORMAT_RF)
# Create the shape (if you don't have one already)
var shape = HeightMapShape.new()
# Assign size first, otherwise it won't work
shape.map_width = heightmap.get_width()
shape.map_height = heightmap.get_height()
# Assign the heights using the image's raw data.
# Because the format matches, this is straightforward
shape.map_data = heightmap.get_data()
# Now all is left to do is to assign the shape to your collision node.
This still needs to be improved, both in usability and efficiency (setting width and height allocates a whole heightmap for no reason since it gets set from the image anyways).