/// <summary>
        /// Retrieves a report, using a filter for a specified saved report.
        /// </summary>
        /// <param name="savedReportId">The ID of the saved report to generate.</param>
        private void GenerateSavedReport(string savedReportId)
        {
            Console.WriteLine("=================================================================");
            Console.WriteLine("Running saved report {0}", savedReportId);
            Console.WriteLine("=================================================================");

            var savedReportRequest = service.Accounts.Reports.Saved.Generate(adSenseAccount.Id, savedReportId);
            AdsenseReportsGenerateResponse savedReportResponse = savedReportRequest.Execute();

            // Run report.
            if (!savedReportResponse.Rows.IsNullOrEmpty())
            {
                ReportUtils.DisplayHeaders(savedReportResponse.Headers);
                ReportUtils.DisplayRows(savedReportResponse.Rows);
            }
            else
            {
                Console.WriteLine("No rows returned.");
            }

            Console.WriteLine();
        }
        /// <summary>
        /// Fetched reports from the API can have chronological gaps. For example, days with no logged activity are
        /// not shown at all. This method fills day and month gaps and sets the values to "N/A". It doesn't fill
        /// "WEEK" dimension.
        /// </summary>
        /// <param name="reportResponse">The object containing the report data.</param>
        /// <returns>The full report.</returns>
        public static void FillGapsDates(
            AdsenseReportsGenerateResponse reportResponse, DateTime fromDate, DateTime toDate)
        {
            if (!reportResponse.Rows.IsNullOrEmpty())
            {
                return;
            }

            var enumeratedHeaders = reportResponse.Headers.Select((n, i) => new { header = n, index = i });


            var firstDateHeader = enumeratedHeaders.FirstOrDefault(x => x.header.Name == "DATE");
            int dateIndex       = firstDateHeader != null ? firstDateHeader.index : -1;

            var firstMonthHeader = enumeratedHeaders.FirstOrDefault(x => x.header.Name == "MONTH");
            int monthIndex       = firstMonthHeader != null ? firstMonthHeader.index : -1;

            if (dateIndex == -1 && monthIndex == -1)
            {
                return;
            }

            if (reportResponse.Rows == null)
            {
                reportResponse.Rows = new List <IList <string> >();
            }

            // Start date (day) filling.
            if (dateIndex != -1)
            {
                for (DateTime date = fromDate; date.Date <= toDate.Date; date = date.AddDays(1))
                {
                    if (reportResponse.Rows.Any(x => x[dateIndex] == date.ToString(DATEPATTERN)))
                    {
                        continue;
                    }

                    List <string> emptyRow = Enumerable.Repeat("N/A", reportResponse.Headers.Count()).ToList <string>();
                    emptyRow[dateIndex] = date.ToString(DATEPATTERN);

                    // If the result has both days and months, add the month early.
                    if (monthIndex != -1)
                    {
                        emptyRow[monthIndex] = date.ToString(MONTHPATTERN);
                    }

                    reportResponse.Rows.Add(emptyRow);
                }
            }

            // Start month filling.
            if (monthIndex != -1)
            {
                for (DateTime date = fromDate; date.Date <= toDate.Date; date = date.AddMonths(1))
                {
                    // Don't modify rows already in the response.
                    if (reportResponse.Rows.Any(x => x[monthIndex] == date.ToString(MONTHPATTERN)))
                    {
                        continue;
                    }

                    List <string> emptyRow = Enumerable.Repeat("N/A", reportResponse.Headers.Count()).ToList <string>();
                    emptyRow[monthIndex] = date.ToString(MONTHPATTERN);
                    reportResponse.Rows.Add(emptyRow);
                }
            }
        }