Also, with this post, I will start versioning all of my scripts so that you can be sure you always have the latest version.
Thanks,
Russ
//----------------------------------- // Store Keyword Performance Report in Amazon S3 // Created By: Russ Savage // Version: 1.0 // FreeAdWordsScripts.com //----------------------------------- var ACCESS_KEY = 'YOUR_ACCESS_KEY_HERE'; var SECRET_KEY = 'YOUR_SECRET_KEY_HERE'; var S3_BUCKET = 'YOUR_S3_BUCKET_NAME_HERE'; function main() { var date_str = Utilities.formatDate(new Date(),AdWordsApp.currentAccount().getTimeZone(),'yyyy-MM-dd'); var file_name = 'adwords_keyword_perf_'+AdWordsApp.currentAccount().getCustomerId() + '_' + date_str+'.csv'; putDataToBucket(S3_BUCKET,'/'+file_name,getKeywordPerformanceReport()); } function putDataToBucket(bucket,file_path,data) { var auth_options = { method : 'PUT', base_url : "http://" + bucket + ".s3.amazonaws.com", s3_bucket : bucket, path : file_path, headers : { "Date" : getDate(), "Content-Type" : "application/x-www-form-urlencoded" }, }; var auth_string = generateAuthString(auth_options); auth_options.headers["Authorization"] = auth_string; var options = { method : auth_options.method, headers : auth_options.headers, payload : data }; return (UrlFetchApp.fetch(auth_options.base_url+auth_options.path, options).getResponseCode() == 200); } function generateAuthString(url) { var string_to_sign = getStringToSign(url); Logger.log(string_to_sign); var signature = getSignature(SECRET_KEY,string_to_sign); return "AWS" + " " + ACCESS_KEY + ":" + signature; } function getSignature(SECRET_KEY,string_to_sign) { return Utilities.base64Encode( Utilities.computeHmacSignature( Utilities.MacAlgorithm.HMAC_SHA_1, string_to_sign, SECRET_KEY, Utilities.Charset.UTF_8 ) ); } function getStringToSign(url,params) { var method = url.method; var date = url.headers.Date; return method + "\n" + "\n" + url.headers['Content-Type'] + "\n" + date + "\n" + getCanonicalizedAmzHeaders(url); } function getCanonicalizedAmzHeaders(url) { var ret_val = "/" + url.s3_bucket; ret_val += url.path; return ret_val; } function getDate() { return Utilities.formatDate(new Date(),"GMT", "EEE, dd MMM yyyy HH:mm:ss +0000"); } function getKeywordPerformanceReport() { var date_range = 'LAST_7_DAYS'; var columns = ['Date', 'CampaignName', 'CampaignStatus', 'AdGroupName', 'AdGroupStatus', 'IsNegative', 'Id', 'KeywordMatchType', 'KeywordText', 'DestinationUrl', 'FirstPageCpc', 'MaxCpc', 'MaxCpm', 'PercentCpa', 'ClickType', 'Device', 'Slot', 'CpcBidSource', 'AverageCpc', 'AverageCpm', 'AveragePosition', 'PreferredPosition', 'QualityScore', 'Clicks', 'ConversionRate', 'ConversionRateManyPerClick', 'Conversions', 'ConversionsManyPerClick', 'ConversionValue', 'Cost', 'CostPerConversion', 'CostPerConversionManyPerClick', 'Ctr', 'Impressions', 'Cost', 'ValuePerConversion', 'ValuePerConversionManyPerClick', 'ViewThroughConversions']; var columns_str = columns.join(',') + " "; var report_iter = AdWordsApp.report( 'SELECT ' + columns_str + 'FROM KEYWORDS_PERFORMANCE_REPORT ' + 'DURING ' + date_range, { includeZeroImpressions: false, apiVersion: 'v201302' }).rows(); var ret_data = '"' + columns.join('","') + '"\n'; while(report_iter.hasNext()) { var row = report_iter.next(); var row_array = []; for(var i in columns) { row_array.push(row[columns[i]]); } ret_data += '"' + row_array.join('","') + '"\n'; } return ret_data; }