//Settings---------------------------------------------------------------------------------
//*****************************************************************************************
var mail = "mail@mail.cz";
var subject = "ERROR 404"; //automatically add the account name (ERROR 404 | Account name)
var account_id = "111-111-1111"; //if you have a script in your MCC account
/******************************************************************************************
Script:     Check url 404   
Version:    Adwords 05.03.2017
Created By: Stanislav Jilek [standajilek.cz]
/*****************************************************************************************/

function main() {
//Variables--------------------------------------------------------------------------------    
    var ads_url = [];
    var keywords_url = [];
    var sitelinks_url = [];
    var url = [];
    var url_404 = [];
    var stats_url = [];
    var count_200 = 0;
    var count_404 = 0;

//Mcc select-------------------------------------------------------------------------------  
    try
    {
        MccApp.select(MccApp.accounts().withIds([account_id]).get().next());
    } catch (error)
    {
    }

    var account_name = AdWordsApp.currentAccount().getName();
    var currency = AdWordsApp.currentAccount().getCurrencyCode()
    subject = subject + " | " + account_name;

//Final urls------------------------------------------------------------------------------- 
    //Ads  
    var ads = AdWordsApp.ads()
            .withCondition("CampaignStatus = ENABLED")
            .withCondition("AdGroupStatus = ENABLED")
            .withCondition("Status = ENABLED")
            .withCondition("CreativeFinalUrls != ''")
            .withCondition("Clicks>0")
            .forDateRange("YESTERDAY")
            .get();

    while (ads.hasNext())
    {
        var row = ads.next();
        ads_url.push(row.urls().getFinalUrl());
        stats_url.push([row.urls().getFinalUrl(), row.getStatsFor("YESTERDAY").getClicks(), row.getStatsFor("YESTERDAY").getCost()]);
    }

    //Keywords  
    var keywords = AdWordsApp.keywords()
            .withCondition("CampaignStatus = ENABLED")
            .withCondition("AdGroupStatus = ENABLED")
            .withCondition("Status = ENABLED")
            .withCondition("FinalUrls != ''")
            .withCondition("Clicks>0")
            .forDateRange("YESTERDAY")
            .get();

    while (keywords.hasNext())
    {
        var row = keywords.next();
        keywords_url.push(row.urls().getFinalUrl());
        stats_url.push([row.urls().getFinalUrl(), row.getStatsFor("YESTERDAY").getClicks(), row.getStatsFor("YESTERDAY").getCost()]);
    }

    //Sitelinks
    var sitelinks = AdWordsApp.extensions().sitelinks()
            .withCondition("Clicks>0")
            .forDateRange("YESTERDAY").get();

    while (sitelinks.hasNext())
    {
        var row = sitelinks.next();
        sitelinks_url.push(row.urls().getFinalUrl());
        stats_url.push([row.urls().getFinalUrl(), row.getStatsFor("YESTERDAY").getClicks(), row.getStatsFor("YESTERDAY").getCost()]);
    }

    //Connection urls
    url = url.concat(ads_url, keywords_url, sitelinks_url);

    if (url.length == 0) {
        MailApp.sendEmail({to: mail, subject: subject, htmlBody: "V jednom z vašich účtů, nebyl zaznamenán za včerejší den ani jeden proklik, je vše v pořádku?<br>Máte vše správně nastaveno?<br>Chybu hledejte v protokolu u skriptů na kontrolu url 404."});
        Logger.log("V tomto účtu nebyl zaznamenán za včerejší den ani jeden proklik, je vše v pořádku? Máte vše správně nastaveno?");
    }

//Remove duplicates------------------------------------------------------------------------
    var unique_url = url.filter(function (elem, index, self) {
        return index == self.indexOf(elem);
    });

//Test urls-------------------------------------------------------------------------------- 
    for (var i = 0; i < unique_url.length; i++)
    {
        try
        {
            var response_code = UrlFetchApp.fetch(unique_url[i], {muteHttpExceptions: true}).getResponseCode();

            if (response_code == 404) {

                //Create label
                var label = [];
                if (ads_url.indexOf(unique_url[i]) != -1) {
                    label.push("ads");
                }
                if (keywords_url.indexOf(unique_url[i]) != -1) {
                    label.push("keywords");
                }
                if (sitelinks_url.indexOf(unique_url[i]) != -1) {
                    label.push("sitelinks");
                }
                label = label.join(", ");

                //Sum stats                              
                var clicks = 0;
                var cost = 0;
                for (var j = 0; j < stats_url.length; j++)
                {
                    if (stats_url[j][0] == unique_url[i])
                    {
                        clicks += stats_url[j][1];
                        cost += stats_url[j][2];
                    }
                }

                url_404.push([unique_url[i], label, clicks, cost]);

                count_404 += 1;
            } else {
                count_200 += 1;
            }
            Utilities.sleep(200);

        } catch (error)
        {
        }
    }

//Logger----------------------------------------------------------------------------------  
    Logger.log("Count of unique urls -> " + (count_200 + count_404));
    Logger.log("Response code 200 -> " + count_200);
    Logger.log("Response code 404 -> " + count_404);

//Send mail-------------------------------------------------------------------------------
    if (url_404.length > 0) {

        //Sort array
        url_404.sort(sort_array).reverse();

        //Create html
        var html = "<h2>" + account_name + "</h2>" +
                "<h3>404 url:</h3>" +
                "<table border='1' style='border-collapse: collapse;' cellpadding='8'>" +
                "<tr bgcolor='#4fabe5'><th>Url</th><th>Label</th><th>Clicks</th><th>Cost</th></tr>"

        for (var i = 0; i < url_404.length; i++)
        {
            html = html + "<tr><td nowrap>" + url_404[i][0] + "</td><td nowrap>" + url_404[i][1] + "</td><td nowrap align='right'>" + number_format(url_404[i][2].toFixed(0)) + "</td><td nowrap align='right'>" + number_format(url_404[i][3].toFixed(0)) + " " + currency + "</td></tr>"
        }

        html = html + "</table>";

        MailApp.sendEmail({to: mail, subject: subject, htmlBody: html});
    }
}

//*****************************************************************************************
function sort_array(a, b) {
    if (a[3] === b[3]) {
        return 0;
    } else {
        return (a[3] < b[3]) ? -1 : 1;
    }
}
//----------------------------------------------------------------------------------------- 
function number_format(number) {
    number = number.toString();
    number = number.split("").reverse().join("");
    number = number.substr(0, 3) + " " + number.substr(3, 3) + " " + number.substr(6, 3) + " " + number.substr(9, 3) + " " + number.substr(12, 3);
    number = number.split("").reverse().join("");
    number = number.trim();
    return(number)
}