<?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>Arquivos automação-google-ads - Rotamáxima - Especialistas em resultados</title>
	<atom:link href="https://blog.rotamaxima.com/tag/automacao-google-ads/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.rotamaxima.com/tag/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>Arquivos automação-google-ads - Rotamáxima - Especialistas em resultados</title>
	<link>https://blog.rotamaxima.com/tag/automacao-google-ads/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Inteligência Artificial ajuda, mas é insuficiente para manter os resultados das campanhas PPC</title>
		<link>https://blog.rotamaxima.com/inteligencia-artificial-ajuda-mas-e-insuficiente-para-manter-os-resultados-das-campanhas-ppc/</link>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Wed, 25 Sep 2019 18:46:56 +0000</pubDate>
				<category><![CDATA[Insights]]></category>
		<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[automação-google-ads]]></category>
		<category><![CDATA[google-ads]]></category>
		<guid isPermaLink="false">https://www.rotamaxima.com.br/?p=5550</guid>

					<description><![CDATA[<p>É de conhecimento do mercado que ferramentas como Opteo, Optmyzr, Adcore, entre outras, facilitam o trabalho de gestão de campanhas PPC. Elas utilizam aprendizado de máquina e monitoram pontos importantes como consumo de saldo, competitividade dos lances, além de problemas críticos da conta, como anúncios que não estão performando bem, ou quando há algum problema com o link para a página de destino. Com a promessa de monitorar e agrupar estatisticamente padrões vencedores no desempenho das contas, a ferramenta Opteo, por exemplo, faz sugestões de melhorias em tempo real, além de oferecer otimização de lances, detecção de erros na Landing Page (mais especificamente com relação à sua disponibilidade), análise dos termos e testes de anúncios. Nós utilizamos a ferramenta no dia-a-dia e pudemos observar que ela ajuda bastante a monitorar volumes altos de palavras-chaves, mas, oferece pouco valor agregado no que diz respeito a estratégia core das contas. O Opteo, assim como outras ferramentas de automação, ainda não conseguem entender completamente o contexto das palavras-chaves, uma vez que analisam apenas os pontos indicativos numéricos da performance. Isso pode levar a interpretações equivocadas já que uma palavra pode ter mais conversões (indicativo número), mas no final das contas trazem leads não qualificados (indicativo qualitativo ao qual a ferramenta, por padrão, não tem acesso). É interessante notar que ainda hoje &#8220;2019&#8221;, apesar de todo o acesso tecnológico de empresas como Google e Apple, o processo de aprovação de anúncios do Google, por exemplo, ainda aconteça de forma manual. O mesmo acontece com os aplicativos submetidos para aprovação na Apple Store. Veja bem, ambas as situações dispõe de regras claras e definidas quanto aos requisitos e políticas, mas apesar de toda a tecnologia de inteligencia artificial dessas empresas, ambas ainda preferem que esse tipo de análise seja feita por pessoas. Razões do descompasso Razões Humanas Em um artigo publicado em 2018 pelo site da Havard Business Review, Thomas DavenPort e Randy Bean trazem a ideia de que &#8220;Grandes companhias estão abraçando a análise de dados, mas ainda continuam não tendo uma cultura Data-Drive&#8221;. Uma pesquisa conduzida anualmente pela &#8220;New Vantage Partners&#8221; reporta a percepção de urgência na necessidade em se fazer uso efetivo de dados nas organizações. A grande preocupação para grandes organizações envolvidas na pesquisa é justamente a capacidade de &#8220;novos entrantes&#8221;, startups, serem capazes de tirar maior proveito de tecnologias como bigdata, gerando novas disrupções. Embora muitas startups já estejam sendo construídas a partir de uma perspectiva baseada na extração de valor das tecnologias de bigData e AI (inteligência Artificial), a pesquisa releva que a velocidade na qual grandes organizações estão se movimentando para a cultura de dados é lenta. Apenas 1/3 das empresas pesquisadas reportaram terem sido bem sucedidas nesse sentido. Ou seja, há mais empolgação do que ação e adoção dessas tecnologias, especialmente, e contra intuitivamente, em grandes organizações. Razões TecnológicasSe por um lado empresas como Accenture já estão eliminando empregos (40 mil para ser mais preciso) com tecnologias que literalmente &#8220;automatizam a automação&#8221;, o terceiro lado da moeda,é o fato de que as máquinas são programadas para executar e melhorar processos de decisão para tarefas especifica em contextos pré-determinados. A precarização do trabalho, por exemplo, proporcionada pelo leilão reverso agressivo de algumas plataformas, deve ser visto como uma decisão humana, não simples efeito colateral da tecnologia em si. Inteligência artificial não decide esse tipo de coisa. Computadores não entendem (pelo menos ainda não).O Gmail lançou um recurso, anos atrás, chamado &#8220;Smart Reply&#8221;. Uma das habilidades da ferramenta era sugerir respostas dependendo do contexto da mensagem. Porém, era muito comum obter-se outputs como &#8220;Eu Te Amo&#8221; para diferentes tipos de e-mail, incluindo os corporativos. A exemplo do G-mail, podemos pressupor que no estágio atual, o machine learning é capaz de reconhecer um cachorro em uma imagem, mas não entende o que é um cachorro, e mais, dependendo do treinamento, não consegue nem ao menos diferenciar um gato de um cachorro. O viés do aprendizado de máquina. Quando você cria uma campanha no Facebook e vê uma mensagem dizendo: Campanha em aprendizado. Você acredita que: A &#8211; A campanha está em aprendizado para gerar mais dinheiro para você. B &#8211; A campanha está em aprendizado para gerar mais dinheiro para você e para o TIO Mark ? C &#8211; A campanha está em aprendizado para gerar mais dinheiro para o TIO Mark ? Independente de sua resposta, considere que: 1 &#8211; Existe um viés sistêmico.2 &#8211; Se essa tecnologia é padrão e acessível para todos anunciantes, então estão todos nivelados, portanto, não há vantagem competitiva para nenhum deles. Então esse negócio de AI não serve pra nada ? Muito pelo contrário. A tecnologia tem evoluído muito e pode ser aplicada com grande valor no contexto do marketing digital. Como o título deste artigo sugere. A AI ainda não dá conta do recado por si só. Mas isso não significa que ela não seja útil. Alguns exemplos práticos de utilização: 1 Ela consegue analisar de forma sistemática, centenas de pontos chaves do seu site e entregar, em escala, experiencias personalizadas para seus consumidores. Ela pode ajudar a determinar o engajamento de um usuário com o conteúdo. Algoritmos de aprendizagem podem identificar consumidores desengajados e ajudar a determinar as fontes de tráfego versus elementos da sua página geram maior ou menor engajamento. Os algoritmos podem analisar milhões pode pontos de dados (tarefa impossível para os humanos), como por exemplo: 1 Geolocalização2 Pontos de interação com o site3 Referências de tráfego4 Fatores psicológicos5 Comportamentos de compra6 Entre outros&#8230; Conclusão Machine Learning, AI, Bigdata são tecnologias fantásticas e a sua adoção tem sido inevitável. Elas potencializam as capacidades humanas embora estejam longe de ser solução para todos os problemas de uma campanha de marketing digital, quem dirá para os gigantescos problemas dos nossos tempos.</p>
<p>O post <a href="https://blog.rotamaxima.com/inteligencia-artificial-ajuda-mas-e-insuficiente-para-manter-os-resultados-das-campanhas-ppc/">Inteligência Artificial ajuda, mas é insuficiente para manter os resultados das campanhas PPC</a> apareceu primeiro em <a href="https://blog.rotamaxima.com">Rotamáxima - Especialistas em resultados</a>.</p>
]]></description>
		
		
		
			</item>
		<item>
		<title>Descubra como o Google Data Studio pode aumentar a sua produtividade.</title>
		<link>https://blog.rotamaxima.com/descubra-como-o-google-data-studio-pode-aumentar-a-sua-produtividade/</link>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Wed, 18 Sep 2019 13:00:39 +0000</pubDate>
				<category><![CDATA[Multiuse]]></category>
		<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[automação-google-ads]]></category>
		<category><![CDATA[google-ads]]></category>
		<guid isPermaLink="false">https://www.rotamaxima.com.br/?p=5514</guid>

					<description><![CDATA[<p>O Google Data Studio é uma ferramenta criada pelo Google em meados de 2 de junho de 2016, com o objetivo de facilitar a integração e agrupamento de dados com diferentes fontes, tais como: Google Analytics, Planilhas Excel, Google Ads, bancos de dados e conectores que permitem obter informações de uma infinidade de locais. Para se ter uma ideia do potencial do Google Data Studio, é possível até mesmo, através de conectores, obter dados de campanhas rodando no Facebook e outras redes sociais. Com isso você consegue criar, de forma relativamente automatizada, gerar relatórios completos, com profundidade e precisão de dados sobre diferentes ângulos e aspectos de suas campanhas. Se você ainda não usa o Google Data Studio para monitorar os Kpis de suas campanhas, fique com a gente e descubra: Por que é importante considerá-lo como uma opção de ferramenta ? Como funciona ? Conexões gratuitas Conexões pagas Mãos na massa, como botar o Data Studio para rodar Por que é importante considerá-lo como uma opção de ferramenta ? Com a evolução das startups, a quantidade de ferramentas que oferecem recursos similares é praticamente infinita. De acordo com o site chiefmartec.com, em maio de 2017 o total de ferramentas catalogado era de aproximadamente 5000 e esse número continua crescendo exponencialmente. Com base nisso 2 movimentos importantes são observados no mercado. De um lado os maiores players tentam agrupar funcionalidades com a promessa de oferecer soluções “tudo em um” ou “plug and play”. Embora a cada dia surjam necessidades especificas para os desafios de integração de dados, ou até mesmo propagação de anúncios, empresas como Hubspot e RDstation têm se destacado bastante nessa perspectiva de facilitar o dia a dia dos empreendedores e profissionais de marketing. O outro lado da moeda é que o Google também está em sintonia com as demandas cada vez mais complexas do universo que rodeia seu core business, mais especificamente as campanhas de PPC. Com isso, ferramentas de alto nível são oferecidas gratuitamente como forma de potencializar o retorno de seus anunciantes. Entre essas ferramentas estão o Google Analytics, Google Trends e o próprio Google Data Studio, entre uma infinidade de outras. Por ser gratuita e permitir uma série de cruzamento de fontes de dados, o Google Data Studio é uma ótima opção para aqueles que querem desenvolver relatórios mais elaborados e com profundidade de informações, coletadas e agrupadas automaticamente e em tempo real. Como funciona ? Para ajudá-lo a entender o Google Data Studio de forma prática, iremos criar juntos um gráfico que traz informações de uma campanha do Google Ads e também do Google Analytics. Com base nesses conceitos básicos explore sua criatividade e ajuste o relatório de acordo com as necessidades do seu negócio. A primeira tela após você se logar em https://datastudio.google.com será semelhante à abaixo: Clique em relatório em branco. O primeiro passo a se seguir é criar uma nova fonte de dados. Lembre-se de que o Google Data Studio apenas captura e integra informações, mas não gera por si só nenhum tipo de dado. As fontes de informação mais comuns que podem ser utilizadas no Google Data Studio são: Conexões gratuitas Google Ads Google Analytics Google Spredsheet Banco de dados Mysql Youtube Analytics Conexões pagas Facebook Ads (Supermetrics) Zapier Semrush Domain Analytics Custom JSON/CSV/XML (Supermetrics) Criteo DynAd &#8211; UOL Linkedin Ads (Power My Analytics) Pinterest Para este exemplo iremos seguir com a fonte Google Ads como forma de obtenção de dados. Clique em &#8220;Criar nova fonte de dados&#8221;, no canto direito inferior da tela. Em seguida selecione a fonte de dados &#8220;Google ads&#8221;. Selecione a conta Google Ads que deseja vincular. Após conectar a fonte de dados, serão fornecidos os diferentes parâmetros que podem ser conectados, como por exemplo: Cliques, custo médio, conversões, etc&#8230; Clique então em &#8220;Adicionar ao relatório&#8221; localizado no canto superior direito. Beleza! Os dados já estão disponíveis para uso no relatório. Vamos adicionar um gráfico que traz o CTR das campanhas. Clique em adicionar gráfico e em seguida mini gráfico. E&#8230;. A mágica acontece. O Google Data Studio põe na tela um desenho digno de uma criança de 2 anos 🙂 Se você chegou até aqui &#8220;Parabéns&#8221;. Com certeza você não é Joseph Climber, mas tem bastante perseverança. Criando sentido aos dados. Agora que você selecionou a fonte de dados do Google, será necessário criar um contexto para a informação que é exibida. No exemplo a seguir iremos trazer a informação de CTR, ou seja, o percentual de cliques do anúncio em relação ao total de vezes em que ele foi exibido. Selecione o gráfico recém criado, no canto direito, adicione o parâmetro CTR. Até esse ponto os dados reais do Google Ads já estão sendo carregados para o Google Data Studio. Vamos então adicionar a legenda e os rótulos. Para tal, clique na Guia Estilo e habilite a opção &#8220;Mostrar rótulos&#8221;. Agora que você conhece o básico, poderá combinar diferentes informações de acordo com a sua necessidade. Explore as opções estéticas da ferramenta e divirta-se.</p>
<p>O post <a href="https://blog.rotamaxima.com/descubra-como-o-google-data-studio-pode-aumentar-a-sua-produtividade/">Descubra como o Google Data Studio pode aumentar a sua produtividade.</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: 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>
	</channel>
</rss>
