/** * כתובת למסמך גוגל לדוח, אמור להיות העתק של * https://goo.gl/gr2UaG */ var SPREADSHEET_URL = 'SPREADSHEET_URL'; function main() { var spreadsheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL); var settings = readSettings(spreadsheet); var lastRun = getLastRunDate(spreadsheet); var today = new Date(); var resumingPreviousRun = (today.getYear() == lastRun.getYear() && today.getMonth() == lastRun.getMonth() && today.getDate() == lastRun.getDate()); var accountIterator = getAccountSelector(settings).get(); while (accountIterator.hasNext()) { var account = accountIterator.next(); ensureSheetExistsForAccount(account, spreadsheet); if (!resumingPreviousRun) { removeLinkCheckerLabels(account, settings); clearAccountSheet(account, spreadsheet); createLinkCheckerLabels(account, settings); } } saveLastRunDate(today, spreadsheet); accountSelector = getAccountSelector(settings); accountSelector.executeInParallel('processAccountInParallel', 'afterProcessCallback'); } function readSettings(spreadsheet) { var sheetName = 'Dashboard'; var dashboardSheet = spreadsheet.getSheetByName(sheetName); var settings = { 'checkKeywords': dashboardSheet.getRange(4, 3).getValue() == 'Yes', 'checkAds': dashboardSheet.getRange(5, 3).getValue() == 'Yes', 'checkSitelinks': dashboardSheet.getRange(6, 3).getValue() == 'Yes', 'keywordsLabel': dashboardSheet.getRange(7, 3).getValue(), 'adsLabel': dashboardSheet.getRange(8, 3).getValue(), 'sitelinksLabel': dashboardSheet.getRange(9, 3).getValue(), 'emailToAddresses': dashboardSheet.getRange(12, 3).getValue(), 'emailCCAddresses': dashboardSheet.getRange(13, 3).getValue(), 'accountsToCheck': dashboardSheet.getRange(16, 3).getValue() }; var accountsToCheck = settings.accountsToCheck.split(','); settings.accountsToCheck = []; for (var i = 0; i < accountsToCheck.length; i++) { var accountToCheck = accountsToCheck[i].trim(); if (accountToCheck.length > 0) { settings.accountsToCheck.push(accountToCheck); } } return settings; } function getLastRunDate(spreadsheet) { var summarySheet = getSummarySheet(spreadsheet); var lastRun = summarySheet.getRange(1, 2).getValue(); if (!lastRun) { lastRun = new Date(0, 0, 0); } return lastRun; } function getAccountSelector(settings) { var accountSelector = MccApp.accounts(); if (settings.accountsToCheck.length > 0) { accountSelector = accountSelector.withIds(settings.accountsToCheck); } return accountSelector; } function ensureSheetExistsForAccount(account, spreadsheet) { var accountSheet = getSheetForAccount(account, spreadsheet); if (accountSheet == null) { var templateSheet = spreadsheet.getSheetByName('Report template'); accountSheet = templateSheet.copyTo(spreadsheet); accountSheet.setName(account.getCustomerId()); spreadsheet.setActiveSheet(accountSheet); spreadsheet.moveActiveSheet(spreadsheet.getSheets().length); } accountSheet.getRange(2, 5).setValue(account.getCustomerId()); } function removeLinkCheckerLabels(account, settings) { var mccAccount = AdWordsApp.currentAccount(); MccApp.select(account); var labelNames = [settings.keywordsLabel, settings.adsLabel, settings.sitelinksLabel]; for (var i = 0; i < labelNames.length; i++) { var labelIterator = AdWordsApp.labels().withCondition("LabelName = '" + labelNames[i] + "'").get(); while (labelIterator.hasNext()) { var label = labelIterator.next(); label.remove(); } } MccApp.select(mccAccount); } function createLinkCheckerLabels(account, settings) { var mccAccount = AdWordsApp.currentAccount(); MccApp.select(account); var labelNames = [settings.keywordsLabel, settings.adsLabel, settings.sitelinksLabel]; for (var i = 0; i < labelNames.length; i++) { AdWordsApp.createLabel(labelNames[i], 'Created by link checker', '#ff0000'); var label = AdWordsApp.labels().withCondition("LabelName = '" + labelNames[i] + "'").get().next(); } MccApp.select(mccAccount); } function clearAccountSheet(account, spreadsheet) { var accountSheet = getSheetForAccount(account, spreadsheet); if (accountSheet.getMaxRows() > 4) { Logger.log('Deleting %s rows from 4', accountSheet.getMaxRows() - 4); accountSheet.deleteRows(4, accountSheet.getMaxRows() - 4); } if (accountSheet.getMaxRows() > 3) { accountSheet.getRange(4, 1, 1, 8).setValue(''); } } function getSummarySheet(spreadsheet) { return spreadsheet.getSheetByName('Dashboard'); } function saveLastRunDate(lastRun, spreadsheet) { var summarySheet = getSummarySheet(spreadsheet); summarySheet.getRange(1, 2).setValue(lastRun); } function processAccountInParallel() { var spreadsheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL); var settings = readSettings(spreadsheet); var account = AdWordsApp.currentAccount(); var accountSheet = getSheetForAccount(account, spreadsheet); checkFinalUrls(accountSheet, settings); } function getSheetForAccount(account, spreadsheet) { return spreadsheet.getSheetByName(account.getCustomerId().toString()); } function checkFinalUrls(accountSheet, settings) { var urlMap = {}; if (settings.checkKeywords) { var keywords = AdWordsApp.keywords() .withCondition("FinalUrls STARTS_WITH_IGNORE_CASE 'h'") .withCondition("LabelNames CONTAINS_NONE['" + settings.keywordsLabel + "']") .withCondition("LabelNames CONTAINS_ANY ['u2-test']") .get(); Logger.log('Checking %s keywords.', keywords.totalNumEntities()); while (keywords.hasNext()) { var keyword = keywords.next(); var urls = [keyword.urls().getFinalUrl(), keyword.urls().getMobileFinalUrl()]; for (var i = 0; i < urls.length; i++) { if (urls[i] == null) { continue; } var lastUrl = encodeURI(urls[i]); if (lastUrl in urlMap) { continue; } urlMap[lastUrl] = true; var status = getUrlStatus(lastUrl); accountSheet.appendRow(['', lastUrl, status, keyword.getCampaign().getName(), keyword.getAdGroup().getName(), keyword.getText(), '', '']); } keyword.applyLabel(settings.keywordsLabel); } } if (settings.checkAds) { var ads = AdWordsApp.ads() .withCondition("CreativeFinalUrls STARTS_WITH_IGNORE_CASE 'h'") .withCondition("LabelNames CONTAINS_NONE['" + settings.adsLabel + "']") .withCondition("LabelNames CONTAINS_ANY ['u2-test']") .get(); Logger.log('Checking %s ads.', ads.totalNumEntities()); while (ads.hasNext()) { var ad = ads.next(); var urls = [ad.urls().getFinalUrl(), ad.urls().getMobileFinalUrl()]; for (var i = 0; i < urls.length; i++) { if (urls[i] == null) { continue; } var lastUrl = encodeURI(urls[i]); if (lastUrl in urlMap) { continue; } urlMap[lastUrl] = true; var status = getUrlStatus(lastUrl); accountSheet.appendRow(['', lastUrl, status, ad.getCampaign().getName(), ad.getAdGroup().getName(), '', ad.getHeadline(), '']); } ad.applyLabel(settings.adsLabel); } } if (settings.checkSitelinks) { var campaigns = AdWordsApp.campaigns() .withCondition("LabelNames CONTAINS_NONE['" + settings.sitelinksLabel + "']") .withCondition("LabelNames CONTAINS_ANY ['u2-test']") .get(); while (campaigns.hasNext()) { var campaign = campaigns.next(); var sitelinks = campaign.extensions().sitelinks().get(); Logger.log('Checking %s sitelinks.', sitelinks.totalNumEntities()); while (sitelinks.hasNext()) { var sitelink = sitelinks.next(); var urls = [sitelink.urls().getFinalUrl(), sitelink.urls().getMobileFinalUrl()]; for (var i = 0; i < urls.length; i++) { if (urls[i] == null) { continue; } var lastUrl = encodeURI(urls[i]); if (lastUrl in urlMap) { continue; } urlMap[lastUrl] = true; var status = getUrlStatus(lastUrl); accountSheet.appendRow(['', lastUrl, status, campaign.getName(), '', '', '', sitelink.getLinkText()]); } } campaign.applyLabel(settings.sitelinksLabel); } } } function getUrlStatus(url) { var response = UrlFetchApp.fetch(url, { muteHttpExceptions: true}); return response.getResponseCode(); } function afterProcessCallback() { var spreadsheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL); var settings = readSettings(spreadsheet); clearSummarySheet(spreadsheet); updateCheckedUrlSummary(spreadsheet); sendEmails(settings); } function sendEmails(settings) { if (settings.emailToAddresses != '') { var options = {}; if (settings.emailCCAddresses != '') { options['cc'] = settings.emailCCAddresses; } MailApp.sendEmail(settings.emailToAddresses, 'MCC Link Checker Script', 'MCC Link Checker Script ran successfully. See ' + SPREADSHEET_URL + ' for details of checked urls.', options); } } function clearSummarySheet(spreadsheet) { var summarySheet = getSummarySheet(spreadsheet); // Delete all the rows > 20. if (summarySheet.getMaxRows() > 20) { summarySheet.deleteRows(20, summarySheet.getMaxRows() - 20); } // Clear row 20. if (summarySheet.getMaxRows() > 20) { summarySheet.getRange(20, 1, 1, 3).setValue(''); } } function updateCheckedUrlSummary(spreadsheet) { var settings = readSettings(spreadsheet); var accountSelector = getAccountSelector(settings).get(); var totalAccounts = accountSelector.totalNumEntities(); var summarySheet = getSummarySheet(spreadsheet); while (accountSelector.hasNext()) { var account = accountSelector.next(); var sheet = getSheetForAccount(account, spreadsheet); var urlRange = sheet.getRange(4, 3, sheet.getMaxRows() - 3, 1).getValues(); var goodUrls = 0; var badUrls = 0; for (var i = 0; i < urlRange.length; i++) { for (var j = 0; j < urlRange[i].length; j++) { if (!urlRange[i][j]) { continue; } if (parseInt(urlRange[i][j]) < 300) { goodUrls++; } else { badUrls++; } } } summarySheet.appendRow(['', account.getCustomerId(), goodUrls, badUrls]); account.getCustomerId(), goodUrls, badUrls); } }