Como usar datas e horários

Os scripts do Google Ads geralmente precisam trabalhar com datas e horários. Casos de uso comuns incluem recuperação de relatórios para um período específico, programação de campanhas ou a veiculação de grupos de anúncios em horários específicos e a saída em uma planilha o script foi executado pela última vez. Este guia descreve conceitos importantes, armadilhas comuns e recomendadas ao trabalhar com datas e horas no Google Ads scripts.

Conceitos básicos

Para trabalhar com datas e horários nos scripts do Google Ads, use o objeto de data integrado JavaScript. Um objeto de data JavaScript representa um momento particular no tempo. Existem vários modos de criar um novo objeto de data:

// Create a date object for the current date and time.
const now = new Date();

// Create a date object for a past date and time using a formatted string.
const date = new Date('February 17, 2021 13:00:00 -0500');

// Create a copy of an existing date object.
let copy = new Date(date);

Os novos usuários de scripts geralmente ficam confusos com o modo como os objetos de data lidam com os fusos horários. Um maneira natural, mas incorreta, de pensar em um objeto de data é como o tempo em um em um único fuso horário. Por exemplo, no snippet acima, alguns usuários presume erroneamente que date é válido apenas em um fuso horário, ou seja, fuso horário com uma diferença de -5 horas usada para criá-lo. Naquele visualização, date precisaria ser "convertido" sejam usados em outros fusos horários.

O modo correto de ver um objeto de data é como um momento particular no tempo independente de qualquer fuso horário. Embora um determinado horário seja mostrado de forma diferente nos relógios de diferentes fusos horários, é o mesmo momento. Para exemplo, considere este snippet:

// Create two date objects with different times and timezone offsets.
const date1 = new Date('February 17, 2021 13:00:00 -0500');
const date2 = new Date('February 17, 2021 10:00:00 -0800');

// getTime() returns the number of milliseconds since the beginning of
// January 1, 1970 UTC.
// True, as the dates represent the same moment in time.
console.log(date1.getTime() == date2.getTime());

// False, as the dates are separate objects, though they happen to
// represent the same moment in time.
console.log(date1 == date2);

Como um objeto de data representa um momento particular no tempo, ele não precisa ser "convertido" em diferentes fusos horários. Pelo contrário, ele pode ser processado como uma string formatada para um fuso horário específico.

Para renderizar uma data como uma string com um formato e fuso horário específicos, use Utilities.formatDate(date, timeZone, format) Exemplo:

const date = new Date('February 17, 2021 13:00:00 -0500');

// February 17, 2021 13:00:00 -0500
console.log(Utilities.formatDate(date, 'America/New_York', 'MMMM dd, yyyy HH:mm:ss Z'));

// February 17, 2021 10:00:00 -0800
console.log(Utilities.formatDate(date, 'America/Los_Angeles', 'MMMM dd, yyyy HH:mm:ss Z'));

// 2021-02-17T18:00:00.000Z
console.log(Utilities.formatDate(date, 'Etc/GMT', 'yyyy-MM-dd\'T\'HH:mm:ss.SSS\'Z\''));

Estes exemplos especificaram o fuso horário diretamente usando um timezone ID. Para recuperar o fuso horário associado à conta do Google Ads que executa seu script, use AdsApp.currentAccount().getTimeZone()

Armadilhas comuns

Fuso horário padrão ao registrar um objeto de data

Ao registrar um objeto de data diretamente usando Logger.log(), ele é renderizado usando formato e fuso horário padrão. Exemplo:

const date = new Date('February 17, 2021 13:00:00 -0500');

// Wed Feb 17 10:00:00 GMT-08:00 2021
console.log(date);

O fuso horário padrão é o dos Estados Unidos/Los Angeles (horário do Pacífico), independentemente do fuso horário associado à conta do Google Ads. Se você quiser renderizar o objeto de data como uma string usando um formato e fuso horário personalizados para registro ou para outros fins, sempre use Utilities.formatDate(date, timeZone, format).

Fuso horário padrão ao criar um objeto de data

Ao criar um objeto de data usando uma string que não fornece um fuso horário deslocamento, o fuso horário será definido como América/Los_Angeles (horário do Pacífico), independentemente do fuso horário associado à conta do Google Ads. Por exemplo:

// Create a date without specifying the timezone offset.
const date = new Date('February 17, 2021 13:00:00');

// Wed Feb 17 13:00:00 GMT-08:00 2021
console.log(date);

Ao criar um objeto de data usando uma string, sempre inclua um deslocamento de fuso horário para certifique-se de que o objeto de data represente o momento no tempo que você realmente deseja.

Fuso horário padrão nos métodos do objeto de data

Os objetos de data JavaScript têm vários métodos que assumem um fuso horário padrão, como:

  • getFullYear()
  • getMonth()
  • getDate()
  • getDay()
  • getHours()
  • getMinutes()

Isso também inclui o tempo de set___() equivalentes (por exemplo, setMonth()) e getTimezoneOffset().

Nos scripts do Google Ads, o fuso horário padrão é Estados Unidos/Los_Angeles (Pacífico). independentemente do fuso horário associado à conta do Google Ads. Portanto, a menos que sua conta do Google Ads esteja nesse fuso horário, você deve geralmente evitam o uso desses métodos.

Para obter o ano, mês, data, dia, horas ou minutos de um objeto de data em seu fuso horário da conta, use Utilities.formatDate(date, timeZone, format) com um formato especificando a parte da data ou hora desejada e use AdsApp.currentAccount().getTimeZone() para obter o fuso horário da sua conta.

Criação de um objeto de data a partir de uma string de data formatada

Você pode criar um objeto de data transmitindo uma string de data formatada para o criador de datas. Por exemplo:

const date = new Date('February 17, 2021 13:00:00 -0500');

O criador é capaz de analisar apenas determinados formatos de strings de data. Para garantir que seus string de data for analisada corretamente, sempre forneça-a no formato MMMM dd, yyyy HH:mm:ss Z.

Por exemplo, para criar um objeto de data para o meio-dia de hoje na conta fuso horário:

const now = new Date();
const timeZone = AdsApp.currentAccount().getTimeZone();
const noonString = Utilities.formatDate(now, timeZone, 'MMMM dd, yyyy 12:00:00 Z');
const noon = new Date(noonString);

Não use o "z" padrão para criar strings de data que serão transmitidas para uma string construtor, pois o construtor nem sempre poderá analisá-lo. Usar apenas o "Z" padrão

Operações matemáticas da data

Alguns scripts precisam realizar operações matemáticas simples com as datas, como encontrar uma data X dias antes ou depois de outra data. Ao fazer operações matemáticas de data, use getTime(). Chamar getTime() em um objeto de data retorna o número de milissegundos desde no início de 1o de janeiro de 1970 UTC. É possível fazer cálculos com esse valor e aplique o novo valor a um objeto de data usando setTime() ou fornecendo-o como um ao criar um novo objeto de data.

Exemplo:

const MILLIS_PER_DAY = 1000 * 60 * 60 * 24;
const now = new Date();
const yesterday = new Date(now.getTime() - MILLIS_PER_DAY);

Neste exemplo, yesterday corresponde a exatamente 24 horas atrás.

Relatórios

Ao recuperar um relatório usando AdsApp.search(), a consulta do GAQL exige que as datas sejam especificadas. no formato yyyy-MM-dd (por exemplo, 2021-06-30 seria 30 de junho de 2021).

Da mesma forma, o método getStatsFor(), disponível em muitos scripts do Google Ads, Os objetos exigem que as datas sejam especificadas no mesmo formato. Usar Utilities.formatDate(date, timeZone, format) para formatar um objeto de data neste formato.

Por exemplo, para recuperar um relatório com informações de um a três dias atrás:

const MILLIS_PER_DAY = 1000 * 60 * 60 * 24;
const now = new Date();
const from = new Date(now.getTime() - 3 * MILLIS_PER_DAY);
const to = new Date(now.getTime() - 1 * MILLIS_PER_DAY);

const timeZone = AdsApp.currentAccount().getTimeZone();
const results = AdsApp.search(
  'SELECT campaign.name, metrics.clicks' +
  'FROM campaign ' +
  'WHERE segments.date BETWEEN ' +
    Utilities.formatDate(from, timeZone, 'yyyy-MM-dd') + ' AND ' +
    Utilities.formatDate(to, timeZone, 'yyyy-MM-dd'));

Planilhas

Geralmente, os scripts do Google Ads gravam os resultados em uma planilha, incluindo os objetos de data. Quando você define uma célula em uma planilha por meio de um objeto de data, o fuso horário da planilha é usado para interpretar essa data. Por exemplo, suponha tiver uma planilha cujo fuso horário esteja definido para o horário do Pacífico:

// Suppose today is February 17, 2021 13:00:00 -0500 (Eastern Time)
const now = new Date();
spreadsheet.getRange('A1').setValue(now);

O valor em A1 será 17-fev-21 10:00:00.

Para garantir a gravação dos objetos de data na planilha conforme esperado, defina o fuso horário da planilha de modo que ele coincida com o fuso horário da sua conta do Google Ads:

spreadsheet.setSpreadsheetTimeZone(AdsApp.currentAccount().getTimeZone());

Você também pode definir o horário de uma planilha manualmente.