Skip to content

Instantly share code, notes, and snippets.

@postman31
Last active January 14, 2022 06:17
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save postman31/9a98df3313b4040fcf2a2707b12683de to your computer and use it in GitHub Desktop.
Save postman31/9a98df3313b4040fcf2a2707b12683de to your computer and use it in GitHub Desktop.
The script checks for adgroups and campaigns with no particular extensions
//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