Here's a grocery planning spreadsheet I use to reduce the amount of items I have to shop for each week. Use it as it is or modify it however you like. If you're interested in how some of the features I implemented work, continue reading after the instructions.
Use this spreadsheet (make a copy):
Although I won't be using it for now (due to a lack of meal suggestions and dietary restrictions), I've since seen Plan To Eat (and websites like it) which is a great application to use instead of this spreadsheet since it's cheap, feature-rich and parses recipes automatically. With that said, some of the features I created are applicable elsewhere so carry on reading to see how I created the image results and kept document performance up.
How It Works
I haven't explained every element here since you can examine the templates above and read about conditional formatting, queries, filters, arrays, etc anywhere online, just the custom features I implemented myself.
When I made this planner I wanted images to make it more enjoyable to look at, however with some recipes coming from books or unparsable web pages that wasn't always possible. I needed a multi-pronged approach:
Ordinarily, the built-in IMAGE() function is all that is needed to display images however it doesn't come with a sizing mode that fits the image to the cell width while maintaining its aspect ratio. To fix this, I modified ImgApp to find dimensions from URLs of images and maintained aspect ratios by dividing the width of the image by the width of the cell (found with the CELL() function). This gives me a size factor I can divide the image height by to scale it down. It is also possible to use a custom function to find the exact cell width in pixels (view it on github).
With the potential to have a lot of imports and custom functions running, document performance was likely to suffer and results could take too long to load. I knew that the data from the imports and functions isn't likely to change so I avoided recalculating them unnecessarily using my StoreValue add-on to cache image URLs and dimensions in the document. It works like so:
If there is a value stored under "foo" then it will be returned, otherwise (if there is an error), "bar" will stored and then returned. With a lot of recipes, using this for every image dimension and URL takes at least a few seconds off the loading time.