Last active
January 14, 2022 06:17
-
-
Save postman31/9a98df3313b4040fcf2a2707b12683de to your computer and use it in GitHub Desktop.
The script checks for adgroups and campaigns with no particular extensions
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//Options setcion | |
var OPTIONS = { | |
'REPORT_URL': '', // url of existing report sheet. leave empty string to create new report when script runs | |
'LOOKBACK': '', // optional lookback for items selectors that picks non removed items in loookback period. Defolts to 'LAST_7_DAYS' | |
'EXTENSIONS': ['sitelinks', 'callouts', 'snippets'], // list of extnesions to check. Defaults to ['sitelinks', 'callouts', 'snippets', 'phoneNumbers'] | |
'FORCE_CHECK': true // If true will report if adgroup doesn't contain particular extension but it's available at campaign level. Defaults to false | |
} | |
function getOptions () { | |
var options = {} | |
if (OPTIONS.REPORT_URL) { | |
try { | |
var spreadsheet = SpreadsheetApp.openByUrl(OPTIONS.REPORT_URL) | |
} catch (e) { | |
Logger.log('Cannot open specified URL %s, will create new spresdsheet', OPTIONS.REPORT_URL) | |
var spreadsheet = SpreadsheetApp.create('AdWords Extensions Check') | |
Logger.log('New spreadsheet created %s', spreadsheet.getUrl()) | |
} | |
} else { | |
var spreadsheet = SpreadsheetApp.create('AdWords Extensions Check') | |
Logger.log('New spreadsheet created %s', spreadsheet.getUrl()) | |
spreadsheet.getSheets()[0].setName('Extensions check') | |
} | |
var sheets = spreadsheet.getSheets() | |
var sheetNames = sheets.reduce(function (list, sheet) { | |
list.push(sheet.getName()) | |
return list | |
}, []) | |
if (sheetNames.indexOf('Extensions check') == -1) { | |
options.extensionsSheet = spreadsheet.insertSheet('Extensions check') | |
} else { | |
options.extensionsSheet = spreadsheet.getSheetByName('Extensions check') | |
} | |
options.lookback = OPTIONS.LOOKBACK || 'LAST_7_DAYS' | |
options.extensionsList = OPTIONS.EXTENSIONS || ['sitelinks', 'callouts', 'snippets', 'phoneNumbers'] | |
options.getReportURL = function () { | |
return spreadsheet.getUrl() | |
} | |
options.forceCheck = OPTIONS.FORCE_CHECK || false | |
return options | |
} | |
function checkExtensions (options) { | |
var campaigns = AdWordsApp.campaigns() | |
.withIds(getSearchCampaignsIds(options)) | |
.get() | |
if (!campaigns.totalNumEntities()) { | |
Logger.log('No applicable campaigns found') | |
return | |
} else { | |
var checkItems = options.extensionsList | |
var sheet = options.extensionsSheet.clear().appendRow('Account,Campaign,AdGroup,Extension Status'.split(',')) | |
var rows = [] | |
while (campaigns.hasNext()) { | |
var campaign = campaigns.next() | |
var campaignLevelExtensions = {} | |
for (var i = 0; i < checkItems.length; i++) { | |
campaignLevelExtensions[checkItems[i]] = campaign.extensions()[checkItems[i]]().get().totalNumEntities() | |
if (campaignLevelExtensions[checkItems[i]] == 0 ) { | |
// Logger.log('no campaign level %s campaign %s', checkItems[i], campaign.getName()) | |
} | |
} | |
var adGroups = campaign.adGroups() | |
.forDateRange(options.lookback) | |
.withCondition("Impressions > 0") | |
.withCondition("Status != REMOVED") | |
.get() | |
var adgroupLevelExtensions = {} | |
while (adGroups.hasNext()) { | |
var adgroup = adGroups.next() | |
var adgroupRow = [AdWordsApp.currentAccount().getName(), campaign.getName(), adgroup.getName()] | |
for (var k = 0; k < checkItems.length; k++) { | |
var numOfExtensions = adgroup.extensions()[checkItems[k]]().get().totalNumEntities() | |
if (options.forceCheck) { | |
if (numOfExtensions == 0) { | |
rows.push(adgroupRow.concat(['No ' + checkItems[k] + ', ' + campaignLevelExtensions[checkItems[k]] + ' at campaign level'])) | |
} | |
} | |
else { | |
if (numOfExtensions == 0 && campaignLevelExtensions[checkItems[k] == 0]) { | |
rows.push(adgroupRow.concat(['No ' + checkItems[k] + ' at campaign and adgroup level'])) | |
} | |
} | |
adgroupLevelExtensions[checkItems[k]] = 0 || adgroupLevelExtensions[checkItems[k]] | |
adgroupLevelExtensions[checkItems[k]] += numOfExtensions | |
} | |
} | |
// Process campaign summary | |
var campaignRow = [AdWordsApp.currentAccount().getName(), campaign.getName(), 'Campaign Level'] | |
for (var i = 0; i < checkItems.length; i++) { | |
if (campaignLevelExtensions[checkItems[i]] + adgroupLevelExtensions[checkItems[i]]== 0) { | |
rows.push(campaignRow.concat(['No ' + checkItems[i] + ' at campaign and in any its group' ])) | |
} | |
} | |
} | |
sheet.getRange(2,1,rows.length, 4).setValues(rows) | |
Logger.log('check results in %s', options.getReportURL()) | |
} | |
} | |
function getSearchCampaignsIds(options) { | |
var report = AdWordsApp.report( | |
"SELECT CampaignId, CampaignName, AdvertisingChannelType, Impressions " + | |
"FROM CAMPAIGN_PERFORMANCE_REPORT " + | |
"WHERE Impressions > 0 " + | |
"AND AdvertisingChannelType = 'SEARCH' " + | |
"DURING " + options.lookback); | |
var rows = report.rows() | |
var res = [] | |
while (rows.hasNext()) { | |
var row = rows.next() | |
res.push(row.CampaignId) | |
} | |
return res | |
} | |
function main() { | |
var options = getOptions() | |
checkExtensions(options) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment