הדפסה
/**
 * כתובת למסמך גוגל לדוח, אמור להיות העתק של
 * 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);
  }
}