+ var spreadsheetUrl = "";
+ var spreadsheetName = "KW Ad Data";
+ var accountManagers = "example@example.com";
+ var overWriteOldData = 1;
+ var sheetNames = ["data"];
+ var destinationSpreadsheet = setUpReportInGoogleSheets(spreadsheetUrl, spreadsheetName, accountManagers, overWriteOldData, sheetNames);
+ var spreadsheet = destinationSpreadsheet.spreadsheet;
+ var isSpreadsheetNew = destinationSpreadsheet.isNew;
+ var spreadsheetUrl = destinationSpreadsheet.url;
+ var keywordIdMap = buildKeywordIdMap();
+ var adGroupMap = buildAdGroupMap();
+ var spreadsheetOutput = new Array();
+ spreadsheet.appendRow(["keywordText", "keywordMatchType", "campaignName", "adGroupName", "headline", "description1", "description2", "displayUrl", "devicePreference", "clicks", "impressions", "ctr", "qualityScore", "creativeQualityScore", "postClickQualityScore", "searchPredictedCtr" ]);
+ for(var uniqueId in adGroupMap) {
+ var spreadsheetLine = new Array();
+ var adGroup = adGroupMap[uniqueId];
+ var campaignName = adGroup.campaignName;
+ var adGroupName = adGroup.adGroupName;
+ for(var adId in adGroup.ads) {
+ var ad = adGroup.ads[adId];
+ var headline = ad.headline;
+ var description1 = ad.description1;
+ var description2 = ad.description2;
+ var devicePreference = ad.devicePreference;
+ var displayUrl = ad.displayUrl;
+ for(var keywordId in ad.keywords) {
+ var keyword = ad.keywords[keywordId];
+ var clicks = keyword.clicks;
+ var impressions = keyword.impressions;
+ var keywordText = keywordIdMap[keywordId].keywordText;
+ var keywordMatchType = keywordIdMap[keywordId].keywordMatchType;
+ var qualityScore = keywordIdMap[keywordId].qualityScore;
+ var creativeQualityScore = keywordIdMap[keywordId].creativeQualityScore;
+ var postClickQualityScore = keywordIdMap[keywordId].postClickQualityScore;
+ var searchPredictedCtr = keywordIdMap[keywordId].searchPredictedCtr;
+ if(keywordText[0] == "+") keywordText = "'" + keywordText;
+ var keywordText = "N/A";
+ var keywordMatchType = "N/A";
+ var qualityScore = "--";
+ var creativeQualityScore = "--";
+ var postClickQualityScore = "--";
+ var searchPredictedCtr = "--";
+function buildAdGroupMap() {
+ var adGroupMap = new Array();
+ var report = AdWordsApp.report(
+ 'SELECT Id, CampaignName, AdGroupName, KeywordId, DevicePreference, Headline, Description1, Description2, DisplayUrl, Clicks, Impressions, Ctr ' +
+ 'FROM AD_PERFORMANCE_REPORT ' +
+ 'WHERE Impressions > 10 ' +
+ 'AND AdType = "TEXT_AD" ' +
+ 'DURING LAST_30_DAYS');
+ var rows = report.rows();
+ while (rows.hasNext()) {
+ var campaignName = row['CampaignName'];
+ var adGroupName = row['AdGroupName'];
+ var keywordId = row['KeywordId'];
+ var devicePreference = row['DevicePreference'];
+ var uniqueId = campaignName + " " + adGroupName;
+ if(!adGroupMap[uniqueId]) {
+ adGroupMap[uniqueId] = new Object();
+ adGroupMap[uniqueId].ads = new Array();
+ adGroupMap[uniqueId].campaignName = campaignName;
+ adGroupMap[uniqueId].adGroupName = adGroupName;
+ if(!adGroupMap[uniqueId].ads[adId]){
+ adGroupMap[uniqueId].ads[adId] = new Object();
+ adGroupMap[uniqueId].ads[adId].devicePreference = devicePreference;
+ adGroupMap[uniqueId].ads[adId].keywords = new Array();
+ if(!adGroupMap[uniqueId].ads[adId].keywords[keywordId]) {
+ adGroupMap[uniqueId].ads[adId].keywords[keywordId] = new Object();
+ adGroupMap[uniqueId].ads[adId].headline = row['Headline'];
+ adGroupMap[uniqueId].ads[adId].description1 = row['Description1'];
+ adGroupMap[uniqueId].ads[adId].description2 = row['Description2'];
+ adGroupMap[uniqueId].ads[adId].displayUrl = row['DisplayUrl'];
+ adGroupMap[uniqueId].ads[adId].keywords[keywordId].keywordId = keywordId;
+ adGroupMap[uniqueId].ads[adId].keywords[keywordId].clicks = row['Clicks'];
+ adGroupMap[uniqueId].ads[adId].keywords[keywordId].impressions = row['Impressions'];
+ adGroupMap[uniqueId].ads[adId].keywords[keywordId].ctr = row['Ctr'];
+ Logger.log("Ad Group Map Done");
+function buildKeywordIdMap() {
+ var keywordIdMap = new Array();
+ var report = AdWordsApp.report(
+ 'SELECT Id, KeywordMatchType, Criteria, CreativeQualityScore, PostClickQualityScore, SearchPredictedCtr, QualityScore ' +
+ 'FROM KEYWORDS_PERFORMANCE_REPORT '+
+ 'WHERE Impressions > 0 ' +
+ var rows = report.rows();
+ while (rows.hasNext()) {
+ keywordText = row['Criteria'];
+ keywordMatchType = row['KeywordMatchType'];
+ if(!keywordIdMap[keywordId]) {
+ keywordIdMap[keywordId] = new Object();
+ keywordIdMap[keywordId].keywordText = keywordText;
+ keywordIdMap[keywordId].keywordMatchType = keywordMatchType;
+ keywordIdMap[keywordId].qualityScore = row['QualityScore'];
+ keywordIdMap[keywordId].postClickQualityScore = row['PostClickQualityScore'];
+ keywordIdMap[keywordId].searchPredictedCtr = row['SearchPredictedCtr'];
+ keywordIdMap[keywordId].creativeQualityScore = row['CreativeQualityScore'];
+ //Logger.log("keywordId: " + keywordId + " keywordText: " + keywordText + " keywordMatchType: " + keywordMatchType);
+ Logger.log("KW ID Map Done");
+ function setUpReportInGoogleSheets(spreadsheetUrl, spreadsheetName, accountManagers, overWriteOldData, sheetNames) {
+ var destinationSpreadsheet = new Object();
+ destinationSpreadsheet.overWrite = overWriteOldData;
+ if(!spreadsheetUrl || spreadsheetUrl == "" || spreadsheetUrl == " " || spreadsheetUrl.toLowerCase().indexOf("new") != -1) var isNew = 1;
+ destinationSpreadsheet.isNew = isNew;
+ if(!sheetNames || !sheetNames[0]) {
+ var sheetNames = new Array();
+ sheetNames[0] = "Sheet 1";
+ var spreadsheet = SpreadsheetApp.create(spreadsheetName);
+ var spreadsheetUrl = spreadsheet.getUrl();
+ var spreadsheet = SpreadsheetApp.openByUrl(spreadsheetUrl);
+ destinationSpreadsheet.spreadsheet = spreadsheet;
+ destinationSpreadsheet.url = spreadsheet.getUrl();
+ // IF NEW -> REMOVE ALL SHEETS, THEN CREATE ALL SHEETS
+ var allSheets = spreadsheet.getSheets();
+ for(var i=1,len=allSheets.length;i<len;i++){
+ spreadsheet.deleteSheet(allSheets[i]);
+ allSheets[0].setName(sheetNames[0]);
+ for(var sheetCounter = 1; sheetCounter < sheetNames.length; sheetCounter++) {
+ var sheetName = sheetNames[sheetCounter];
+ if(DEBUG == 1) Logger.log("sheet name: " + sheetName);
+ spreadsheet.insertSheet(sheetName);
+ // IF NOT NEW, MAKE SURE RIGHT SHEETS EXIST
+ for(var sheetCounter = 0; sheetCounter < sheetNames.length; sheetCounter++) {
+ var sheetName = sheetNames[sheetCounter];
+ if(DEBUG == 1) Logger.log("checking if sheet with name exists: " + sheetName);
+ var thisSheet = spreadsheet.getSheetByName(sheetName);
+ if(!thisSheet) spreadsheet.insertSheet(sheetName);
+ // ADD ACCOUNT MANAGERS
+ if(accountManagers && accountManagers!=""){
+ var accountManagersArray = accountManagers.replace(/\s/g, "").split(",");
+ spreadsheet.addEditors(accountManagersArray);
+ // IF OVERWRITE, CLEAR SHEETS
+ for(var sheetCounter = 0; sheetCounter < sheetNames.length; sheetCounter++) {
+ var sheetName = sheetNames[sheetCounter];
+ if(DEBUG == 1) Logger.log("sheet name: " + sheetName);
+ var thisSheet = spreadsheet.getSheetByName(sheetName);
+ if(thisSheet) thisSheet.clear();
+ return(destinationSpreadsheet);