This is the working solution I came up with:
private static decimal coreGetAdwordsSumInRange(DateTime start, DateTime end)
{
var reportDefinition =
new ReportDefinition
{
reportName = string.Format(@"Campaign performance report #{0}", DateTime.Now.Ticks),
dateRangeType = ReportDefinitionDateRangeType.CUSTOM_DATE,
reportType = ReportDefinitionReportType.CAMPAIGN_PERFORMANCE_REPORT,
downloadFormat = DownloadFormat.XML,
includeZeroImpressions = false,
selector = new Selector
{
fields = new[] { @"Cost" },
dateRange = new DateRange {min = start.ToString(@"yyyyMMdd"), max = end.ToString(@"yyyyMMdd")}
}
};
// --
var sum = decimal.Zero;
var tempFilePath = Path.Combine(Path.GetTempPath(), Guid.NewGuid() + @".xml");
try
{
var utils = new ReportUtilities(new AdWordsUser()) { ReportVersion = @"v201309" };
utils.DownloadClientReport(reportDefinition, true, tempFilePath);
var doc = new XmlDocument();
doc.Load(tempFilePath);
var costNodes = doc.SelectNodes(@"/report/table/row/@cost");
if (costNodes != null)
{
foreach (XmlNode costNode in costNodes)
{
var cost = Convert.ToDecimal(costNode.InnerText);
sum += cost/1000000m;
}
}
}
finally
{
File.Delete(tempFilePath);
}
return sum;
}