public void PopulateNewWorksheet(OAuth2ClientCredentials clientCredentials, string refreshToken, string spreadsheetTitle, TypesByMarketGroup[] typesByMarketGroups, MarketStatTypesBySolarSystem[] marketStatTypes)
        {
            IUnityContainer unityContainer = UnityContainerFactory.GetUnityContainer();
            IGoogleSpreadsheetAccessor googleSpreadsheetAccessor = unityContainer.Resolve<IGoogleSpreadsheetAccessor>();
            string worksheetTitle = DateTime.Now.ToString();

            IEnumerable<invType> types = typesByMarketGroups.SelectMany(t => t.Types);

            // row for headers + row for each type, plus row for each market group
            int rowCount = types.Count() + typesByMarketGroups.Count() + 1;
            // name column plus buy & sell stats for each system
            int columnCount = 1 + (6 * marketStatTypes.Length);
            ListEntry.Custom[,] listEntries = new ListEntry.Custom[rowCount, columnCount];

            // populate header row
            listEntries[0, 0] = new ListEntry.Custom() { LocalName = "Name" };
            PopulateRow(marketStatTypes, listEntries, 0, null);

            int marketGroupRowIndex = 1;
            foreach (var typesByMarketGroup in typesByMarketGroups)
            {
                listEntries[marketGroupRowIndex, 0] = new ListEntry.Custom() { LocalName = "Name", Value = typesByMarketGroup.MarketGroup.marketGroupName };
                for (int typeCounter = 0; typeCounter < typesByMarketGroup.Types.Count(); typeCounter++)
                {
                    int rowIndex = typeCounter + marketGroupRowIndex + 1;
                    invType invType = typesByMarketGroup.Types.ElementAt(typeCounter);
                    listEntries[rowIndex, 0] = new ListEntry.Custom() { LocalName = "Name", Value = invType.typeName };

                    PopulateRow(marketStatTypes, listEntries, rowIndex, invType);
                }
                marketGroupRowIndex += typesByMarketGroup.Types.Count() + 1;
            }
            googleSpreadsheetAccessor.PopulateNewWorksheet(clientCredentials, refreshToken, spreadsheetTitle, worksheetTitle, listEntries);
        }