This Do It proves that numeric and text keyed dictionary entries are separate.
You use numbers from a For Each Number loop as keys.
If you wanted speed, you would use JavaScript to run the evolution and display SVG in a WebViewer, and you would use the Canvas only to input cell row and column numbers (not pixels).
In your redesign, store only i,j pairs independent of the display size information, where i and j are signed integers on the infinite plane centered at 0,0
The neighbors of 0,0 are
-1,1
0,1
1,1
-1,0
1,0
-1,-1
0,-1
1,-1
Why negative numbers too? Because glider guns can be made to shoot in any direction.
This design decision is called Separation of Concerns.
These csv pairs make good text keys in a dictionary with true/false values.
Advanced list blocks can be used to get min and max ranges of i and j in a single pass over the list of dictionary keys.
Leave it to the display code to fit the i and j ranges to the Canvas Height and Width.
Interested by this approach of using drawPoint to draw squares, introduced by @fbeleznay, I had a play around with making a grid on a canvas, just using drawPoint, then took this a bit further to be able to change the colour of individual "tiles", and save these to a tinydb, for persistent recovery.
I used a canvas sized 320x320 for my example, but the blocks for drawing the grid will allow for just about any height and width dimensions of the canvas, the floor function is used which will mean that the grid is always completely inside the canvas. I set the gridSize to 32 pixels, this generates a 10x10 grid on the canvas. The linewidth is set to 2 pixels less than the gridSize, which then creates the "lines" around each tile. The canvas is placed in a vertical arrangement which provides the background (lines) colour and the outline borders.
When a user clicks on a tile in the grid, the colour is changed to red, clicking again reverts it to black. Red tiles are saved to a list in the tinydb, and are restored if the app (screen) is refreshed or restarted. Alternatively, you could iterate over every tile, and store each of the coordinates and its colour in a list for the entire grid.
The beauty of this approach is that you only need to set the linewidth and have one set of coordinates (x/y) to draw a square.
I am not sure if this is helpful or not, and I do not quite understand what I am writing, but I also had similar error messages. I do not quite remember what really happened, but it had something to do with how data is stored in dictionaries. I had to introduce some json decoding when I was reading back a list from a dictionary. I attach a screenshot of part of my code.