<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Artigos sobre automação de Google | Rotamáxima - Especialistas em resultados</title>
	<atom:link href="https://blog.rotamaxima.com/category/automacao-google-ads/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.rotamaxima.com/category/automacao-google-ads/</link>
	<description>Conteúdos, cursos e consultoria para sua empresa gerar mais leads e vendas</description>
	<lastBuildDate>Mon, 05 Jul 2021 19:40:16 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>

<image>
	<url>https://blog.rotamaxima.com/wp-content/uploads/2022/07/cropped-logo_clean-32x32.png</url>
	<title>Artigos sobre automação de Google | Rotamáxima - Especialistas em resultados</title>
	<link>https://blog.rotamaxima.com/category/automacao-google-ads/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Automação Google Ads: Gerencie múltiplas contas com o Google Drive.</title>
		<link>https://blog.rotamaxima.com/automacao-google-ads-outros/</link>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Wed, 22 Aug 2018 19:37:52 +0000</pubDate>
				<category><![CDATA[Automação Google Ads]]></category>
		<category><![CDATA[Multiuse]]></category>
		<category><![CDATA[automação-google-ads]]></category>
		<guid isPermaLink="false">https://www.rotamaxima.com.br/?p=1895</guid>

					<description><![CDATA[<p>Nessa série especial, reunimos alguns scripts úteis para você automatizar e aumentar o retorno de suas campanhas no Google Ads. Confira abaixo como&#160;automatizar o Google Ads. &#160; 1. Adicione scripts para múltiplas contas com o Google Drive &#8211; Por Russell Savage. Utilizando uma planilha do Google é possível você automatizar o trabalho de atualizar todos os scripts de suas contas. Uma das desvantagens de usar o AdWords Scripts é que você precisa fazer login em cada conta e configurar o script.&#160;Para a maioria das pessoas, isso não é um problema nas primeiras vezes.&#160;Mas quando você começa a ver o valor de alguns desses scripts, pode haver um conjunto deles que você deseja colocar em todas as suas contas.&#160;Configurá-los é bom, até encontrar um bug no seu código e ter que entrar e atualizar todas as 20 cópias do script em cada conta. Bem, neste post, criei uma maneira simples de manter uma única cópia do seu script e carregá-lo em qualquer número de contas do Google AdWords.&#160;Então, se você tiver alguma alteração, poderá atualizar uma única versão do script e todas as contas começarão a usar o novo código instantaneamente. O código para isso consiste em duas partes.&#160;O primeiro snippet de código é o código genérico que você precisa colocar em cada uma das suas contas.&#160;Esse código faz referência a uma única planilha do Google (aqui está uma amostra para você copiar:&#160;http://goo.gl/y6hPfy&#160;) que é usada para saber quais scripts ela deve executar.&#160;A planilha tem apenas três colunas: uma descrição que é usada apenas para registro, o local do script no Google Drive e o nome do objeto no script.&#160;Não se preocupe com isso agora, vou descrevê-lo melhor na próxima seção.&#160;Finalmente, carrega o arquivo de script e executa a função principal. /************************************ * Generic Script Runner * Version 1.0 * Created By: Russ Savage * FreeAdWordsScripts.com ***********************************/ function main() { //See http://goo.gl/KvINmD for an example spreadsheet. var scriptConfigId = &#8216;Your Spreadsheet Id Goes Here&#8217;; var sheet = SpreadsheetApp.openById(scriptConfigId).getActiveSheet(); var data = sheet.getRange(&#8216;A:C&#8217;).getValues(); for(var i in data) { if(i == 0) { continue; } var [description, location, classname] = data[i]; if(!location) { continue; } Logger.log(&#8216;Running &#8220;&#8216;+description+'&#8221; from location: &#8216;+location); var scriptFile = getFile(location); var scriptText = scriptFile.getBlob().getDataAsString(); eval(scriptText); var script = eval(&#8216;new &#8216;+classname+'();&#8217;); script.main(); } } //This function gets the file from GDrive function getFile(loc) { var locArray = loc.split(&#8216;/&#8217;); var folder = getFolder(loc); if(folder.getFilesByName(locArray[locArray.length-1]).hasNext()) { return folder.getFilesByName(locArray[locArray.length-1]).next(); } else { return null; } } //This function finds the folder for the file and creates folders if needed function getFolder(folderPath) { var folder = DriveApp.getRootFolder(); if(folderPath) { var pathArray = folderPath.split(&#8216;/&#8217;); for(var i in pathArray) { if(i == pathArray.length &#8211; 1) { break; } var folderName = pathArray[i]; if(folder.getFoldersByName(folderName).hasNext()) { folder = folder.getFoldersByName(folderName).next(); } } } return folder; } Agora que temos um código genérico que lê a descrição, o local e o nome do objeto de uma planilha e executa o código, precisamos fazer algumas pequenas modificações em alguns dos nossos scripts existentes para que ele funcione. Um dos meus scripts favoritos é sobre como&#160;encontrar anomalias na sua conta&#160;.&#160;Para que o script seja executado a partir de outro script, precisamos convertê-lo em um objeto com uma única função pública.&#160;Essa mesma técnica deve funcionar em quase todos os scripts do&#160;FreeAdWordsScripts.com&#160;. Primeiro, coloque todo o script em uma chamada de função e dê a ele qualquer nome que desejar. function Anomalies() { // Copy and Paste the code from: // http://goo.gl/IT1UcV }; Em seguida, você precisa atualizar a função principal para ser um método público, para que possamos chamá-la de nosso script genérico. this.main = function() { // Don&#8217;t make any changes to the body of the main method } Uma versão completa do código atualizado pode ser encontrada aqui:&#160;Encontre anomalias na versão do objeto da sua conta&#160;. Agora você pode salvar este novo script em algum lugar em seu GDrive e atualizar o local e o nome do objeto (anomalias neste caso) em sua planilha de configuração. Agora você deveria estar bem para ir.&#160;Você pode adicionar quantos scripts desejar à planilha de configuração, mas lembre-se de que o limite de 30 minutos ainda se aplica. 2. Criando “deep links” para sua conta &#8211; Por Russell Savage. Este script cria links diretamente para a entidade que está com problemas, assim, você consegue acessar rapidamente a raiz do problema sem ter que acessar todas as páginas. Acontece que existem dois números mágicos que você precisa para que isso funcione.&#160;Quando você acessar sua conta, no URL, você verá __u =&#160;e __c =.&#160;De acordo com esta&#160;postagem do blog&#160;, esses valores são &#8216;effectiveUserId&#8217; e &#8216;customerId&#8217; respectivamente.&#160;Infelizmente, não há como acessar esses valores ao usar scripts, portanto, você precisará copiá-los manualmente no script abaixo. Depois disso, você pode incluir a função em todos os seus scripts e fazer um link direto para o conteúdo do seu coração.&#160;Não é a coisa mais bonita do mundo, mas é auto-contida, por isso deve ser fácil de copiar para o fundo de seus scripts. // Link to the Keyword Tab of the AdGroup Logger.log(getUrl(someAdGroupEntity,&#8217;Keywords&#8217;)); // Link to the Ads Tab of the AdGroup Logger.log(getUrl(someAdGroupEntity,&#8217;Ads&#8217;)); // Link to Location Settings Tab of the Campaign Logger.log(getUrl(comeCampaignEntity,&#8217;Settings:Locations&#8217;)); &#160; /*********************************** * Build Deep Link Urls for Entities * Version 1.0 * Created By: Russ Savage * FreeAdWordsScripts.com ***********************************/ function getUrl(entity,tab) { var customerId = &#8216;__c from the url&#8217;; var effectiveUserId = &#8216;__u from the url&#8217;; var decodedTab = getTab(tab); var base = &#8216;https://adwords.google.com/cm/CampaignMgmt?&#8217;; var url = base+&#8217;__c=&#8217;+customerId+&#8217;&#38;__u=&#8217;+effectiveUserId+&#8217;#&#8217;; if(typeof entity[&#8216;getBudget&#8217;] !== &#8216;undefined&#8217;) { //A Campaign return url+&#8217;c.&#8217;+entity.getId()+&#8217;.&#8217;+decodedTab+&#8217;&#38;app=cm&#8217;; } if(typeof entity[&#8216;createKeyword&#8217;] !== &#8216;undefined&#8217;) { //An AdGroup return url+&#8217;a.&#8217;+entity.getId()+&#8217;_&#8217;+entity.getCampaign().getId()+&#8217;.&#8217;+decodedTab+&#8217;&#38;app=cm&#8217;; } if(typeof entity[&#8216;getMatchType&#8217;] !== &#8216;undefined&#8217;) { //A Keyword return url+&#8217;a.&#8217;+entity.getAdGroup().getId()+&#8217;_&#8217;+entity.getCampaign().getId()+&#8217;.key&#38;app=cm&#8217;; } if(typeof entity[&#8216;getHeadline&#8217;] !== &#8216;undefined&#8217;) { //An Ad return url+&#8217;a.&#8217;+entity.getAdGroup().getId()+&#8217;_&#8217;+entity.getCampaign().getId()+&#8217;.create&#38;app=cm&#8217;; } return url+&#8217;r.ONLINE.di&#38;app=cm&#8217;; function getTab(tab) { var mapping = { &#8216;Ad groups&#8217;:&#8217;ag&#8217;,&#8217;Settings:All settings&#8217;:&#8217;st_sum&#8217;, &#8216;Settings:Locations&#8217;:&#8217;st_loc&#8217;,&#8217;Settings:Ad schedule&#8217;:&#8217;st_as&#8217;, &#8216;Settings:Devices&#8217;:&#8217;st_p&#8217;,&#8217;Ads&#8217;:&#8217;create&#8217;, &#8216;Keywords&#8217;:&#8217;key&#8217;,&#8217;Audiences&#8217;:&#8217;au&#8217;,&#8217;Ad extensions&#8217;:&#8217;ae&#8217;, &#8216;Auto targets&#8217;:&#8217;at&#8217;,&#8217;Dimensions&#8217; : &#8216;di&#8217; }; if(mapping[tab]) { return mapping[tab]; } return &#8216;key&#8217;; //default to keyword tab } } &#160; 3. Converta feeds RSS em JSON &#8211; Por Russel Savage. Utilize o Feed API do Google em seu script para converter feed</p>
<p>O post <a href="https://blog.rotamaxima.com/automacao-google-ads-outros/">Automação Google Ads: Gerencie múltiplas contas com o Google Drive.</a> apareceu primeiro em <a href="https://blog.rotamaxima.com">Rotamáxima - Especialistas em resultados</a>.</p>
]]></description>
		
		
		
			</item>
		<item>
		<title>Automação Google Ads: Campanhas de Display e Shopping</title>
		<link>https://blog.rotamaxima.com/automacao-google-ads-campanhas-de-display-e-shopping/</link>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Wed, 22 Aug 2018 19:18:02 +0000</pubDate>
				<category><![CDATA[Automação Google Ads]]></category>
		<category><![CDATA[Multiuse]]></category>
		<category><![CDATA[automação-google-ads]]></category>
		<guid isPermaLink="false">https://www.rotamaxima.com.br/?p=1887</guid>

					<description><![CDATA[<p>Nessa série especial, reunimos alguns scripts úteis para você automatizar e aumentar o retorno de suas campanhas no Google Ads. Confira abaixo como&#160;automatizar o Google Ads&#160;para “Trabalhar com Campanhas de Display e Shopping”. &#160; 1. Campanhas de Shopping &#8211; Por Google Ads. Gerencie suas campanhas do Google Shopping sem a necessidade de utilizar a plataforma do Google Ads. Esse grupo de scripts permitem criar anúncios de produtos, atualizar lances, etc. Recuperar todas as campanhas de compras function getAllShoppingCampaigns() { var retval = []; var campaignIterator = AdWordsApp.shoppingCampaigns().get(); while (campaignIterator.hasNext()) { var campaign = campaignIterator.next(); // Optional: Comment out if you don&#8217;t need to print details. Logger.log(&#8216;Campaign Name: %s&#8217;, campaign.getName()); retval.push(campaign); } return retval; } &#160; Recuperar uma campanha de compras pelo nome dela function getShoppingCampaignByName(campaignName) { &#160; var campaignIterator = AdWordsApp.shoppingCampaigns() &#160; &#160; &#160; .withCondition("CampaignName = '" + campaignName + "'") &#160; &#160; &#160; .get(); &#160; while (campaignIterator.hasNext()) { &#160; &#160; var campaign = campaignIterator.next(); &#160; &#160; Logger.log('Campaign Name: %s', campaign.getName()); &#160; } } Recuperar um grupo de anúncios de compras pelo nome dele function getShoppingAdGroup() { var campaignName = &#8216;INSERT_CAMPAIGN_NAME_HERE&#8217;; var adGroupName = &#8216;INSERT_ADGROUP_NAME_HERE&#8217;; var adGroupIterator = AdWordsApp.shoppingAdGroups() .withCondition(&#8220;CampaignName = &#8216;&#8221; + campaignName + &#8220;&#8216; and AdGroupName = &#8216;&#8221; + adGroupName + &#8220;&#8216;&#8221;) .get(); while (adGroupIterator.hasNext()) { var adGroup = adGroupIterator.next(); Logger.log( &#8216;AdGroup Name: %s, CPC = %s, Mobile Bid &#8216; + &#8216;Modifier = %s&#8217;, adGroup.getName(), adGroup.bidding().getCpc(), adGroup.devices().getMobileBidModifier() ); } } &#160; Crie um grupo de anúncios do Shopping function createShoppingAdGroup() { var campaignName = &#8216;INSERT_CAMPAIGN_NAME_HERE&#8217;; var shoppingCampaign = AdWordsApp.shoppingCampaigns() .withCondition(&#8220;CampaignName = &#8216;&#8221; + campaignName + &#8220;&#8216;&#8221;) .get() .next(); var adGroupOperation = shoppingCampaign.newAdGroupBuilder().build(); var adGroup = adGroupOperation.getResult(); Logger.log(adGroup); } &#160; Criar uma hierarquia de grupo de produtos de compras function createTree() { var campaignName = &#8216;INSERT_CAMPAIGN_NAME_HERE&#8217;; var adGroupName = &#8216;INSERT_ADGROUP_NAME_HERE&#8217;; var shoppingAdGroup = AdWordsApp.shoppingAdGroups() .withCondition(&#8220;CampaignName = &#8216;&#8221; + campaignName + &#8220;&#8216; and AdGroupName = &#8216;&#8221; + adGroupName + &#8220;&#8216;&#8221;) .get() .next(); var root = shoppingAdGroup.rootProductGroup(); // The structure created is // &#8211; root // &#8211; cardcow brand // &#8211; New // &#8211; Refurbished // &#8211; Other conditions // &#8211; Other brands // Add a brand product group for &#8220;cardcow&#8221; under root product group. var brandNode = root.newChild() .brandBuilder() .withName(&#8216;cardcow&#8217;) .withBid(1.2) .build() .getResult(); // Add new conditions for New and Refurbished cardcow brand items. var newItems = brandNode.newChild() .conditionBuilder() .withCondition(&#8216;NEW&#8217;) .build() .getResult(); var refurbishedItems = brandNode.newChild() .conditionBuilder() .withCondition(&#8216;REFURBISHED&#8217;) .withBid(0.9) .build() .getResult(); } &#160; Atravessa a hierarquia do grupo de produtos function walkProductPartitionTree() { var campaignName = &#8216;INSERT_CAMPAIGN_NAME_HERE&#8217;; var adGroupName = &#8216;INSERT_ADGROUP_NAME_HERE&#8217;; var shoppingAdGroup = AdWordsApp.shoppingAdGroups() .withCondition(&#8220;CampaignName = &#8216;&#8221; + campaignName + &#8220;&#8216; and AdGroupName = &#8216;&#8221; + adGroupName + &#8220;&#8216;&#8221;) .get() .next(); var root = shoppingAdGroup.rootProductGroup(); walkHierarchy(root, 0); } function walkHierarchy(productGroup, level) { var description = &#8221;; if (productGroup.isOtherCase()) { description = &#8216;Other&#8217;; } else if (productGroup.getDimension() == &#8216;CATEGORY&#8217;) { // Shows how to process a product group differently based on its type. description = productGroup.asCategory().getName(); } else { description = productGroup.getValue(); } var padding = new Array(level + 1).join(&#8216;-&#8216;); // Note: Child product groups may not have a max cpc if it has been excluded. Logger.log( &#8216;%s %s, %s, %s, %s, %s&#8217;, padding, description, productGroup.getDimension(), productGroup.getMaxCpc(), productGroup.isOtherCase(), productGroup.getId().toFixed() ); var childProductGroups = productGroup.children().get(); while (childProductGroups.hasNext()) { var childProductGroup = childProductGroups.next(); walkHierarchy(childProductGroup, level + 1); } } &#160; Obtém o grupo de produtos &#8220;Tudo mais&#8221; function getEverythingElseProductGroup() { var campaignName = &#8216;INSERT_CAMPAIGN_NAME_HERE&#8217;; var adGroupName = &#8216;INSERT_ADGROUP_NAME_HERE&#8217;; var shoppingAdGroup = AdWordsApp.shoppingAdGroups() .withCondition(&#8220;CampaignName = &#8216;&#8221; + campaignName + &#8220;&#8216; and AdGroupName = &#8216;&#8221; + adGroupName + &#8220;&#8216;&#8221;) .get() .next(); var rootProductGroup = shoppingAdGroup.rootProductGroup(); var childProductGroups = rootProductGroup.children().get(); while (childProductGroups.hasNext()) { var childProductGroup = childProductGroups.next(); if (childProductGroup.isOtherCase()) { // Note: Child product groups may not have a max cpc if it has been // excluded. Logger.log( &#8216;&#8221;Everything else&#8221; product group found. Type of the product &#8216; + &#8216;group is %s and bid is %s.&#8217;, childProductGroup.getDimension(), childProductGroup.getMaxCpc()); return; } } Logger.log(&#8216;&#8221;Everything else&#8221; product group not found under root &#8216; + &#8216;product group.&#8217;); } &#160; Atualizar lances para grupos de produtos function updateProductGroupBid() { var productGroups = AdWordsApp.productGroups() .withCondition(&#8216;Clicks &#62; 5&#8217;) .withCondition(&#8216;Ctr &#62; 0.01&#8217;) .forDateRange(&#8216;LAST_MONTH&#8217;) .get(); while (productGroups.hasNext()) { var productGroup = productGroups.next(); productGroup.setMaxCpc(productGroup.getMaxCpc() + 0.01); } } &#160; Recuperar anúncios de produtos function getProductAds() { var adGroupName = &#8216;INSERT_ADGROUP_NAME_HERE&#8217;; var shoppingAdGroup = AdWordsApp.shoppingAdGroups() .withCondition(&#8220;AdGroupName = &#8216;&#8221; + adGroupName + &#8220;&#8216;&#8221;) .get() .next(); var productAds = shoppingAdGroup.ads().get(); while (productAds.hasNext()) { var productAd = productAds.next(); Logger.log( &#8220;Ad with ID = %s was found.&#8221;, productAd.getId().toFixed(0)); } } &#160; Crie anúncios de produtos function createProductAd() { var adGroupName = &#8216;INSERT_ADGROUP_NAME_HERE&#8217;; var shoppingAdGroup = AdWordsApp.shoppingAdGroups() .withCondition(&#8220;AdGroupName = &#8216;&#8221; + adGroupName + &#8220;&#8216;&#8221;) .get() .next(); var adOperation = shoppingAdGroup.newAdBuilder() .withMobilePreferred(true) .build(); var productAd = adOperation.getResult(); Logger.log( &#8220;Ad with ID = %s was created.&#8221;, productAd.getId().toFixed(0)); } &#160; 2. Conteúdo do Shopping &#8211; Por Google Ads. Assim como o script de Campanhas de Shopping, é possível inserir produtos, extrair informações da conta do merchant, listar todos os produtos e mais, sem a necessidade da plataforma do Google Ads. Inserir um produto function insertProduct() { var merchantId = &#8216;INSERT_MERCHANT_ID_HERE&#8217;; // Create a product resource. See // https://developers.google.com/shopping-content/v2/reference/v2/products // for the full list of fields supported by product resource. var productResource = { &#8216;offerId&#8217;: &#8216;book123&#8217;, &#8216;title&#8217;: &#8216;A Tale of Two Cities&#8217;, &#8216;description&#8217;: &#8216;A classic novel about the French Revolution&#8217;, &#8216;link&#8217;: &#8216;http://my-book-shop.com/tale-of-two-cities.html&#8217;, &#8216;imageLink&#8217;: &#8216;http://my-book-shop.com/tale-of-two-cities.jpg&#8217;, &#8216;contentLanguage&#8217;: &#8216;en&#8217;, &#8216;targetCountry&#8217;: &#8216;US&#8217;, &#8216;channel&#8217;: &#8216;online&#8217;, &#8216;availability&#8217;: &#8216;in stock&#8217;, &#8216;condition&#8217;: &#8216;new&#8217;, &#8216;googleProductCategory&#8217;: &#8216;Media &#62; Books&#8217;, &#8216;productType&#8217;: &#8216;Media &#62; Books&#8217;, &#8216;gtin&#8217;: &#8216;9780007350896&#8217;, &#8216;price&#8217;: { &#8216;value&#8217;: &#8216;2.50&#8217;, &#8216;currency&#8217;: &#8216;USD&#8217; }, &#8216;shipping&#8217;: [{ &#8216;country&#8217;: &#8216;US&#8217;, &#8216;service&#8217;: &#8216;Standard shipping&#8217;, &#8216;price&#8217;: { &#8216;value&#8217;: &#8216;0.99&#8217;, &#8216;currency&#8217;: &#8216;USD&#8217; } }], &#8216;shippingWeight&#8217;: { &#8216;value&#8217;: &#8216;2&#8217;, &#8216;unit&#8217;: &#8216;pounds&#8217; } }; ShoppingContent.Products.insert(productResource, merchantId); } &#160; Listar todos os produtos function listProducts() { var merchantId = &#8216;INSERT_MERCHANT_ID_HERE&#8217;; // List all the products for a given merchant. var products = ShoppingContent.Products.list(merchantId); if (products.resources) { for (var i = 0; i &#60; products.resources.length; i++) { Logger.log(products.resources[i]); } } } &#160; Inserir produtos usando a API custombatch function custombatch() { var merchantId = &#8216;INSERT_MERCHANT_ID_HERE&#8217;; // Create your product resources. See // https://developers.google.com/shopping-content/v2/reference/v2/products // for the full list of fields supported by product resource. See</p>
<p>O post <a href="https://blog.rotamaxima.com/automacao-google-ads-campanhas-de-display-e-shopping/">Automação Google Ads: Campanhas de Display e Shopping</a> apareceu primeiro em <a href="https://blog.rotamaxima.com">Rotamáxima - Especialistas em resultados</a>.</p>
]]></description>
		
		
		
			</item>
		<item>
		<title>Automação Google Ads: Palavras-chave</title>
		<link>https://blog.rotamaxima.com/automacao-google-ads-palavras-chave/</link>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Wed, 22 Aug 2018 18:41:16 +0000</pubDate>
				<category><![CDATA[Automação Google Ads]]></category>
		<category><![CDATA[Multiuse]]></category>
		<category><![CDATA[automação-google-ads]]></category>
		<category><![CDATA[palavras-chave]]></category>
		<guid isPermaLink="false">https://www.rotamaxima.com.br/?p=1884</guid>

					<description><![CDATA[<p>Nessa série especial, reunimos alguns scripts úteis para você automatizar e aumentar o retorno de suas campanhas no Google Ads. Confira abaixo como&#160;automatizar o Google Ads&#160;para “Trabalhar com Palavras-chave”. &#160; 1. Palavras-chave “exatas” &#8211; Por Brainlabs. O script faz com que suas palavras-chave sejam exatamente o que estão sendo digitadas, eliminando as variações aproximadas, como erros de digitação, plural, etc. /** * * Adds as campaign or AdGroup negatives search queries which have triggered exact keywords * Version: 1.1 * Updated: 2015-10-26 * Authors: Visar Shabi &#38; Daniel Gilbert * brainlabsdigital.com * **/ function main() { //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// //Options //Choose whether to add your negative exact keywords at campaign or AdGroup level. //Set variable as &#8220;true&#8221; to add or as &#8220;false&#8221; to not add. var AddAdGroupNegative = true; // true or false var AddCampaignNegative = true; // true of false //Parameters for filtering by campaign name and AdGroup name. The filtering is case insensitive. //Leave blank, i.e. &#8220;&#8221;, if you want this script to run over all campaigns and AdGroups. var campaignNameContains = &#8220;&#8221;; var adGroupNameContains = &#8220;&#8221;; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// var campaigns = {}; var adGroups = {}; var exactKeywords = []; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// //Pull a list of all exact match keywords in the account var report = AdWordsApp.report( &#8220;SELECT AdGroupId, Id &#8221; + &#8220;FROM KEYWORDS_PERFORMANCE_REPORT &#8221; + &#8220;WHERE Impressions &#62; 0 AND KeywordMatchType = EXACT &#8221; + &#8220;DURING LAST_7_DAYS&#8221;); var rows = report.rows(); while (rows.hasNext()) { var row = rows.next(); var keywordId = row[&#8216;Id&#8217;]; var adGroupId = row[&#8216;AdGroupId&#8217;]; exactKeywords.push(adGroupId + &#8220;#&#8221; + keywordId); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// //Pull a list of all exact (close variant) search queries var report = AdWordsApp.report( &#8220;SELECT Query, AdGroupId, CampaignId, KeywordId, KeywordTextMatchingQuery, Impressions, QueryMatchTypeWithVariant &#8221; + &#8220;FROM SEARCH_QUERY_PERFORMANCE_REPORT &#8221; + &#8220;WHERE CampaignName CONTAINS_IGNORE_CASE &#8216;&#8221; + campaignNameContains + &#8220;&#8216; &#8221; + &#8220;AND AdGroupName CONTAINS_IGNORE_CASE &#8216;&#8221; + adGroupNameContains + &#8220;&#8216; &#8221; + &#8220;DURING LAST_7_DAYS&#8221;); var rows = report.rows(); while (rows.hasNext()) { var row = rows.next(); var adGroupId = parseInt(row[&#8216;AdGroupId&#8217;]); var campaignId = parseInt(row[&#8216;CampaignId&#8217;]); var keywordId = parseInt(row[&#8216;KeywordId&#8217;]); var searchQuery = row[&#8216;Query&#8217;].toLowerCase(); var keyword = row[&#8216;KeywordTextMatchingQuery&#8217;].toLowerCase(); var matchType = row[&#8216;QueryMatchTypeWithVariant&#8217;].toLowerCase(); if(keyword !== searchQuery &#38;&#38; matchType.indexOf(&#8220;exact (close variant)&#8221;) !== -1){ if(!campaigns.hasOwnProperty(campaignId)){ campaigns[campaignId] = [[], []]; } campaigns[campaignId][0].push(searchQuery); campaigns[campaignId][1].push(adGroupId + &#8220;#&#8221; + keywordId); if(!adGroups.hasOwnProperty(adGroupId)){ adGroups[adGroupId] = [[], []]; } adGroups[adGroupId][0].push(searchQuery); adGroups[adGroupId][1].push(adGroupId + &#8220;#&#8221; + keywordId); } } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// //Parse data correctly var adGroupIds = []; var campaignIds = []; var adGroupNegatives = []; var campaignNegatives = []; for(var x in campaigns){ campaignIds.push(parseInt(x)); campaignNegatives.push([]); for(var y = 0; y &#60; campaigns[x][0].length; y++){ var keywordId = campaigns[x][1][y]; var keywordText = campaigns[x][0][y]; if(exactKeywords.indexOf(keywordId) !== -1){ campaignNegatives[campaignIds.indexOf(parseInt(x))].push(keywordText); } } } for(var x in adGroups){ adGroupIds.push(parseInt(x)); adGroupNegatives.push([]); for(var y = 0; y &#60; adGroups[x][0].length; y++){ var keywordId = adGroups[x][1][y]; var keywordText = adGroups[x][0][y]; if(exactKeywords.indexOf(keywordId) !== -1){ adGroupNegatives[adGroupIds.indexOf(parseInt(x))].push(keywordText); } } } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// //Create the new negative exact keywords var campaignResults = {}; var adGroupResults = {}; if(AddCampaignNegative){ var campaignIterator = AdWordsApp.campaigns() .withIds(campaignIds) .get(); while(campaignIterator.hasNext()){ var campaign = campaignIterator.next(); var campaignId = campaign.getId(); var campaignName = campaign.getName(); var campaignIndex = campaignIds.indexOf(campaignId); for(var i = 0; i &#60; campaignNegatives[campaignIndex].length; i++){ campaign.createNegativeKeyword(&#8220;[&#8221; + campaignNegatives[campaignIndex][i] + &#8220;]&#8221;) if(!campaignResults.hasOwnProperty(campaignName)){ campaignResults[campaignName] = []; } campaignResults[campaignName].push(campaignNegatives[campaignIndex][i]); } } } if(AddAdGroupNegative){ var adGroupIterator = AdWordsApp.adGroups() .withIds(adGroupIds) .get(); while(adGroupIterator.hasNext()){ var adGroup = adGroupIterator.next(); var adGroupId = adGroup.getId(); var adGroupName = adGroup.getName(); var adGroupIndex = adGroupIds.indexOf(adGroupId); for(var i = 0; i &#60; adGroupNegatives[adGroupIndex].length; i++){ adGroup.createNegativeKeyword(&#8220;[&#8221; + adGroupNegatives[adGroupIndex][i] + &#8220;]&#8221;); if(!adGroupResults.hasOwnProperty(adGroupName)){ adGroupResults[adGroupName] = []; } adGroupResults[adGroupName].push(adGroupNegatives[adGroupIndex][i]); } } } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// //Format the results var resultsString = &#8220;The following negative keywords have been added to the following campaigns:&#8221;; for(var x in campaignResults){ resultsString += &#8220;\n\n&#8221; + x + &#8220;:\n&#8221; + campaignResults[x].join(&#8220;\n&#8221;); } resultsString += &#8220;\n\n\n\nThe following negative keywords have been added to the following AdGroups:&#8221;; for(var x in adGroupResults){ resultsString += &#8220;\n\n&#8221; + x + &#8220;:\n&#8221; + adGroupResults[x].join(&#8220;\n&#8221;); } Logger.log(resultsString); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// } &#160; 2. Oportunidades de Termos de Pesquisa &#8211; Por Daniel Gilbert. Utilize esse scripts para gerar insights dos termos que são buscados e que geraram boas conversões ou apenas custos. Ele quebra as palavras nos termos de pesquisa e organiza por custo e conversão, assim você poderá ter uma ideia de que tipo palavras estão gerando conversão ou apenas custos. Excelente script para buscar termos de cauda longa e analisar seu desempenho. /** * * Search Query Mining Tool * * This script calculates the contribution of each word found in the search query report * and outputs a report into a Google Doc spreadsheet. * * Version: 1.0 * Google Apps Script maintained on brainlabsdigital.com * **/ function main() { ////////////////////////////////////////////////////////////////////////////// // Options var startDate = &#8220;2015-04-01&#8221;; var endDate = &#8220;2015-04-30&#8221;; // The start and end date of the date range for your search query data // Format is yyyy-mm-dd var currencySymbol = &#8220;£&#8221;; // The currency symbol used for formatting. For example &#8220;£&#8221;, &#8220;$&#8221; or &#8220;€&#8221;. var campaignNameContains = &#8220;&#8221;; // Use this if you only want to look at some campaigns // such as campaigns with names containing &#8216;Brand&#8217; or &#8216;Shopping&#8217;. // Leave as &#8220;&#8221; if not wanted. var spreadsheetUrl = &#8220;https://docs.google.com/YOUR-SPREADSHEET-URL-HERE&#8221;; // The URL of the Google Doc the results will be put into. ////////////////////////////////////////////////////////////////////////////// // Thresholds var impressionThreshold = 10; var clickThreshold = 0; var costThreshold = 0; var conversionThreshold = 0; // Words will be ignored if their statistics are lower than any of these thresholds ////////////////////////////////////////////////////////////////////////////// // Find the negative keywords var negativesByGroup = []; var negativesByCampaign = []; var sharedSetData = []; var sharedSetNames = []; var sharedSetCampaigns = []; var dateRange = startDate.replace(/-/g, &#8220;&#8221;) + &#8220;,&#8221; + endDate.replace(/-/g, &#8220;&#8221;); var activeCampaignIds = []; // Gather ad group level negative keywords var keywordReport = AdWordsApp.report( &#8220;SELECT CampaignId, AdGroupId, KeywordText, KeywordMatchType &#8221; + &#8220;FROM KEYWORDS_PERFORMANCE_REPORT &#8221; + &#8220;WHERE CampaignStatus = ENABLED AND AdGroupStatus = ENABLED AND Status = ENABLED AND IsNegative = TRUE &#8221; + &#8220;AND CampaignName CONTAINS_IGNORE_CASE &#8216;&#8221; + campaignNameContains + &#8220;&#8216; &#8221; + &#8220;DURING &#8221; + dateRange); var keywordRows = keywordReport.rows(); while (keywordRows.hasNext()) { var keywordRow = keywordRows.next(); if (negativesByGroup[keywordRow[&#8220;AdGroupId&#8221;]] == undefined) { negativesByGroup[keywordRow[&#8220;AdGroupId&#8221;]] = [[keywordRow[&#8220;KeywordText&#8221;].toLowerCase(),keywordRow[&#8220;KeywordMatchType&#8221;].toLowerCase()]]; } else { negativesByGroup[keywordRow[&#8220;AdGroupId&#8221;]].push([keywordRow[&#8220;KeywordText&#8221;].toLowerCase(),keywordRow[&#8220;KeywordMatchType&#8221;].toLowerCase()]); } if (activeCampaignIds.indexOf(keywordRow[&#8220;CampaignId&#8221;]) &#60; 0) { activeCampaignIds.push(keywordRow[&#8220;CampaignId&#8221;]); } }//end while</p>
<p>O post <a href="https://blog.rotamaxima.com/automacao-google-ads-palavras-chave/">Automação Google Ads: Palavras-chave</a> apareceu primeiro em <a href="https://blog.rotamaxima.com">Rotamáxima - Especialistas em resultados</a>.</p>
]]></description>
		
		
		
			</item>
		<item>
		<title>Automação Google Ads: Texto do Anúncio</title>
		<link>https://blog.rotamaxima.com/automacao-google-ads-texto-do-anuncio/</link>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Wed, 22 Aug 2018 18:06:57 +0000</pubDate>
				<category><![CDATA[Automação Google Ads]]></category>
		<category><![CDATA[Multiuse]]></category>
		<category><![CDATA[automação-google-ads]]></category>
		<guid isPermaLink="false">https://www.rotamaxima.com.br/?p=1876</guid>

					<description><![CDATA[<p>Nessa série especial, reunimos alguns scripts úteis para você automatizar e aumentar o retorno de suas campanhas no Google Ads. Confira abaixo como&#160;automatizar o Google Ads&#160;para “Trabalhar com Textos dos anúncios”. &#160; 1. Corrija os erros de letras maiúsculas em seus anúncios &#8211; por Russell Savage. Caso seus anúncios contenham muitas letras maiúsculas, o Google pode não aprová-los. Esse script substitui quaisquer sequências de 3 letras maiúsculas, criando um anúncio novo e pausando o antigo. //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; // Fix Ads with EXCESSIVE CAPITALIZATION // Created By: Russ Savage // FreeAdWordsScripts.com //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; function main() { var find_caps = /[A-Z]{3,}/g; var SEP = &#8216;~~@~~&#8217;; // this needs to be something you would never put in your ads. var ad_iter = AdWordsApp.ads().withCondition(&#8220;ApprovalStatus = &#8216;DISAPPROVED'&#8221;).get(); while(ad_iter.hasNext()) { var ad = ad_iter.next(); var old_ad_cnt = get_ad_count(ad.getAdGroup()); var old_ad_str = [ad.getHeadline(),ad.getDescription1(),ad.getDescription2(),ad.getDisplayUrl()].join(SEP); var new_ad_str = old_ad_str; Logger.log(&#8220;Before:&#8221;+old_ad_str); var m = &#8220;&#8221;; while((m = find_caps.exec(new_ad_str)) != null) { new_ad_str = replace_all(new_ad_str,m[0],init_cap(m[0]),false); } Logger.log(&#8220;After:&#8221;+new_ad_str); if(old_ad_str != new_ad_str) { var [new_headline,new_desc1,new_desc2,new_disp_url] = new_ad_str.split(SEP); ad.getAdGroup().createTextAd(new_headline, new_desc1, new_desc2, new_disp_url, ad.getDestinationUrl()); var new_ad_cnt = get_ad_count(ad.getAdGroup()); if(new_ad_cnt == (old_ad_cnt+1)) { ad.remove(); } } else { Logger.log(&#8220;Skipping because no changes were made.&#8221;); } } function init_cap(s) { return s.charAt(0).toUpperCase() + s.slice(1).toLowerCase(); } // This function was adapted from: http://dumpsite.com/forum/index.php?topic=4.msg8#msg8 function replace_all(original,str1, str2, ignore) { return original.replace(new RegExp(str1.replace(/([\/\,\!\\\^\$\{\}\[\]\(\)\.\*\+\?\&#124;\&#60;\&#62;\-\&#38;])/g,&#8221;\\$&#38;&#8221;),(ignore?&#8221;gi&#8221;:&#8221;g&#8221;)),(typeof(str2)==&#8221;string&#8221;)?str2.replace(/\$/g,&#8221;$$$$&#8221;):str2); } function get_ad_count(ad_group) { var ad_iter = ad_group.ads().get(); var new_ad_cnt = 0; while(ad_iter.hasNext()) { ad_iter.next(); new_ad_cnt++; } return new_ad_cnt; } } &#160; 2. Automação de testes de anúncios &#8211; Por Russell Savage. O Google costuma analisar em 1 dia anúncios para aprovação, porém nem sempre este é o caso. Esse script detecta quando há uma alteração no anúncio e grava em uma planilha do Google com a data em que ele começou a rodar. /************************************ * Ad Creative Test Automation Script * Version: 1.3 * Changelog v1.3 &#8211; Data is written to the spreadsheet a little faster * Changelog v1.2 &#8211; Added additional threshold options * Changelog v1.1 &#8211; Fixed issue with dates in email * Created By: Russ Savage * FreeAdWordsScripts.com ************************************/ // You can use any of the same values here as you can for METRIC below var THRESHOLD = { metric : &#8216;Clicks&#8217;, value : 100 }; var TO = [&#8216;example@example.com&#8217;]; //Try any of these values for METRIC: //AverageCpc, AverageCpm, AveragePageviews, AveragePosition, //AverageTimeOnSite, BounceRate, Clicks, ConversionRate, //Conversions, Cost, Ctr, Impressions var METRIC = &#8216;Ctr&#8217;; var ASC_OR_DESC = &#8216;ASC&#8217;; //ASC &#8211; pause ad with lowest value, DESC &#8211; pause ad with highest value function main() { //Start by finding what has changed in the account var ad_map = buildCurrentAdMap(); var prev_ad_map = readMapFromSpreadsheet(); prev_ad_map = updatePreviousAdMap(prev_ad_map,ad_map); writeMapToSpreadsheet(prev_ad_map); //Now run through the adgroups to find creative tests var ag_iter = AdWordsApp.adGroups().get(); var paused_ads = []; while(ag_iter.hasNext()) { var ag = ag_iter.next(); if(!prev_ad_map[ag.getId()]) { continue; } //Here is the date range for the test metrics var last_touched_str = _getDateString(prev_ad_map[ag.getId()].last_touched,&#8217;yyyyMMdd&#8217;); var get_today_str = _getDateString(new Date(),&#8217;yyyyMMdd&#8217;); var ag_stats = ag.getStatsFor(last_touched_str, get_today_str); if(ag_stats[&#8216;get&#8217;+THRESHOLD.metric]() &#62;= THRESHOLD.value) { var ad_iter = ag.ads().withCondition(&#8216;Status = ENABLED&#8217;) .forDateRange(last_touched_str, get_today_str) .orderBy(METRIC+&#8221; &#8220;+ASC_OR_DESC).get(); var ad = ad_iter.next(); var metric = ad.getStatsFor(last_touched_str, get_today_str)[&#8216;get&#8217;+METRIC](); ad.pause(); paused_ads.push({a : ad, m : metric}); } } sendEmailForPausedAds(paused_ads); } // A function to send an email with an attached report of ads it has paused function sendEmailForPausedAds(ads) { if(ads.length == 0) { return; } //No ads paused, no email var email_body = &#8216;&#8221;&#8216; + [&#8216;CampaignName&#8217;,&#8217;AdGroupName&#8217;,&#8217;Headline&#8217;,&#8217;Desc1&#8242;,&#8217;Desc2&#8242;,&#8217;DisplayUrl&#8217;,METRIC].join(&#8216;&#8221;,&#8221;&#8216;) + &#8216;&#8221;\n&#8217;; for(var i in ads) { var ad = ads[i].a; var metric = ads[i].m; email_body += &#8216;&#8221;&#8216; + [ad.getCampaign().getName(), ad.getAdGroup().getName(), ad.getHeadline(), ad.getDescription1(), ad.getDescription2(), ad.getDisplayUrl(), metric ].join(&#8216;&#8221;,&#8221;&#8216;) + &#8216;&#8221;\n&#8217;; } var date_str = _getDateString(new Date(),&#8217;yyyy-MM-dd&#8217;); var options = { attachments: [Utilities.newBlob(email_body, &#8216;text/csv&#8217;, &#8220;FinishedTests_&#8221;+date_str+&#8217;.csv&#8217;)] }; var subject = &#8216;Finished Tests &#8211; &#8216; + date_str; for(var i in TO) { MailApp.sendEmail(TO[i], subject, &#8216;See attached.&#8217;, options); } } //Given two lists of ads, this checks to make sure they are the same. function sameAds(ads1,ads2) { for(var i in ads1) { if(ads1[i] != ads2[i]) { return false; } } return true; } //This reads the stored data from the spreadsheet function readMapFromSpreadsheet() { var ad_map = {}; var sheet = SpreadsheetApp.openById(findSpreadsheetId()).getActiveSheet(); var data = sheet.getRange(&#8216;A:C&#8217;).getValues(); for(var i in data) { if(data[i][0] == &#8221;) { break; } var [ag_id,last_touched,ad_ids] = data[i]; ad_map[ag_id] = { ad_ids : (&#8221;+ad_ids).split(&#8216;,&#8217;), last_touched : new Date(last_touched) }; } return ad_map; } //This will search for a label containing the spreadsheet id //If one isn&#8217;t found, it will create a new one and the label as well function findSpreadsheetId() { var spreadsheet_id = &#8220;&#8221;; var label_iter = AdWordsApp.labels().withCondition(&#8220;Name STARTS_WITH &#8216;history_script:'&#8221;).get(); if(label_iter.hasNext()) { var label = label_iter.next(); return label.getName().split(&#8216;:&#8217;)[1]; } else { var sheet = SpreadsheetApp.create(&#8216;AdGroups History&#8217;); var sheet_id = sheet.getId(); AdWordsApp.createLabel(&#8216;history_script:&#8217;+sheet_id, &#8216;stores sheet id for adgroup changes script.&#8217;); return sheet_id; } } //This will store the data from the account into a spreadsheet function writeMapToSpreadsheet(ad_map) { var toWrite = []; for(var ag_id in ad_map) { var ad_ids = ad_map[ag_id].ad_ids; var last_touched = ad_map[ag_id].last_touched; toWrite.push([ag_id,last_touched,ad_ids.join(&#8216;,&#8217;)]); } writeToSpreadsheet(toWrite); } // Write the keyword data to the spreadsheet function writeToSpreadsheet(toWrite) { var sheet = SpreadsheetApp.openById(findSpreadsheetId()).getActiveSheet(); sheet.clear(); var numRows = sheet.getMaxRows(); if(numRows &#60; toWrite.length) { sheet.insertRows(1,toWrite.length-numRows); } var range = sheet.getRange(1,1,toWrite.length,toWrite[0].length); range.setValues(toWrite); } //This builds a map of the ads in the account so that it is easy to compare function buildCurrentAdMap() { var ad_map = {}; // { ag_id : { ad_ids : [ ad_id, &#8230; ], last_touched : date } } var ad_iter = AdWordsApp.ads().withCondition(&#8216;Status = ENABLED&#8217;).get(); while(ad_iter.hasNext()) { var ad = ad_iter.next(); var ag_id = ad.getAdGroup().getId(); if(ad_map[ag_id]) { ad_map[ag_id].ad_ids.push(ad.getId()); ad_map[ag_id].ad_ids.sort(); } else { ad_map[ag_id] = { ad_ids : [ad.getId()], last_touched : new Date() }; } } return ad_map; } //This takes the old ad map and the current ad map and returns an //updated map with all changes. function updatePreviousAdMap(prev_ad_map,ad_map) { for(var ag_id in ad_map) { var current_ads = ad_map[ag_id].ad_ids; var previous_ads = (prev_ad_map[ag_id]) ? prev_ad_map[ag_id].ad_ids : []; if(!sameAds(current_ads,previous_ads)) { prev_ad_map[ag_id] = ad_map[ag_id]; } } return prev_ad_map; } //Helper function to format the date function _getDateString(date,format) { return Utilities.formatDate(date,AdWordsApp.currentAccount().getTimeZone(),format); } &#160; 3. Gerencie seus criativos com Excel &#8211; Por Russell Savage. Integre o Google Ads com o Drive e baixe todas</p>
<p>O post <a href="https://blog.rotamaxima.com/automacao-google-ads-texto-do-anuncio/">Automação Google Ads: Texto do Anúncio</a> apareceu primeiro em <a href="https://blog.rotamaxima.com">Rotamáxima - Especialistas em resultados</a>.</p>
]]></description>
		
		
		
			</item>
		<item>
		<title>Automação Google Ads: Acompanhamento</title>
		<link>https://blog.rotamaxima.com/automacao-google-ads-acompanhamento/</link>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Wed, 22 Aug 2018 17:37:55 +0000</pubDate>
				<category><![CDATA[Automação Google Ads]]></category>
		<category><![CDATA[Multiuse]]></category>
		<category><![CDATA[automação-google-ads]]></category>
		<guid isPermaLink="false">https://www.rotamaxima.com.br/?p=1867</guid>

					<description><![CDATA[<p>Nessa série especial, reunimos alguns scripts úteis para você automatizar e aumentar o retorno de suas campanhas no Google Ads. Confira abaixo como&#160;automatizar o Google Ads&#160;para “Trabalhar com acompanhamento de anúncios”. &#160; 1. Acompanhamento do Índice de Qualidade &#8211; Por Martin Roettgerding. Acompanhe o Índice de Qualidade da sua conta com esse script. Além disso, o script oferece um dashboard com a média do Índice de Qualidade histórica de sua conta. Excelente para acompanhar o progresso de suas alterações nos anúncios, páginas de destino, por exemplo. Apresentando o Quality Score Tracker v3.0 postado em 11 de março de 2016 É maior, é melhor e oficial: o novo Rastreador de Índice de Qualidade está finalmente disponível! O Quality Score Tracker é um script gratuito do Google Ads que controla os Índices de qualidade de uma conta. A versão anterior ainda é incrivelmente popular, mas já tem três anos. É por isso que criamos um novo que é muito mais rápido e tem novos recursos extravagantes. &#160; &#160; A nova versão é diferente das antigas em vários aspectos.&#160;Um dos principais objetivos era escrever um roteiro que fosse o mais fácil de usar possível &#8211; ainda mais fácil do que os antigos.&#160;O novo Rastreador de Índice de qualidade pode ser usado imediatamente, sem qualquer configuração adicional. Apesar de ser fácil de usar o novo script é muito complexo e lida com muitas coisas sem incomodar o usuário. Veja o que faz: Acompanhamento do Índice de qualidade O Quality Score Tracker salva os Índices de qualidade de suas palavras-chave em uma planilha.&#160;Ao contrário das versões anteriores, você não precisa escolher quais &#8211; ele rastreia todas elas.&#160;Isso permite que você volte e pesquise o histórico de qualquer uma de suas palavras-chave posteriormente. Painel de controle Embora o rastreamento de milhares de Índices de qualidade individuais possa ser útil posteriormente, o script também fornece um painel para mostrar onde você está atualmente. &#160; &#160; O painel é fornecido em uma planilha do Google também.&#160;Essa planilha também fornece dados resumidos sobre seus Índices de qualidade. Google Drive Todos os arquivos (pontuações de qualidade do painel e da palavra-chave rastreada) são armazenados em uma pasta no seu Google Drive.&#160;Você pode acessá-los por meio do navegador ou usar todos os recursos do Google Drive, como sincronizar a pasta com o dispositivo ou compartilhar pastas com outras pessoas. Há um limite de quantas células uma planilha do Google pode conter (dois milhões).&#160;Se você atingir esse limite durante o rastreamento de Índices de qualidade, o script criará planilhas adicionais.&#160;Os arquivos da planilha são nomeados e numerados para que você possa juntar tudo mais tarde, se necessário. &#160; &#160; Como tudo está nos arquivos da planilha do Google, o espaço ocupado não conta para o limite de armazenamento do Google Drive. Customizável O script fornece várias configurações que você pode alterar (mas não é necessário).&#160;Por exemplo, você pode adicionar outros gráficos ao painel, como um Índice de qualidade ponderado por clique. FAQ integrado O painel vem com um FAQ que é atualizado toda vez que o script é executado. Mais para vir! O script já é bastante complexo, mas tenho algumas ideias para novos recursos que desejo adicionar no futuro (provavelmente uma versão da MCC será a próxima).&#160;Quando uma nova versão está disponível, um lembrete sutil é adicionado ao painel. &#160; &#160; Configuração rápida Como o script funciona imediatamente, é fácil configurá-lo. Obtenha o código (veja abaixo) e cole-o na sua conta. Agende o script para ser executado diariamente.&#160;Recomendação: 01:00 Execute o script pela primeira vez.&#160;Verifique os registros para encontrar o URL do seu painel ou encontre tudo em seu&#160;Google Drive&#160;. Configuração Detalhada No Google AdWords, navegue até &#8221;&#160;Operações em massa&#8221;&#160;e depois &#8221;&#160;Scripts&#8221;&#160;.&#160;Clique em&#160;+ Script&#160;.&#160;Cole o script no final deste post.&#160;Nomeie-o como &#8220;Quality Score Tracker v3.0&#8221;.&#160;Clique em&#160;Salvar&#160;e, em seguida, em&#160;Autorizar agora&#160;. Volte para os&#160;Scripts&#160;e encontre o Rastreador de Índice de Qualidade no topo da lista.&#160;Clique em&#160;+ Criar agendamento&#160;.&#160;Como frequência, selecione “Diariamente”, juntamente com um horário de sua conveniência.&#160;Recomendação: 01:00&#160;Clique em&#160;Salvar&#160;. Clique em&#160;Executar e&#160;, em seguida, role para baixo para ver o script sendo executado em&#160;Logs&#160;.&#160;Com grandes contas, isso pode demorar um pouco, caso contrário, isso pode ser feito em 15 segundos.&#160;Clique em&#160;Logs&#160;no lado direito.&#160;Na próxima tela, clique no&#160;botão&#160;Logs&#160;no topo.&#160;Agora, os URLs do painel e da pasta do Google Drive são exibidos.&#160;Como alternativa, você pode encontrar tudo em seu&#160;Google Drive&#160;. &#160; /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Quality Score Tracker v3.0.1 * Written by Martin Roettgerding. * © 2016 Martin Roettgerding, Bloofusion Germany GmbH. * www.ppc-epiphany.com/qstracker/latest */ function main(){ /* * The following preferences can be changed to customize this script. * Most of options can be set by using 1 for yes or 0 for no. * You don&#8217;t have to change anything here. The script will do fine with the defaults. */ var config = { /* * Which of the following charts should be displayed on the dashboard? * The &#8220;per QS&#8221; charts are column charts. They show the current state compared to a previous one (see next option). * &#8220;Average&#8221; and &#8220;weighted&#8221; charts are line charts, showing changes over time. */ &#8220;chartsToDisplay&#8221; : { &#8220;Keywords per QS&#8221; : 0, &#8220;Average QS&#8221; : 0, &#8220;Keywords with Impressions per QS&#8221; : 1, &#8220;Average QS for Keywords with Impressions&#8221; : 0, &#8220;Impressions per QS&#8221; : 0, &#8220;Impression weighted QS&#8221; : 1, &#8220;Clicks per QS&#8221; : 0, &#8220;Click weighted QS&#8221; : 0, &#8220;Conversions per QS&#8221; : 0, &#8220;Conversion weighted QS&#8221; : 0, &#8220;Conversion value per QS&#8221; : 0, &#8220;Conversion value weighted QS&#8221; : 0, }, /* * Column charts can show a former date for comparison. Set the number of steps you want to go back for this. * Note that the date you&#8217;re comparing this to will depend on how often you&#8217;ve run the script in the past. * Example: If the setting is 30 and you ran the script daily, your comparison will be</p>
<p>O post <a href="https://blog.rotamaxima.com/automacao-google-ads-acompanhamento/">Automação Google Ads: Acompanhamento</a> apareceu primeiro em <a href="https://blog.rotamaxima.com">Rotamáxima - Especialistas em resultados</a>.</p>
]]></description>
		
		
		
			</item>
		<item>
		<title>Automação Google Ads: Termos adicionados e Rótulos</title>
		<link>https://blog.rotamaxima.com/automacao-google-ads-rotulos/</link>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Wed, 22 Aug 2018 17:09:03 +0000</pubDate>
				<category><![CDATA[Automação Google Ads]]></category>
		<category><![CDATA[Multiuse]]></category>
		<category><![CDATA[automação-google-ads]]></category>
		<guid isPermaLink="false">https://www.rotamaxima.com.br/?p=1858</guid>

					<description><![CDATA[<p>Nessa série especial, reunimos alguns scripts úteis para você automatizar e aumentar o retorno de suas campanhas no Google Ads. Confira abaixo como&#160;automatizar o Google Ads&#160;para “Trabalhar com termos adicionados e Rótulos”. &#160; 1. Rótulo de contagem regressiva para termos adicionados &#8211; Por Russel Savage. Este é um excelente script para manter o controle de termos que foram recentemente adicionados, e portanto, não apresentam um histórico de estatísticas consolidados, assim, você evitar de pausá-los ou fazer alterações antes do tempo. Sempre que você adicionar novos elementos à sua conta, poderá aplicar um rótulo a ele usando o formato LABEL_PREFIX_.&#160;Portanto, se você quiser que seus scripts ignorem um novo elemento por 30 dias, aplique o rótulo &#8220;days_left_30&#8221; nesse elemento.&#160;Se você programar o script para ser executado todos os dias, o número de dias restantes no marcador será reduzido em um por dia.&#160;Quando o número de dias chegar a zero, o rótulo será removido da entidade. Nos scripts que você deseja ignorar novos elementos, inclua a seguinte função na parte inferior do script (antes da última chave): function _build_label_list() { //Build a list of labels to exclude in your .withCondition() var LABEL_PREFIX = &#8216;days_left_&#8217;; var label_iter = AdWordsApp.labels().withCondition(&#8220;Name STARTS_WITH &#8216;&#8221;+LABEL_PREFIX+&#8221;&#8216;&#8221;).get(); var label_array = []; while(label_iter.hasNext()) { label_array.push(label_iter.next().getName()); } return &#8220;&#8216;&#8221;+label_array.join(&#8220;&#8216;,'&#8221;)+&#8221;&#8216;&#8221; } &#160; E, em seguida, adicione o seguinte .withCondition (&#8220;LabelNames CONTAINS_NONE [&#8221; + _build_label_list () + &#8220;]&#8221;) para qualquer iterador que você tenha em seus outros scripts. Boa sorte, e se você tiver alguma dúvida, não hesite em perguntar. //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; // Label Countdown // Created By: Russ Savage // FreeAdWordsScripts.com //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; function main() { var LABEL_PREFIX = &#8220;days_left_&#8221;; // you can change this if you want // First lets build a list of labels to work with var label_iter = AdWordsApp.labels().withCondition(&#8220;Name STARTS_WITH &#8216;&#8221;+LABEL_PREFIX+&#8221;&#8216;&#8221;).get(); var labels_array = []; while(label_iter.hasNext()) { labels_array.push(label_iter.next().getName()); } if(labels_array.length &#62; 0) { var labels_str = &#8220;[&#8216;&#8221; + labels_array.join(&#8220;&#8216;,'&#8221;) + &#8220;&#8216;]&#8221;; // grab all the keywords with the labels we want to countdown var kw_iter = AdWordsApp.keywords().withCondition(&#8220;LabelNames CONTAINS_ANY &#8220;+labels_str).get(); while(kw_iter.hasNext()) { var kw = kw_iter.next(); var l_iter = kw.labels().withCondition(&#8220;Name STARTS_WITH &#8216;&#8221;+LABEL_PREFIX+&#8221;&#8216;&#8221;).get(); var label = l_iter.next(); // lazy here because we know this keyword has a label var days_left = parseInt(label.getName().substr(LABEL_PREFIX.length)) &#8211; 1; kw.removeLabel(label.getName()); if(days_left != 0) { var new_label_name = LABEL_PREFIX+days_left; // Create a new label if it doesn&#8217;t exist if(labels_array.indexOf(new_label_name) == -1) { AdWordsApp.createLabel(new_label_name); labels_array.push(new_label_name); } kw.applyLabel(new_label_name); } } } } &#160; 2. Junte Rótulos de Múltiplas Campanhas &#8211; Russel Savage. O script auxilia outro script de agrupar campanhas do autor, ele mantém todas os rótulos das palavras-chave das campanhas agrupadas.] //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; // Merge Labels from Multiple Campaigns // Created By: Russ Savage // FreeAdWordsScripts.com //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; var DESTINATION_CAMPAIGN_NAME = &#8220;Destination Campaign Name&#8221;; var ORIGIN_CAMPAIGN_NAMES = [&#8220;Origin Campaign Name 1&#8243;,&#8221;Origin Campaign Name 2&#8221;]; function main() { var label_iter = AdWordsApp.labels().get(); while(label_iter.hasNext()) { var label = label_iter.next(); //Pre-build all the iterators var iters = [ label.campaigns().withCondition(&#8220;Name IN [&#8216;&#8221;+ORIGIN_CAMPAIGN_NAMES.join(&#8220;&#8216;,'&#8221;)+&#8221;&#8216;]&#8221;).get(), label.adGroups().withCondition(&#8220;CampaignName IN [&#8216;&#8221;+ORIGIN_CAMPAIGN_NAMES.join(&#8220;&#8216;,'&#8221;)+&#8221;&#8216;]&#8221;).get(), label.ads().withCondition(&#8220;CampaignName IN [&#8216;&#8221;+ORIGIN_CAMPAIGN_NAMES.join(&#8220;&#8216;,'&#8221;)+&#8221;&#8216;]&#8221;).get(), label.keywords().withCondition(&#8220;CampaignName IN [&#8216;&#8221;+ORIGIN_CAMPAIGN_NAMES.join(&#8220;&#8216;,'&#8221;)+&#8221;&#8216;]&#8221;).get() ]; for(var i in iters) { var iter = iters[i]; while(iter.hasNext()) { _copyLabels(iter.next()); } } } } //Copies the labels from entity in Origin campaign //to entity with the same name in dest campaign function _copyLabels(entity) { var iter; if(_getEntityType(entity) == &#8220;Campaign&#8221;) { // it&#8217;s a campaign iter = AdWordsApp.campaigns() .withCondition(&#8220;Name = &#8216;&#8221;+DESTINATION_CAMPAIGN_NAME+&#8221;&#8216;&#8221;) .get(); } else if(_getEntityType(entity) == &#8220;AdGroup&#8221;) { // it&#8217;s an adgroup iter = AdWordsApp.adGroups() .withCondition(&#8220;CampaignName = &#8216;&#8221;+DESTINATION_CAMPAIGN_NAME+&#8221;&#8216;&#8221;) .withCondition(&#8220;Name = &#8216;&#8221;+entity.getName()+&#8221;&#8216;&#8221;) .get(); } else if(_getEntityType(entity) == &#8220;Ad&#8221;) { // it&#8217;s an ad iter = AdWordsApp.ads() .withCondition(&#8220;CampaignName = &#8216;&#8221;+DESTINATION_CAMPAIGN_NAME+&#8221;&#8216;&#8221;) .withCondition(&#8220;AdGroupName = &#8216;&#8221;+entity.getAdGroup().getName()+&#8221;&#8216;&#8221;) .withCondition(&#8220;Headline = &#8216;&#8221;+entity.getHeadline()+&#8221;&#8216;&#8221;) .withCondition(&#8220;Description1 = &#8216;&#8221;+entity.getDescription1()+&#8221;&#8216;&#8221;) .withCondition(&#8220;Description2 = &#8216;&#8221;+entity.getDescription2()+&#8221;&#8216;&#8221;) .withCondition(&#8220;DisplayUrl = &#8216;&#8221;+entity.getDisplayUrl()+&#8221;&#8216;&#8221;) .get(); } else if(_getEntityType(entity) == &#8220;Keyword&#8221;) { // it&#8217;s a keyword iter = AdWordsApp.keywords() .withCondition(&#8220;CampaignName = &#8216;&#8221;+DESTINATION_CAMPAIGN_NAME+&#8221;&#8216;&#8221;) .withCondition(&#8220;AdGroupName = &#8216;&#8221;+entity.getAdGroup().getName()+&#8221;&#8216;&#8221;) .withCondition(&#8220;Text = &#8216;&#8221;+entity.getText()+&#8221;&#8216;&#8221;) .withCondition(&#8220;KeywordMatchType = &#8216;&#8221;+entity.getMatchType()+&#8221;&#8216;&#8221;) .get(); } while(iter.hasNext()) { _copyLabelsHelper(entity,iter.next()); } } //Copy the labels form orig entity to dest entity function _copyLabelsHelper(orig,dest) { var label_iter = orig.labels().get(); while(label_iter.hasNext()) { dest.applyLabel(label_iter.next().getName()); } } //Returns a text representation of an entity //For a better way, check: http://goo.gl/kZL3X function _getEntityType(obj) { if(typeof(obj[&#8216;getCampaign&#8217;]) == &#8220;undefined&#8221;) { return &#8216;Campaign&#8217;; } if(typeof(obj[&#8216;getAdGroup&#8217;]) == &#8220;undefined&#8221;) { return &#8216;AdGroup&#8217;; } if(typeof(obj[&#8216;getHeadline&#8217;]) != &#8220;undefined&#8221;) { return &#8220;Ad&#8221;; } if(typeof(obj[&#8216;getText&#8217;]) != &#8220;undefined&#8221;) { return &#8220;Keyword&#8221;; } return null; }//&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; // Merge Labels from Multiple Campaigns // Created By: Russ Savage // FreeAdWordsScripts.com //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; var DESTINATION_CAMPAIGN_NAME = &#8220;Destination Campaign Name&#8221;; var ORIGIN_CAMPAIGN_NAMES = [&#8220;Origin Campaign Name 1&#8243;,&#8221;Origin Campaign Name 2&#8221;]; function main() { var label_iter = AdWordsApp.labels().get(); while(label_iter.hasNext()) { var label = label_iter.next(); //Pre-build all the iterators var iters = [ label.campaigns().withCondition(&#8220;Name IN [&#8216;&#8221;+ORIGIN_CAMPAIGN_NAMES.join(&#8220;&#8216;,'&#8221;)+&#8221;&#8216;]&#8221;).get(), label.adGroups().withCondition(&#8220;CampaignName IN [&#8216;&#8221;+ORIGIN_CAMPAIGN_NAMES.join(&#8220;&#8216;,'&#8221;)+&#8221;&#8216;]&#8221;).get(), label.ads().withCondition(&#8220;CampaignName IN [&#8216;&#8221;+ORIGIN_CAMPAIGN_NAMES.join(&#8220;&#8216;,'&#8221;)+&#8221;&#8216;]&#8221;).get(), label.keywords().withCondition(&#8220;CampaignName IN [&#8216;&#8221;+ORIGIN_CAMPAIGN_NAMES.join(&#8220;&#8216;,'&#8221;)+&#8221;&#8216;]&#8221;).get() ]; for(var i in iters) { var iter = iters[i]; while(iter.hasNext()) { _copyLabels(iter.next()); } } } } //Copies the labels from entity in Origin campaign //to entity with the same name in dest campaign function _copyLabels(entity) { var iter; if(_getEntityType(entity) == &#8220;Campaign&#8221;) { // it&#8217;s a campaign iter = AdWordsApp.campaigns() .withCondition(&#8220;Name = &#8216;&#8221;+DESTINATION_CAMPAIGN_NAME+&#8221;&#8216;&#8221;) .get(); } else if(_getEntityType(entity) == &#8220;AdGroup&#8221;) { // it&#8217;s an adgroup iter = AdWordsApp.adGroups() .withCondition(&#8220;CampaignName = &#8216;&#8221;+DESTINATION_CAMPAIGN_NAME+&#8221;&#8216;&#8221;) .withCondition(&#8220;Name = &#8216;&#8221;+entity.getName()+&#8221;&#8216;&#8221;) .get(); } else if(_getEntityType(entity) == &#8220;Ad&#8221;) { // it&#8217;s an ad iter = AdWordsApp.ads() .withCondition(&#8220;CampaignName = &#8216;&#8221;+DESTINATION_CAMPAIGN_NAME+&#8221;&#8216;&#8221;) .withCondition(&#8220;AdGroupName = &#8216;&#8221;+entity.getAdGroup().getName()+&#8221;&#8216;&#8221;) .withCondition(&#8220;Headline = &#8216;&#8221;+entity.getHeadline()+&#8221;&#8216;&#8221;) .withCondition(&#8220;Description1 = &#8216;&#8221;+entity.getDescription1()+&#8221;&#8216;&#8221;) .withCondition(&#8220;Description2 = &#8216;&#8221;+entity.getDescription2()+&#8221;&#8216;&#8221;) .withCondition(&#8220;DisplayUrl = &#8216;&#8221;+entity.getDisplayUrl()+&#8221;&#8216;&#8221;) .get(); } else if(_getEntityType(entity) == &#8220;Keyword&#8221;) { // it&#8217;s a keyword iter = AdWordsApp.keywords() .withCondition(&#8220;CampaignName = &#8216;&#8221;+DESTINATION_CAMPAIGN_NAME+&#8221;&#8216;&#8221;) .withCondition(&#8220;AdGroupName = &#8216;&#8221;+entity.getAdGroup().getName()+&#8221;&#8216;&#8221;) .withCondition(&#8220;Text = &#8216;&#8221;+entity.getText()+&#8221;&#8216;&#8221;) .withCondition(&#8220;KeywordMatchType = &#8216;&#8221;+entity.getMatchType()+&#8221;&#8216;&#8221;) .get(); } while(iter.hasNext()) { _copyLabelsHelper(entity,iter.next()); } } //Copy the labels form orig entity to dest entity function _copyLabelsHelper(orig,dest) { var label_iter = orig.labels().get(); while(label_iter.hasNext()) { dest.applyLabel(label_iter.next().getName()); } } //Returns a text representation of an entity //For a better way, check: http://goo.gl/kZL3X function _getEntityType(obj) { if(typeof(obj[&#8216;getCampaign&#8217;]) == &#8220;undefined&#8221;) { return &#8216;Campaign&#8217;; } if(typeof(obj[&#8216;getAdGroup&#8217;]) == &#8220;undefined&#8221;) { return &#8216;AdGroup&#8217;; } if(typeof(obj[&#8216;getHeadline&#8217;]) != &#8220;undefined&#8221;) { return &#8220;Ad&#8221;; } if(typeof(obj[&#8216;getText&#8217;]) != &#8220;undefined&#8221;) { return &#8220;Keyword&#8221;; } return null; } &#160; 3. Rótulos com as datas de criação &#8211; Por Russel Savage. Rotule com a data de criação seus anúncios, grupo de anúncios, campanhas e palavras-chave com esse script. Assim, é possível ter um controle histórico de suas</p>
<p>O post <a href="https://blog.rotamaxima.com/automacao-google-ads-rotulos/">Automação Google Ads: Termos adicionados e Rótulos</a> apareceu primeiro em <a href="https://blog.rotamaxima.com">Rotamáxima - Especialistas em resultados</a>.</p>
]]></description>
		
		
		
			</item>
		<item>
		<title>Automação Google Ads: Automatizar Tarefas</title>
		<link>https://blog.rotamaxima.com/automacao-google-ads-automatizar-tarefas/</link>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Wed, 22 Aug 2018 15:06:45 +0000</pubDate>
				<category><![CDATA[Automação Google Ads]]></category>
		<category><![CDATA[Multiuse]]></category>
		<category><![CDATA[automação-google-ads]]></category>
		<guid isPermaLink="false">https://www.rotamaxima.com.br/?p=1854</guid>

					<description><![CDATA[<p>Nessa série especial, reunimos alguns scripts úteis para você automatizar e aumentar o retorno de suas campanhas no Google Ads. Confira abaixo como&#160;automatizar o Google Ads&#160;para “Trabalhar com Automação de Tarefas”. &#160; 1. Reduza Lances para Palavras-chave com Custo/Conversão Alto &#8211; Por Russell Savage. Evite que suas palavras-chave consumam todo orçamento de sua campanha caso ela não esteja trazendo resultados. O script diminui automaticamente lances de palavras-chave com baixa performance em qualquer período de tempo. //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; // Reduce Bids on High Cost per Conversion Keywords // Created By: Russ Savage // FreeAdWordsScripts.com //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; function main() { //Let&#8217;s reduce keywords with a CPC greater than $15 by 35% var WAY_TOO_HIGH_COST_PER_CONV = 15; var WAY_TOO_HIGH_BID_REDUCTION_AMOUNT = .35; //And keywords with CPC between $10 and $15 by 20% var TOO_HIGH_COST_PER_CONV = 10; var TOO_HIGH_BID_REDUCTION_AMOUNT = .20; var kw_iter = AdWordsApp.keywords() .withCondition(&#8220;Status = ENABLED&#8221;) .get(); while(kw_iter.hasNext()) { var kw = kw_iter.next(); var kw_stats = kw.getStatsFor(&#8220;LAST_30_DAYS&#8221;); var cost = kw_stats.getCost(); var conversions = kw_stats.getConversions(); if(conversions &#62; 0) { var cost_per_conversion = (cost/(conversions*1.0)); //Here is the magic. If it is way too high, reduce it by the way too high amount if(cost_per_conversion &#62;= WAY_TOO_HIGH_COST_PER_CONV) { kw.setMaxCpc(kw.getMaxCpc() * (1-WAY_TOO_HIGH_BID_REDUCTION_AMOUNT)); } //otherwise, if it is still too high, reduce it with just the too high amount else if(cost_per_conversion &#62;= TOO_HIGH_COST_PER_CONV) { kw.setMaxCpc(kw.getMaxCpc() * (1-TOO_HIGH_BID_REDUCTION_AMOUNT)); } }else{ //no conversions on this keyword //we will deal with that later continue; } } } &#160; &#160; 2. Aumente Lances para Palavras-chave com Custo/Conversão Baixo &#8211; Por Russell Savage. Assim como seu nome, esse script visa aumentar os lances para palavras-chave que estão custando barato. //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; // Increase Bids Cheap Conversion Keywords // Created By: Russ Savage // FreeAdWordsScripts.com //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; function main() { //For keywords with less than $5 CPC, let&#8217;s pump those bids up by 35% var AMAZING_COST_PER_CONV = 5; var AMAZING_BID_INCREASE_AMOUNT = .35; //For keywords with between $5 and $8 CPCs, we will only increase the bids by 20% var GREAT_COST_PER_CONV = 8; var GREAT_BID_INCREASE_AMOUNT = .20; var kw_iter = AdWordsApp.keywords() .withCondition(&#8220;Status = ENABLED&#8221;) .get(); while(kw_iter.hasNext()) { var kw = kw_iter.next(); var kw_stats = kw.getStatsFor(&#8220;LAST_30_DAYS&#8221;); var cost = kw_stats.getCost(); var conversions = kw_stats.getConversions(); if(conversions &#62; 0) { var cost_per_conversion = (cost/(conversions*1.0)); if(cost_per_conversion &#60;= AMAZING_COST_PER_CONV) { kw.setMaxCpc(kw.getMaxCpc() * (1+AMAZING_BID_INCREASE_AMOUNT)); } else if(cost_per_conversion &#60;= GREAT_COST_PER_CONV) { kw.setMaxCpc(kw.getMaxCpc() * (1+GREAT_BID_INCREASE_AMOUNT)); } }else{ //no conversions on this keyword //we will deal with that later continue; } } } &#160; &#160; 3. Pause Palavras-chave que não performam &#8211; Por Russel Savage. Para utilizar esse script é necessário ter o valor da conversão sendo rastreado. Assim, caso o custo da palavra-chave esteja ultrapassando um valor determinado ela é automaticamente pausada. //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; // Pause Keywords That Are Not Performing // Created By: Russ Savage // FreeAdWordsScripts.com //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; function main() { var THE_VALUE_OF_ONE_CONVERSION = 10; var DECREASE_BIDS_BY_PERCENTAGE = .5; var kw_iter = AdWordsApp.keywords() .withCondition(&#8220;Status = ENABLED&#8221;) .get(); while(kw_iter.hasNext()) { var kw = kw_iter.next(); var kw_stats = kw.getStatsFor(&#8220;LAST_30_DAYS&#8221;); var cost = kw_stats.getCost(); var conversions = kw_stats.getConversions(); if(conversions == 0) { if(THE_VALUE_OF_ONE_CONVERSION * 5 &#62; cost) { kw.pause(); } else if(THE_VALUE_OF_ONE_CONVERSION * 2 &#62; cost) { kw.setMaxCpc(kw.getMaxCpc() * (1-DECREASE_BIDS_BY_PERCENTAGE)); } }else{ //no conversions on this keyword //we will deal with that later continue; } } } &#160; &#160;</p>
<p>O post <a href="https://blog.rotamaxima.com/automacao-google-ads-automatizar-tarefas/">Automação Google Ads: Automatizar Tarefas</a> apareceu primeiro em <a href="https://blog.rotamaxima.com">Rotamáxima - Especialistas em resultados</a>.</p>
]]></description>
		
		
		
			</item>
		<item>
		<title>Automação Google Ads: Anúncios Sazonais</title>
		<link>https://blog.rotamaxima.com/automacao-google-ads-sazonais/</link>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Wed, 22 Aug 2018 14:55:12 +0000</pubDate>
				<category><![CDATA[Automação Google Ads]]></category>
		<category><![CDATA[Multiuse]]></category>
		<category><![CDATA[automação-google-ads]]></category>
		<guid isPermaLink="false">https://www.rotamaxima.com.br/?p=1849</guid>

					<description><![CDATA[<p>Nessa série especial, reunimos alguns scripts úteis para você automatizar e aumentar o retorno de suas campanhas no Google Ads. Confira abaixo como&#160;automatizar o Google Ads&#160;para “Trabalhar com anúncios sazonais”. &#160; 1. Atualize Anúncios para o Ano Novo &#8211; Por Russel Savage. Tenha seus anúncios atualizados assim que o ano novo chegar. Esse script pode auxiliar anunciantes de empresas que precisem ter o ano em seus textos. //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; // Update Ads for 2012 // Created By: Russ Savage // FreeAdWordsScripts.com //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; function main() { var OLD_YEAR = &#8220;2011&#8221;; var NEW_YEAR = &#8220;2012&#8221;; //You probably shouldn&#8217;t update destination urls unless you know what you are doing. var FIELDS_CONTAINING_YEAR = [&#8220;Headline&#8221;,&#8221;Description1&#8243;, &#8220;Description2&#8243;,&#8221;DisplayUrl&#8221; /*,&#8221;DestinationUrl&#8221;*/ ]; for(i in FIELDS_CONTAINING_YEAR) { var field_iter = AdWordsApp.ads() .withCondition(FIELDS_CONTAINING_YEAR[i] + &#8221; CONTAINS &#8221; + OLD_YEAR) .withCondition(&#8220;Status = ENABLED&#8221;) .get(); _iterateThroughAds(field_iter); } //&#8212;&#8212;&#8212;&#8212;&#8212; // Private Helper Functions //&#8212;&#8212;&#8212;&#8212;&#8212; function _iterateThroughAds(ad_iter) { while (ad_iter.hasNext()) { var ad = ad_iter.next(); var ag = ad.getAdGroup(); _createNewAdFromOldAd(ag,ad); } } function _createNewAdFromOldAd(adgroup, old_ad) { //get the updated ad texts replacing all the old years with the new years var new_headline = old_ad.getHeadline().replace(OLD_YEAR,NEW_YEAR); var new_desc1 = old_ad.getDescription1().replace(OLD_YEAR,NEW_YEAR); var new_desc2 = old_ad.getDescription2().replace(OLD_YEAR,NEW_YEAR); var new_display_url = old_ad.getDisplayUrl().replace(OLD_YEAR,NEW_YEAR); var new_dest_url = old_ad.getDestinationUrl();/*.replace(OLD_YEAR,NEW_YEAR);*/ //now create the new ad and pause the old one. adgroup.createTextAd(new_headline,new_desc1,new_desc2,new_display_url,new_dest_url); old_ad.pause(); } } &#160; 2. Atualize suas Palavras-chave em Feriados e Datas Comemorativas &#8211; Por Russel Savage. Todas as suas palavras-chave que tiverem o ano atual em seu texto será substituído com o ano atual. Assim, caso você não precisa mudar manualmente todas essas palavras-chave. /********************************************* * Update Keywords for the New Year * Version 1.1 * Changelog v1.1 * &#8211; Updated for speed and added comments * Created By: Russ Savage * FreeAdWordsScripts.com **********************************************/ function main() { var sameDayLastYear = new Date(); sameDayLastYear.setYear(sameDayLastYear.getYear()-1); var oldYearStr = sameDayLastYear.getYear().toString(); var newYearStr = new Date().getYear().toString(); Logger.log(&#8216;Updating keywords with old year: &#8216;+oldYearStr+&#8217; to new year: &#8216;+newYearStr); // Let&#8217;s start by getting all of the keywords var kwIter = AdWordsApp.keywords() .withCondition(&#8220;Text CONTAINS &#8221; + oldYearStr) .withCondition(&#8220;Status = ENABLED&#8221;) .withCondition(&#8220;AdGroupStatus = ENABLED&#8221;) .withCondition(&#8220;CampaignStatus = ENABLED&#8221;) .get(); // It is always better to store and batch process afterwards var toPause = []; var toCreate = []; while (kwIter.hasNext()) { var kw = kwIter.next(); var ag = kw.getAdGroup(); var oldText = kw.getText(); var newText = oldText.replace(oldYearStr,newYearStr); // Save the info so that we can create them as a batch later toCreate.push({ ag: ag, text: newText, cpc:kw.getMaxCpc(), destUrl : kw.getDestinationUrl() }); // Same with the ones we want to pause toPause.push(kw) } // Now we create the new keywords all at once for(var i in toCreate) { var elem = toCreate[i]; elem.ag.createKeyword(elem.text, elem.cpc, elem.destUrl); } // And pause the old ones all at once for(var i in toPause) { toPause[i].pause(); //or toPause[i].remove(); to delete the old keyword } } &#160; &#160;</p>
<p>O post <a href="https://blog.rotamaxima.com/automacao-google-ads-sazonais/">Automação Google Ads: Anúncios Sazonais</a> apareceu primeiro em <a href="https://blog.rotamaxima.com">Rotamáxima - Especialistas em resultados</a>.</p>
]]></description>
		
		
		
			</item>
		<item>
		<title>Automação Google Ads: Como gerar relatórios</title>
		<link>https://blog.rotamaxima.com/automacao-google-ads-relatorios/</link>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Wed, 22 Aug 2018 14:00:06 +0000</pubDate>
				<category><![CDATA[Automação Google Ads]]></category>
		<category><![CDATA[Multiuse]]></category>
		<category><![CDATA[automação-google-ads]]></category>
		<guid isPermaLink="false">https://www.rotamaxima.com.br/?p=1836</guid>

					<description><![CDATA[<p>Nessa série especial, reunimos alguns scripts úteis para você automatizar e aumentar o retorno de suas campanhas no Google Ads. Confira abaixo como automatizar o Google Ads para Geração de Relatórios. &#160; 1. Relatório de Resumo da Conta &#8211; por Google Ads. Utilize esse script para criar relatórios em uma planilha do Google. Nesta planilha você tem uma visão do desempenho de toda a conta do Google Ads e, além disso, envia um e-mail todos os dias com estatísticas das contas atuais. // Copyright 2015, Google Inc. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the &#8220;License&#8221;); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an &#8220;AS IS&#8221; BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /** * @name Account Summary Report * * @overview The Account Summary Report script generates an at-a-glance report * showing the performance of an entire AdWords account. See * https://developers.google.com/adwords/scripts/docs/solutions/account-summary * for more details. * * @author AdWords Scripts Team [adwords-scripts@googlegroups.com] * * @version 1.1 * * @changelog * &#8211; version 1.1 * &#8211; Add user-updateable fields, and ensure report row ordering. * &#8211; version 1.0.4 * &#8211; Improved code readability and comments. * &#8211; version 1.0.3 * &#8211; Added validation for external spreadsheet setup. * &#8211; version 1.0.2 * &#8211; Fixes date formatting bug in certain timezones. * &#8211; version 1.0.1 * &#8211; Improvements to time zone handling. * &#8211; version 1.0 * &#8211; Released initial version. */ var SPREADSHEET_URL = &#8216;YOUR_SPREADSHEET_URL&#8217;; /** * Configuration to be used for running reports. */ var REPORTING_OPTIONS = { // Comment out the following line to default to the latest reporting version. apiVersion: &#8216;v201705&#8217; }; /** * To add additional fields to the report, follow the instructions at the link * in the header above, and add fields to this variable, taken from the Account * Performance Report reference: * https://developers.google.com/adwords/api/docs/appendix/reports/account-performance-report */ var REPORT_FIELDS = [ {columnName: &#8216;Cost&#8217;, displayName: &#8216;Cost&#8217;}, {columnName: &#8216;AverageCpc&#8217;, displayName: &#8216;Avg. CPC&#8217;}, {columnName: &#8216;Ctr&#8217;, displayName: &#8216;CTR&#8217;}, {columnName: &#8216;AveragePosition&#8217;, displayName: &#8216;Avg. Pos.&#8217;}, {columnName: &#8216;Impressions&#8217;, displayName: &#8216;Impressions&#8217;}, {columnName: &#8216;Clicks&#8217;, displayName: &#8216;Clicks&#8217;} ]; function main() { Logger.log(&#8216;Using spreadsheet &#8211; %s.&#8217;, SPREADSHEET_URL); var spreadsheet = validateAndGetSpreadsheet(); spreadsheet.setSpreadsheetTimeZone(AdWordsApp.currentAccount().getTimeZone()); spreadsheet.getRangeByName(&#8216;account_id_report&#8217;).setValue( AdWordsApp.currentAccount().getCustomerId()); var yesterday = getYesterday(); var date = getFirstDayToCheck(spreadsheet, yesterday); var rows = []; var existingDates = getExistingDates(); while (date.getTime() &#60;= yesterday.getTime()) { if (!existingDates[date]) { var row = getReportRowForDate(date); rows.push([new Date(date)].concat(REPORT_FIELDS.map(function(field) { return row[field.columnName]; }))); spreadsheet.getRangeByName(&#8216;last_check&#8217;).setValue(date); } date.setDate(date.getDate() + 1); } if (rows.length &#62; 0) { writeToSpreadsheet(rows); var email = spreadsheet.getRangeByName(&#8216;email&#8217;).getValue(); if (email) { sendEmail(email); } } } /** * Retrieves a lookup of dates for which rows already exist in the spreadsheet. * * @return {!Object} A lookup of existing dates. */ function getExistingDates() { var spreadsheet = validateAndGetSpreadsheet(); var sheet = spreadsheet.getSheetByName(&#8216;Report&#8217;); var data = sheet.getDataRange().getValues(); var existingDates = {}; data.slice(5).forEach(function(row) { existingDates[row[1]] = true; }); return existingDates; } /** * Sorts the data in the spreadsheet into ascending date order. */ function sortReportRows() { var spreadsheet = validateAndGetSpreadsheet(); var sheet = spreadsheet.getSheetByName(&#8216;Report&#8217;); var data = sheet.getDataRange().getValues(); var reportRows = data.slice(5); if (reportRows.length) { reportRows.sort(function(rowA, rowB) { if (!rowA &#124;&#124; !rowA.length) { return -1; } else if (!rowB &#124;&#124; !rowB.length) { return 1; } else if (rowA[1] &#60; rowB[1]) { return -1; } else if (rowA[1] &#62; rowB[1]) { return 1; } return 0; }); sheet.getRange(6, 1, reportRows.length, reportRows[0].length) .setValues(reportRows); } } /** * Append the data rows to the spreadsheet. * * @param {Array&#60;Array&#60;string&#62;&#62;} rows The data rows. */ function writeToSpreadsheet(rows) { var access = new SpreadsheetAccess(SPREADSHEET_URL, &#8216;Report&#8217;); var emptyRow = access.findEmptyRow(6, 2); if (emptyRow &#60; 0) { access.addRows(rows.length); emptyRow = access.findEmptyRow(6, 2); } access.writeRows(rows, emptyRow, 2); sortReportRows(); } function sendEmail(email) { var day = getYesterday(); var yesterdayRow = getReportRowForDate(day); day.setDate(day.getDate() &#8211; 1); var twoDaysAgoRow = getReportRowForDate(day); day.setDate(day.getDate() &#8211; 5); var weekAgoRow = getReportRowForDate(day); var html = []; html.push( &#8216;&#60;html&#62;&#8217;, &#8216;&#60;body&#62;&#8217;, &#8216;&#60;table width=800 cellpadding=0 border=0 cellspacing=0&#62;&#8217;, &#8216;&#60;tr&#62;&#8217;, &#8216;&#60;td colspan=2 align=right&#62;&#8217;, &#8220;&#60;div style=&#8217;font: italic normal 10pt Times New Roman, serif; &#8221; + &#8220;margin: 0; color: #666; padding-right: 5px;&#8217;&#62;&#8221; + &#8216;Powered by AdWords Scripts&#60;/div&#62;&#8217;, &#8216;&#60;/td&#62;&#8217;, &#8216;&#60;/tr&#62;&#8217;, &#8220;&#60;tr bgcolor=&#8217;#3c78d8&#8242;&#62;&#8221;, &#8216;&#60;td width=500&#62;&#8217;, &#8220;&#60;div style=&#8217;font: normal 18pt verdana, sans-serif; &#8221; + &#8220;padding: 3px 10px; color: white&#8217;&#62;Account Summary report&#60;/div&#62;&#8221;, &#8216;&#60;/td&#62;&#8217;, &#8216;&#60;td align=right&#62;&#8217;, &#8220;&#60;div style=&#8217;font: normal 18pt verdana, sans-serif; &#8221; + &#8220;padding: 3px 10px; color: white&#8217;&#62;&#8221;, AdWordsApp.currentAccount().getCustomerId(), &#8216;&#60;/h1&#62;&#8217;, &#8216;&#60;/td&#62;&#8217;, &#8216;&#60;/tr&#62;&#8217;, &#8216;&#60;/table&#62;&#8217;, &#8216;&#60;table width=800 cellpadding=0 border=0 cellspacing=0&#62;&#8217;, &#8220;&#60;tr bgcolor=&#8217;#ddd&#8217;&#62;&#8221;, &#8216;&#60;td&#62;&#60;/td&#62;&#8217;, &#8220;&#60;td style=&#8217;font: 12pt verdana, sans-serif; &#8221; + &#8216;padding: 5px 0px 5px 5px; background-color: #ddd; &#8216; + &#8220;text-align: left&#8217;&#62;Yesterday&#60;/td&#62;&#8221;, &#8220;&#60;td style=&#8217;font: 12pt verdana, sans-serif; &#8221; + &#8216;padding: 5px 0px 5px 5px; background-color: #ddd; &#8216; + &#8220;text-align: left&#8217;&#62;Two Days Ago&#60;/td&#62;&#8221;, &#8220;&#60;td style=&#8217;font: 12pt verdana, sans-serif; &#8221; + &#8216;padding: 5px 0px 5x 5px; background-color: #ddd; &#8216; + &#8220;text-align: left&#8217;&#62;A week ago&#60;/td&#62;&#8221;, &#8216;&#60;/tr&#62;&#8217;); REPORT_FIELDS.forEach(function(field) { html.push(emailRow( field.displayName, field.columnName, yesterdayRow, twoDaysAgoRow, weekAgoRow)); }); html.push(&#8216;&#60;/table&#62;&#8217;, &#8216;&#60;/body&#62;&#8217;, &#8216;&#60;/html&#62;&#8217;); MailApp.sendEmail(email, &#8216;AdWords Account &#8216; + AdWordsApp.currentAccount().getCustomerId() + &#8216; Summary Report&#8217;, &#8221;, {htmlBody: html.join(&#8216;\n&#8217;)}); } function emailRow(title, column, yesterdayRow, twoDaysAgoRow, weekAgoRow) { var html = []; html.push(&#8216;&#60;tr&#62;&#8217;, &#8220;&#60;td style=&#8217;padding: 5px 10px&#8217;&#62;&#8221; + title + &#8216;&#60;/td&#62;&#8217;, &#8220;&#60;td style=&#8217;padding: 0px 10px&#8217;&#62;&#8221; + yesterdayRow[column] + &#8216;&#60;/td&#62;&#8217;, &#8220;&#60;td style=&#8217;padding: 0px 10px&#8217;&#62;&#8221; + twoDaysAgoRow[column] + formatChangeString(yesterdayRow[column], twoDaysAgoRow[column]) + &#8216;&#60;/td&#62;&#8217;, &#8220;&#60;td style=&#8217;padding: 0px 10px&#8217;&#62;&#8221; + weekAgoRow[column] + formatChangeString(yesterdayRow[column], weekAgoRow[column]) + &#8216;&#60;/td&#62;&#8217;, &#8216;&#60;/tr&#62;&#8217;); return html.join(&#8216;\n&#8217;); } function getReportRowForDate(date) { var timeZone = AdWordsApp.currentAccount().getTimeZone(); var dateString = Utilities.formatDate(date, timeZone, &#8216;yyyyMMdd&#8217;); return getReportRowForDuring(dateString + &#8216;,&#8217; + dateString); } function getReportRowForDuring(during) { var report = AdWordsApp.report( &#8216;SELECT &#8216; + REPORT_FIELDS .map(function(field) { return field.columnName; }) .join(&#8216;,&#8217;) + &#8216; FROM ACCOUNT_PERFORMANCE_REPORT &#8216; + &#8216;DURING &#8216; + during, REPORTING_OPTIONS); return report.rows().next(); } function formatChangeString(newValue, oldValue) { var x = newValue.indexOf(&#8216;%&#8217;); if (x != -1) { newValue = newValue.substring(0, x); var y = oldValue.indexOf(&#8216;%&#8217;); oldValue = oldValue.substring(0, y); } var change = parseFloat(newValue &#8211; oldValue).toFixed(2); var changeString = change; if (x</p>
<p>O post <a href="https://blog.rotamaxima.com/automacao-google-ads-relatorios/">Automação Google Ads: Como gerar relatórios</a> apareceu primeiro em <a href="https://blog.rotamaxima.com">Rotamáxima - Especialistas em resultados</a>.</p>
]]></description>
		
		
		
			</item>
		<item>
		<title>Automação Google Ads: Como programar alertas</title>
		<link>https://blog.rotamaxima.com/automacao-google-ads-alertas/</link>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Tue, 21 Aug 2018 20:49:37 +0000</pubDate>
				<category><![CDATA[Automação Google Ads]]></category>
		<category><![CDATA[Multiuse]]></category>
		<category><![CDATA[automação-google-ads]]></category>
		<guid isPermaLink="false">https://www.rotamaxima.com.br/?p=1781</guid>

					<description><![CDATA[<p>Nessa série especial, reunimos alguns scripts úteis para você automatizar e aumentar o retorno de suas campanhas no Google Ads. Confira abaixo como automatizar o Google Ads para “Programação de alertas especiais”. &#160; 1. Detector de Anomalias da Conta &#8211; Por Google Ads. O script do Google alerta por e-mail quando sua conta apresenta um comportamento muito diferente de seu histórico. Ele faz uma comparação com as estatísticas obtidas até o dia atual com o histórico das estatísticas em relação ao mesmo dia da semana. // Copyright 2017, Google Inc. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /** * @name Account Anomaly Detector * * @fileoverview The Account Anomaly Detector alerts the advertiser whenever an * advertiser account is suddenly behaving too differently from what's * historically observed. See * https://developers.google.com/adwords/scripts/docs/solutions/account-anomaly-detector * for more details. * * @author AdWords Scripts Team [adwords-scripts@googlegroups.com] * * @version 1.1 * * @changelog * - version 1.1.1 * - Fixed bug in handling of reports with 0 rows. * - version 1.1 * - Added conversions to tracked statistics. * - version 1.0.3 * - Improved code readability and comments. * - version 1.0.2 * - Added validation for external spreadsheet setup. * - Updated to use report version v201609. * - version 1.0.1 * - Improvements to time zone handling. * - version 1.0 * - Released initial version. */ var SPREADSHEET_URL = 'YOUR_SPREADSHEET_URL'; var DAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']; /** * Configuration to be used for running reports. */ var REPORTING_OPTIONS = { // Comment out the following line to default to the latest reporting version. apiVersion: 'v201705' }; function main() { Logger.log('Using spreadsheet - %s.', SPREADSHEET_URL); var spreadsheet = validateAndGetSpreadsheet(SPREADSHEET_URL); spreadsheet.setSpreadsheetTimeZone(AdWordsApp.currentAccount().getTimeZone()); var impressionsThreshold = parseField(spreadsheet. getRangeByName('impressions').getValue()); var clicksThreshold = parseField(spreadsheet.getRangeByName('clicks'). getValue()); var conversionsThreshold = parseField(spreadsheet.getRangeByName('conversions').getValue()); var costThreshold = parseField(spreadsheet.getRangeByName('cost').getValue()); var weeksStr = spreadsheet.getRangeByName('weeks').getValue(); var weeks = parseInt(weeksStr.substring(0, weeksStr.indexOf(' '))); var email = spreadsheet.getRangeByName('email').getValue(); var now = new Date(); // Basic reporting statistics are usually available with no more than a 3-hour // delay. var upTo = new Date(now.getTime() - 3 * 3600 * 1000); var upToHour = parseInt(getDateStringInTimeZone('h', upTo)); if (upToHour == 1) { // first run for the day, kill existing alerts spreadsheet.getRangeByName('clicks_alert').clearContent(); spreadsheet.getRangeByName('impressions_alert').clearContent(); spreadsheet.getRangeByName('conversions_alert').clearContent(); spreadsheet.getRangeByName('cost_alert').clearContent(); } var dateRangeToCheck = getDateStringInPast(0, upTo); var dateRangeToEnd = getDateStringInPast(1, upTo); var dateRangeToStart = getDateStringInPast(1 + weeks * 7, upTo); var fields = 'HourOfDay,DayOfWeek,Clicks,Impressions,Conversions,Cost'; var todayQuery = 'SELECT ' + fields + ' FROM ACCOUNT_PERFORMANCE_REPORT DURING ' + dateRangeToCheck + ',' + dateRangeToCheck; var pastQuery = 'SELECT ' + fields + ' FROM ACCOUNT_PERFORMANCE_REPORT WHERE DayOfWeek=' + DAYS[getDateStringInTimeZone('u', now)].toUpperCase() + ' DURING ' + dateRangeToStart + ',' + dateRangeToEnd; var todayStats = getReportStats(todayQuery, upToHour, 1); var pastStats = getReportStats(pastQuery, upToHour, weeks); var statsExist = true; if (typeof todayStats === 'undefined' &#124;&#124; typeof pastStats === 'undefined') { statsExist = false; } var alertText = []; if (statsExist &#38;&#38; impressionsThreshold &#38;&#38; todayStats.impressions &#60; pastStats.impressions * impressionsThreshold) { var ImpressionsAlert = ' Impressions are too low: ' + todayStats.impressions + ' impressions by ' + upToHour + ':00, expecting at least ' + parseInt(pastStats.impressions * impressionsThreshold); writeAlert(spreadsheet, 'impressions_alert', alertText, ImpressionsAlert, upToHour); } if (statsExist &#38;&#38; clicksThreshold &#38;&#38; todayStats.clicks &#60; pastStats.clicks * clicksThreshold) { var clickAlert = ' Clicks are too low: ' + todayStats.clicks + ' clicks by ' + upToHour + ':00, expecting at least ' + (pastStats.clicks * clicksThreshold).toFixed(1); writeAlert(spreadsheet, 'clicks_alert', alertText, clickAlert, upToHour); } if (statsExist &#38;&#38; conversionsThreshold &#38;&#38; todayStats.conversions &#60; pastStats.conversions * conversionsThreshold) { var conversionsAlert = ' Conversions are too low: ' + todayStats.conversions + ' conversions by ' + upToHour + ':00, expecting at least ' + (pastStats.conversions * conversionsThreshold).toFixed(1); writeAlert( spreadsheet, 'conversions_alert', alertText, conversionsAlert, upToHour); } if (statsExist &#38;&#38; costThreshold &#38;&#38; todayStats.cost &#62; pastStats.cost * costThreshold) { var costAlert = ' Cost is too high: ' + todayStats.cost + ' ' + AdWordsApp.currentAccount().getCurrencyCode() + ' by ' + upToHour + ':00, expecting at most ' + (pastStats.cost * costThreshold).toFixed(2); writeAlert(spreadsheet, 'cost_alert', alertText, costAlert, upToHour); } if (alertText.length &#62; 0 &#38;&#38; email &#38;&#38; email.length &#62; 0) { MailApp.sendEmail(email, 'AdWords Account ' + AdWordsApp.currentAccount().getCustomerId() + ' misbehaved.', 'Your account ' + AdWordsApp.currentAccount().getCustomerId() + ' is not performing as expected today: \n\n' + alertText.join('\n') + '\n\nLog into AdWords and take a look.\n\nAlerts dashboard: ' + SPREADSHEET_URL); } writeDataToSpreadsheet(spreadsheet, now, statsExist, todayStats, pastStats, AdWordsApp.currentAccount().getCustomerId()); } function toFloat(value) { value = value.toString().replace(/,/g, ''); return parseFloat(value); } function parseField(value) { if (value == 'No alert') { return null; } else { return toFloat(value); } } /** * Runs an AdWords report query for a number of weeks and return the average * values for the stats. * * @param {string} query The formatted report query. * @param {int} hours The limit hour of day for considering the report rows. * @param {int} weeks The number of weeks for the past stats. * @return {Object} An object containing the average values for the stats. */ function getReportStats(query, hours, weeks) { var reportRows = []; var report = AdWordsApp.report(query, REPORTING_OPTIONS); var rows = report.rows(); while (rows.hasNext()) { reportRows.push(rows.next()); } return accumulateRows(reportRows, hours, weeks); } function accumulateRows(rows, hours, weeks) { var result = {clicks: 0, impressions: 0, conversions: 0, cost: 0}; for (var i = 0; i &#60; rows.length; i++) { var row = rows[i]; var hour = row['HourOfDay']; if (hour &#60; hours) { result = addRow(row, result, 1 / weeks); } } return result; } function addRow(row, previous, coefficient) { if (!coefficient) { coefficient = 1; } if (row == null) { row = {Clicks: 0,</p>
<p>O post <a href="https://blog.rotamaxima.com/automacao-google-ads-alertas/">Automação Google Ads: Como programar alertas</a> apareceu primeiro em <a href="https://blog.rotamaxima.com">Rotamáxima - Especialistas em resultados</a>.</p>
]]></description>
		
		
		
			</item>
	</channel>
</rss>
